2013-11-08 3 views
0

У меня есть этот файл и введите его как массив struct в c. Однако у меня есть проблема передачи элемента struct в функцию. Ошибка: даже указатель или значение массива не было с индексом в строке 58. Я новичок в c и застрял с этой проблемой в течение недели.Передача элемента структуры для функции в 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; 
} 
+0

ли & (a [i] .counter) работают? И так далее ... – LostBoy

+1

Эксперты здесь расскажут вам об ошибке, просто просмотрев код. Но, все же вы должны сообщить нам, что это строка ** 58 ** –

+2

«Ошибка: даже указатель или значение массива не было с индексом в строке 58». - это не похоже на компилятор. Скопируйте пасту, пожалуйста. – Potatoswatter

ответ

5

Там несколько вопросов здесь, на которые вы бы указали компилятором, если бы вы сказали компилятору, чтобы сказать вам maximunm возможных предупреждений. Для gcc параметры для этого: -Wall -Wextra -pedantic.

Но теперь для вопросов ванной подробнее:

Здесь

sprintf(fName, " ", z); 

спецификатор преобразования отсутствует. Код должен выглядеть следующим образом:

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

Также sprintf() является unsave, как это может переполнить назначения «строка». Используйте 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().


Как примечание об объявлении переменных сервера в качестве индекса массива:

массива indicies всегда положительны, так что не имеет смысла использовать подписанную переменную для этого.

Также неизвестно, насколько широким является тот или иной целочисленный тип, поэтому он не позволяет использовать каждый для адресной памяти. Чтобы оставаться на стороне сохранения при обращении к элементам массива (и с этой памятью), используйте size_t, что гарантируется стандартом C как целое без знака, достаточно широкое, чтобы адресовать всю память аппарата (и с этим максимально возможным элементом массива) ,

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. Passing структура функционировать

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

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

3. Passing адрес структуры для работы с указателем

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

double avg(struct list *s , int count) { 
    //  
} 
Смежные вопросы