2015-04-08 5 views
1

У меня есть этот код:значение не является ни массивом, ни указатель

int ID [STUDENTS]; 
int Scores [STUDENTS][GRADES]; 
int Hi [GRADES]; 
int Lo [GRADES]; 
double Avg [GRADES]; 
int numStudents; 

/*getData function called*/ 
int getData(ID, Scores, numStudents) 
{ 
    int student_count; 
    int quiz_count; 

    FILE* spIn; 


    spIn = fopen("myfile.dat", "r"); 
    student_count=0; 
    while (fscanf (spIn, "%d", ID[student_count]) != EOF) 
    { 
    for (quiz_count = 0; quiz_count < GRADES; quiz_count++) 
    { 
     fscanf (spIn, "%d", Scores[student_count][quiz_count]); 
    } 
    } 
} 

Я получаю ошибку в названии для линий: while(fscanf (spIn, "%d", ID[student_count]) !=EOF) и fscanf (spIn, "%d", Scores[student_count][quiz_count]);

Пожалуйста, помогите я не знаю, что делать!

+2

'int getData (ID, Scores, numStudents)' - казалось бы, что-то не так в этой декларации. Либо формализовать эти параметры с соответствующими типами, либо бросить их прямо, и (ть) использовать ваши глобальные переменные. – WhozCraig

+1

в строке внутри цикла for, вы пытаетесь выполнить сканирование в целое число, а не указатель. – itdoesntwork

ответ

1

Проблема заключается в области переменных ID и Scores. Обе переменные определяются в двух местах -

  • как глобальная переменная в верхней части файла и
  • В имени параметра вашей функции.

Именованный параметр ближе к области использования, поэтому он выигрывает.

Похоже, что использование на втором месте (т. Е. Как параметр функции) не является преднамеренным, поскольку в декларациях отсутствуют типы *. Удаление их приведет к компиляции кода.

* в этом случае C рассматривает их int с, и выдает предупреждение, которое должно быть объяснена ошибка вам: так как компилятор считает, что внутрипартийная сферой ID и Score являются int s, вы не можете использовать оператор индекса [] с ними.

+0

Спасибо, что исправил это! – ShearForce

2

Оба экземпляра fscanf() неверны. fscanf() нуждается в указателях, а не в int, для изменения памяти в этом месте.

Ваш первый вызов заключается в следующем:

while (fscanf (spIn, "%d", ID[student_count]) != EOF) 

Когда индекс переменной ID вы передаете значение индекса student_count к функции. Какой fscanf() пытается интерпретировать как место памяти (не хорошо)!

Это:

while (fscanf (spIn, "%d", &ID[student_count]) != EOF) 

передает ссылку массива с индексом student_count к fscanf().

То же самое относится к другому вызову fscanf()!

Смежные вопросы