我有这个文件,并在c中作为结构数组输入。
但是,我在将结构成员传递给函数时遇到问题。
错误:第58行的下标中甚至没有指针或数组值。
我是c区的新手,一个星期都没解决这个问题。
代码:

#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;
}

最佳答案

如果你已经告诉编译器告诉你可能警告的最大值,编译器会指出一些问题。对于gcc,这样做的选项是-Wall -Wextra -pedantic
但现在就具体问题而言:
在这里

sprintf(fName, " ", z);

缺少转换说明符。代码应该如下所示:
sprintf(fName, "%d", z);

同时sprintf()是未保存的,因为它可能会溢出目标“字符串”。使用snprintf()代替:
snprintf(fName, "%d", sizeof(fName), z);

下面的scan命令使用了%f这个预期的float,但是传入了double
fscanf(fpt, "%d%*c%d%*c%f%*c%f", &a[i].counter, &a[i].year, &a[i].maxrain, &a[i].rank)

使用%lf扫描双倍:
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()的声明/定义。
关于向服务器声明变量作为数组索引的说明:
数组指示符总是正的,因此对此使用有符号变量是没有意义的。
另外,不确定一个或其他整数类型有多宽,因此不能保存以使用“每一个”来寻址内存。在保存数组元素时(在内存中使用)时,使用C标准保证的是一个无符号字节,足够处理所有机器的内存(并使用最大可能的数组元素)。

关于c - 传递struct成员以在c中起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19853714/

10-11 21:55