配列のランダムな 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);
}