0

私のプログラムは、入力ファイルから値 (整数と浮動小数点数) を読み取る必要があります。タブで区切られた 1 行に多くの値があり、ファイルには多くの行があります。ファイル全体を 1 行ずつ読み取り、各行を解析し、コンテンツ全体を 2 次元の静的配列で構成される構造に格納することを計画しました。次に、全体がメモリに保存されたら、計算を行い、結果を別の構造体に入力し、最後にその構造体の内容を出力ファイルにダンプします。もちろん動作しません。プログラムを実行しようとすると、セグメンテーション違反エラーが発生します。

これは、入力構造を定義する方法です。

#define sim_spectrum_constant 122
#define real_spectrum_constant 181
#define num_days 365

  struct spectrum {
    int year[sim_spectrum_constant][num_days];
    int month[sim_spectrum_constant][num_days];
    int day[sim_spectrum_constant][num_days];
    int hour[sim_spectrum_constant][num_days];
    int minute[sim_spectrum_constant][num_days];
    int second[sim_spectrum_constant][num_days];
    float wavelength[sim_spectrum_constant][num_days];
    float irr_total[sim_spectrum_constant][num_days];
    float irr_direct[sim_spectrum_constant][num_days];
    float irr_diffuse[sim_spectrum_constant][num_days];
  };

  struct spectrum pS;

これは、配列を初期化する方法です。

// initialization
  for (i=0; i<sim_spectrum_constant; i++) {
    for (j=0; j<num_days; i++) {
      pS.year[i][j] = 0;
      pS.month[i][j] = 0;
      pS.day[i][j] = 0;
      pS.hour[i][j] = 0;
      pS.minute[i][j] = 0;
      pS.second[i][j] = 0;
      pS.wavelength[i][j] = 0.;
      pS.irr_total[i][j] = 0.;
      pS.irr_direct[i][j] = 0.;
      pS.irr_diffuse[i][j] = 0.;
    }
  }

これは、入力ファイルから値を読み取る方法です。

// determining how many simulated spectrums are provided in the file + reading spectrums into the array
  row = 0;
  n = 0;
  if (fgets(line, sizeof(line), pInput_spektrum) == NULL) {
    printf ("****Simulated spectrum doesn't contain any entries!! -- %s\nPress <enter> to exit...\n", strerror(errno));
    getchar();
    exit(-1);
  }

  while(fgets(line, sizeof(line), pInput_spektrum) != NULL) {
    result=sscanf(line, "%i %i %i %i %i %i %f %f %f %f", pS.year[row][n], pS.month[row][n], pS.day[row][n], pS.hour[row][n], pS.minute[row][n], pS.second[row][n], pS.wavelength[row][n], pS.irr_total[row][n], pS.irr_direct[row][n], pS.irr_diffuse[row][n]);
    row ++;
    if (row == sim_spectrum_constant) {
      n ++;
      last_row = row;
      row = 0;
    } 
  }

アイデア、実装、またはその両方で失敗していますか? セグメンテーション違反の原因は何ですか?

ありがとう!

4

1 に答える 1

0

返されるものを評価していないようです。sscanf解析した引数の数を返すので、チェックすると便利です。通常、戻り値をチェックすることは良いことです

また、固定次元の固定配列がある場合は、n などの境界が大きくなりすぎないようにチェックする必要があります。n>=num_days入力データは私たちプログラマーをよく驚かせます - 悪い意味で。

あなたの構造体は非常に複雑に見えます。構造体のアイデアは物事をよりシンプルでより整理することですが、すべてをダンプするある種のモノリス変数として扱います。たとえば、日付が1つの構造体である可能性があり、で始まるメンバーirr_xxxも構造体の候補のように見えるなど、その内部にさらに多くの構造体を持つことを検討する必要があります。

例えば

struct irr
{
  float total;
  float direct;
  float diffuse;
};
于 2013-05-11T18:41:08.790 に答える