value既不是数组也不是指针

时间:2015-04-08 00:37:18

标签: c arrays

我有这段代码:

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 个答案:

答案 0 :(得分:2)

fscanf()的两个实例都不正确。 fscanf()需要指针而不是整数来修改该位置的内存。

您的第一个电话就是:

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

索引变量ID时,您将student_count索引的值传递给函数。哪个fscanf()试图将其解释为内存位置(不好)!

此:

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

将索引student_count处的数组引用传递给fscanf()。

对fscanf()的另一个调用也是如此!

答案 1 :(得分:1)

问题在于变量IDScores的范围。两个变量都在两个地方定义 -

  • 作为文件顶部的全局变量,
  • 作为您的函数的命名参数。

命名参数的范围更接近使用地点,因此获胜。

看起来第二位的使用(即作为函数参数)不是故意的,因为声明缺少类型 * 。删除它们将使您的代码编译。

* 在这种情况下C认为它们是int,并发出一个警告,该错误应该向您解释错误:因为编译器认为内部范围{{1} }和IDScore s,您不能将索引运算符int与它们一起使用。