[英]passing struct member to function in c
我有此文件,并将其输入为c中的struct数组。 但是我在将struct成员传递给函数时遇到问题。 错误:第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);
下面的扫描命令使用%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);
最后, avg()
缺少add
的声明/定义。
作为向服务器声明变量作为数组索引的注释:
数组索引始终为正,因此为此使用带符号变量没有意义。
同样也不确定一个或另一种整数类型的宽度,因此使用每个地址寻址存储器都将是不节省的。 要在寻址数组元素(以及使用此内存)时保留在保存侧,请使用size_t
,C标准保证它是一个无符号整数,宽度足以寻址所有机器内存(并使用最大可能的数组元素) 。
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) {
//
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.