【发布时间】: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 年前的编译器吗?