【问题标题】:Declaration of function shadows a global declaration [closed]函数声明隐藏全局声明[关闭]
【发布时间】:2020-02-09 02:30:26
【问题描述】:

因为这是一个常见的错误消息,我已经用谷歌搜索了这个问题。不幸的是,我能找到的只是线程,其中问题来自具有相同名称的全局变量和局部变量。我的问题与全局变量无关,所以我认为这构成了一个新问题。 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],

所以即使我让错误消失了,当实际运行代码时,程序可能会以不同的方式搞砸。最好的情况是代码编译成功,但无论函数返回什么都无法访问。

免责声明:出于无法解释的原因,不得使用 malloc、memcpy 和任何与动态内存分配相关的工具来解决问题。如果免责声明变得负担过重,我会尝试弄清楚这些原因是什么。

【问题讨论】:

  • (a) 您应该提供minimal reproducible example。 (b) adjusted_scores 是一个由 50 个 int 组成的数组,而 C 不支持分配给数组(仅分配给元素)。 (c) 声明为数组的参数scores自动调整为指针。使用sizeof 计算其大小会给出指针的大小,而不是数组。
  • 当使用参数时,int scores[] 表示int *scores。因此,sizeof(scores)/sizeof(scores[0]) 将无法按预期工作。您需要将该值作为参数传递。
  • 本质上,您不能通过将数组视为对象来执行此分配。您需要重新设计代码以使用指针处理数组元素。
  • Re "不能使用动态内存分配相关的工具",你要做的就是把int new_scores[MAX_ASSIGNMENTS]放在调用者中,作为参数传入。原来您已经将此变量创建为adjusted_scores,所以这就是您作为参数传入的内容。
  • 你为什么用c89标记这个?您使用的是 30 年前的编译器吗?

标签: c c89


【解决方案1】:

这个错误信息:

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);

【讨论】:

  • 我希望 x=f(...) 形式的代码行(其中 f 是一个函数,x 是一个变量)必须重写这一概念在 C 语言中不是一个普遍现象。展望未来,当我必须创建更复杂的项目时,主方法似乎会越来越大,主方法顶部的变量将开始占用大量行,函数将包含大量在其他语言中不需要的参数。希望我能在此之前了解更多信息,以避开迫在眉睫的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
相关资源
最近更新 更多