1

配列のランダムな N 部分を合計できるように、2D 配列の少なくとも 1 つのインデックスをシャッフルしようとしています。プログラムは、シャッフル関数を呼び出そうとするまで正常に動作し、次の 2 つの方法のいずれかになります: 関数を呼び出すと: shuffle(a[i], N); 0 による除算が見つからないか、関数 shuffle(*a, N); を呼び出すと、セグメンテーション違反が発生します。私はまだポインターがどのように機能するかを学ぼうとしています..誰か助けてもらえますか? ありがとうございました!

シャッフル機能:

void shuffle(double *a, int i)
{
  int temp, randomNum, N;
  for(i=N; i>1; N--)
     {
        randomNum = rand() % N;
        temp = a[randomNum];   //create temp array
        a[randomNum] = a[i];     
        a[i] = temp; 
      }
}

メインプログラム:

int main()
{

  srand(time(NULL));

  int i,j;
  int M = 5;
  int N = 4;
  double sum = 0.;

  double **a;
  a  = malloc(M * sizeof(double *));

  if(a == NULL) printf("Failure to allocate memory.\n");

  clock_t start = clock();
  for(i=1; i<M; i++)
    {
      a[i] = malloc(M * sizeof(double));
      if( a[i] == NULL)
    {
      printf("Failed to allocated memory for a[%d].\n", i);
      exit(0);
    }
    }

   for(i=1; i<M; i++)
     {
       for(j=1; j<M; j++)
    {
      a[i][j] = 1.0/(i+j);
      printf("a[%d][%d]=%lf\n", i, j, a[i][j]);
      shuffle(a[i], N);
      //sum = sum + a[i][j];
      //printf("shuffleda[%d][%d] and sum = %lf\n", i, j, sum);   
    }
     }

   clock_t end = clock();
   float seconds = (end - start) / (float) CLOCKS_PER_SEC;

   printf("%lf \n", sum);

  return(0);
}
4

1 に答える 1