Возникли проблемы с заполнением массива структур при чтении файла - PullRequest
1 голос
/ 19 марта 2019

Я пытаюсь заполнить массив значениями из этого файла:

9383      8.86
2777     69.15
7793     83.35
5386      4.92
6649     14.21
2362      0.27
8690      0.59
7763     39.26
 540     34.26
9172     57.36
5211     53.68
2567     64.29
5782     15.30
2862     51.23
4067     31.35
3929     98.02
4022     30.58
3069     81.67
1393     84.56
5011     80.42
6229     73.73
4421     49.19
3784     85.37
5198     43.24
8315     43.70
6413     35.26
6091     89.80
9956     18.73
6862     91.70
6996     72.81

Вот мой код, он успешно компилируется, но я получаю "ошибка сегментации, ядро ​​сброшено", когда я иду, чтобы запуститьcode.

typedef struct student
{
double score;
int id;
char grades;
} Student;


void main(void)
{
    char filename[] = "scores.dat";
    FILE *input;
    Student class[MAXNUM];
    int numScores;
    double average;

    input = fopen("scores.dat", "r");

    if (input == NULL)
    {
            printf("EOF");
            exit(1);
    }
    getScores(input, class[MAXNUM]);
}


int getScores(FILE *input, Student class[])
{
    double s;
    int i, j, count = 0;

    while(fscanf(input, "%d %lf", &i, &s) == 2)
    {
            class[count].score = s;
            count++;
    }
    //loop to check what is in the array.
         for(j = 0; j< 20; j++){
            printf("%lf\n", class[j].score);
    }
}

Я не уверен, куда идти, у меня никогда не было компиляции программы, но она не запускалась.Я попытался объявить функцию getScores перед main, но она только добавила ошибку, когда я пошел на компиляцию.Любая помощь будет принята с благодарностью, спасибо!

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Я думаю, что проблема в параметрах getScore. Конкретно в Stundent. Вы говорите, что ожидаете массив (class []), но передаете объект (class [MAXIMUM]). И вы вышли за пределы. Помните, что индекс начинается с 0. Это означает, что когда вы кодируете, например: int a [100]. Последний элемент находится в [99], а не в [100].

Set -Wall при компиляции вашей программы. Компилятор твой друг. Используйте это.

1 голос
/ 19 марта 2019

Изменить вызов:

getScores(input, class[MAXNUM]);

Измените приведенное выше утверждение на следующее:

getScores(input, class);

И он успешно запустится. Что вы делали, так это то, что передавали элемент массива, а не адрес самого массива.

Выход:

8.860000
69.150000
83.350000
4.920000
14.210000
0.270000
0.590000
39.260000
34.260000
57.360000
53.680000
64.290000
15.300000
51.230000
31.350000
98.020000
30.580000
81.670000
84.560000
80.420000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...