0

我有这个文件并将其作为 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;
}
4

2 回答 2

5

如果您告诉编译器告诉您最大可能的警告,那么编译器会指出这里有几个问题。对于 gcc,这样做的选项是-Wall -Wextra -pedantic.

但现在详细介绍这些问题:

这里

sprintf(fName, " ", z);

缺少转换说明符。代码应如下所示:

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

sprintf()也未保存,因为它可能会溢出目标“字符串”。改用snprintf()

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

以下扫描命令使用%f了预期的浮点数,但已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()


作为将变量声明为服务器作为数组索引的注释:

数组索引始终为正数,因此为此使用有符号变量没有意义。

此外,不确定一种或另一种整数类型有多宽,因此使用 every 来寻址内存并不省事。为了在寻址数组元素(以及使用此内存)时保持保存状态,请使用size_t,C 标准保证它是一个无符号整数,其宽度足以寻址所有机器的内存(以及最大可能的数组元素)。

于 2013-11-08T07:37:23.083 回答
0

1.将struct的元素传递给函数:

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 回答