函数声明隐藏全局声明

Declaration of function shadows a global declaration

因为这是一条常见的错误消息,所以我用 Google 搜索了这个问题。不幸的是,我所能找到的都是线程,其中问题是由具有相同名称的全局变量和局部变量引起的。我的问题与全局变量无关,所以我认为这是一个新问题。 C 不让我调用函数。每次我调用这样的函数时

...
adjusted_scores = *new_scores(scores,days_late,penalty);
numeric_score = final_score(adjusted_scores, weights);
...

,支持代码

int * new_scores(int scores[], int days_late[], int penalty) {
  int new_scores[MAX_ASSIGNMENTS];

  /*computes size of array*/
  int size = sizeof(scores)/sizeof(scores[0]);
  int i;
  for(i=0;i<size;i++){
    new_scores[i]=scores[i]-penalty*days_late[i];
  }
  return new_scores;
}

对于有问题的功能,如果有帮助,我收到消息

error: incompatible types when assigning to type 'int[50]' from type 'int'.

早些时候,我收到了消息

error: called object 'new_scores' is not a function,

所以报错信息变长了,情况也没有好转。最重要的是,我一直收到消息

的警告
warning: function returns address of local variable [enabled by default],

所以即使我让错误消失了,当真正 运行 代码出现时,程序可能会以不同的方式搞砸。最好的情况是代码成功编译,但无法访问函数 returns。

免责声明:由于无法解释的原因,不得使用 malloc、memcpy 和任何与动态内存分配相关的工具来修复问题。如果免责声明成为难以处理的负担,我将尝试弄清楚这些原因是什么。

此错误信息:

error: incompatible types when assigning to type 'int[50]' from type 'int'.

告诉我们adjusted_scores是一个数组,不能直接给数组赋值。

这个警告:

warning: function returns address of local variable [enabled by default],

发生是因为函数 new_scores 中的变量 new_scores 是一个数组,并且在大多数情况下,数组会衰减为指向其第一个元素的指针,这意味着您要返回的地址局部变量。这很糟糕,因为当函数退出导致指针无效时,该变量超出范围。

解决这两个问题的方法是将 adjusted_scores 传递给函数并将更新后的值直接分配给它。

此外,sizeof(scores)/sizeof(scores[0]) 不会如您所愿,因为 scores 是指针,而不是数组,所以 sizeof(scores) 是指针的大小。

所以 new_scores 看起来像这样:

void new_scores(int result[], int scores[], int size, int days_late[], int penalty) {
  int i;
  for(i=0;i<size;i++){
    result[i]=scores[i]-penalty*days_late[i];
  }
}

你会这样称呼它:

new_scores(adjusted_scores,scores,sizeof(scores)/sizeof(scores[0]),days_late,penalty);