-5

ラボからのデータを分析できるように、これを実行する必要があります。ただし、プログラムを実行して「n」の値を入力すると、単純にクラッシュします。これを修正する方法に関するヒントはありますか?

ありがとう、コードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


int main()
{
  FILE *magfield;
  FILE *means;
  FILE *variances;
  double *mean;
  double *variance;
  double field[12000];
  double time[12000];
  double sum=0, squares=0;
  int i, j=0, k=0, l=0, n=0;
  magfield=fopen("C:\\Users\\Owner\\Documents\\Homework\\ILab\\magneticfield.txt","r");
  means=fopen("C:\\Users\\Owner\\Documents\\Homework\\ILab\\means.txt","w");
  variances=fopen("C:\\Users\\Owner\\Documents\\Homework\\ILab\\variances.txt","w");

  for (i=0;i<12000;i++)
  {
       fscanf(magfield,"%f %f", &time[i], &field[i]);
       //printf("%f %f\n", time[i], field[i]);
  }

  printf("How many data points would you like to be analyzed at a time?\n");
  scanf("%i", &n);

  mean=(double*)calloc(n,sizeof(double));
  variance=(double*)calloc(n,sizeof(double));

  for (i=0;i<12000;i+=n)
  {
      for(j=i;j<n;j++)
      {
          sum+=field[j];
          squares+=field[j]*field[j];
      }
      mean[k]=sum/n;
      variance[k]=squares/n-(mean[k]*mean[k]);
      fprintf(means,"%f\n", mean[k]);
      fprintf(variances,"%f\n", variance[k]);
      sum=0;
      squares=0;
      k++;
  }
  free(mean);
  free(variance);
  printf("Press enter to continue...\n");
  getch();  
  return 0;
}
4

2 に答える 2

1

meanvariance配列のサイズが間違っています。サイズの要素になるようにそれらを割り当てnますが、外側のループがあります。

for (i = 0; i < 12000; i += n)
{
    ...
    mean[k] = sum/n;
    variance[k] = squares/n - (mean[k]*mean[k]);
    ...
    k++;
}

ループの本体は12000/n回数を実行しn、(110) の平方根よりも小さい場合は 2回12000以上のn反復kが発生するため、両方の配列の末尾を超える境界外アクセスが発生するほど大きくなります。

まったく別の通知では、内側のループは正しくないようです。おそらく次のようになります。

for (j = i; j < i+n; j++)
{
   sum += field[j];
   squares += field[j]*field[j];
}

(また、 がi+nよりも大きくならないようにする必要があります12000)

于 2013-02-20T08:47:54.707 に答える