0

私はこのファイルを持っていて、それを構造体の配列としてcに入力します。ただし、構造体メンバーを関数に渡す際に問題があります。エラー: ポインターまたは配列値でさえ、行 58 の添え字には含まれていません。私は C の初心者で、この問題に 1 週​​間悩まされています。

コード:

#include <stdio.h>
#include <math.h>
#define SIZE 100

typedef struct list{
  int counter;
  int year;
  double maxrain;
  double rank;
} data;

double avg (struct list s, int count);

int main()
{
  data a[SIZE];
  struct list s;
  double sum = 0;
  int totalFile = 1;        // according to number of csv file
  int z, i;
  char fName[16];
  FILE*fpt;

  double mean;

  /* reading multiple file */
  for (z=1; z<=totalFile; z++)
  {
    sprintf(fName," ",z);
    fpt = fopen(fName,"r");

    if(fpt == NULL){
      printf("Error opening %s\n",fName);
      return(-1);
    }

    printf("---Reading from file %d---\n", z);
    sum = 0;
    i = 0;
    while(i <= SIZE && fscanf(fpt, "%d%*c%d%*c%f%*c%f", &a[i].counter, &a[i].year, &a[i].maxrain, &a[i].rank) != EOF){
      sum = sum + a[i].maxrain;
      i++;  
    }
    mean = avg(a[i].maxrain, i);
    printf("%f", mean);

    return 0;
  }
}

double avg(struct list s , int count)
{
  double ave;
  int i = 0;

  for(i=0; i<count; add += s.maxrain[i++]);
  ave = add/count;

  return ave;
}
4

2 に答える 2

5

ここには、考えられる警告の最大数をコンパイラーに通知するように指示した場合に、コンパイラーによって指摘されたであろういくつかの問題があります。gcc の場合、これを行うためのオプションは次のとおり-Wall -Wextra -pedanticです。

しかし、問題の詳細については次のとおりです。

ここ

sprintf(fName, " ", z);

変換指定子がありません。コードは次のようになります。

sprintf(fName, "%d", z);

また、宛先「文字列」をオーバーフローする可能性があるため、sprintf()は保存されません。snprintf()代わりに使用してください:

snprintf(fName, "%d", sizeof(fName), z);

次のスキャン コマンドは%f、予想される float を使用していますdoubleが、渡されています。

fscanf(fpt, "%d%*c%d%*c%f%*c%f", &a[i].counter, &a[i].year, &a[i].maxrain, &a[i].rank)

%lfdouble をスキャンするために使用します。

fscanf(fpt, "%d%*c%d%*c%lf%*c%lf", &a[i].counter, &a[i].year, &a[i].maxrain, &a[i].rank)

これ

mean = avg(a[i].maxrain, i);

する必要があります

mean = avg(a[i], i);

そして最後に の宣言/定義が にaddありませんavg()


配列インデックスとしてサーバーに変数を宣言する際の注意事項:

配列インデックスは常に正であるため、これに符号付き変数を使用しても意味がありません。

また、いずれかの整数型の幅が不明なため、メモリのアドレス指定に every を使用するのは得策ではありません。配列要素 (およびこのメモリ) をアドレス指定するときに保存側にとどまるにはsize_t、 C 標準によって、マシンのすべてのメモリ (およびこれを使用して可能な最大配列要素) をアドレス指定するのに十分な幅の符号なし整数であることが保証されている を使用します。

于 2013-11-08T07:37:23.083 に答える
0

1. 構造体の要素を関数に渡す:

main() {
    struct list data = {1, 2, 3, 4};
    avg(data.counter, data.year, data.maxrain, data.rank, 5);
}

double avg(int counter, int year, double maxrain, double rank, int count) {
    //    
}

2.構造体を関数に渡す

main() {
    struct list data = {1, 2, 3, 4};
    avg(data, 5);
}

double avg(struct list s , int count) {
    //    
}

3.構造体のアドレスをポインタで関数に渡す

main() {
    struct list data = {1, 2, 3, 4};
    avg(&data, 5);
}

double avg(struct list *s , int count) {
    //    
}
于 2013-11-08T08:47:03.223 に答える