#include <cs50.h>
#include <stdio.h>
int amount();
float average(int array[]);
int main(void)
//me begging to get the code to understand that aos is equal to amount();
int aos = amount();
{
//ask for scores and print them
int scores[aos];
for (int i=0;i<aos;i++)
{
scores[i] = get_int("score: ");
}
printf("average: %f\n", average(scores));
}
//get amount of scores
int amount()
{
int amt;
do
{
amt = get_int("how many scores: ");
}
while (amt < 0);
return amt;
}
//get amount of arrays and average
float average(int array[])
{
int sum = 0;
for (int i = 0; i<aos; i++)
{
sum += array[i];
}
return sum / (float) aos;
}
特别是int aos = amount();
让我头疼,因为无论我把它放在哪里,它通常都会给我一条消息“初始化器元素不是编译时常量”,我不知道如何修复它。
我试着把这一行放在不同的地方,并试图以一种不会激怒编译器的方式来构建它。在这一点上,我不确定它是否也可能只是一个形式错误,我错过了。无论如何,我都是新的编码,并开始学习arras abour 3小时前,所以我所有的选择
2条答案
按热度按时间bzzcjhmw1#
您的问题是,根据C语法,语句
int aos = amount();
不正确。只有进一步滚动到代码中,才能清楚地看到您希望aos
可用于函数average
。下面是你的代码修改和注解:
此格式表示使用的几种 * 常规 * 样式之一。不鼓励使用个人差异(例如在函数体前面多加一个空行),特别是当其他人会阅读您的代码时。
你可以继续写关于使用
size_t
变量或const
参数声明的文章,但现在已经足够了。g52tjvyc2#
这个
{
应该在main
的开头,指的是这条线
编译器告诉你
aos
,你用来初始化scores
数组大小的值,不是编译时常量。”在这里没有惊喜。不是**:它是函数在运行时返回的值。你必须在写程序时提供一个值,或者在程序运行时,一旦你知道这个值就分配数组。有一种东西叫做VLA,但你不应该指望它的存在或在你的编译器中实现。您可以**[1]估计
scores
或[2]**在运行时分配数组。[1]只需使用最大大小并调整
aos
[2]仅在
aos
已知时创建scores[]
总之
通过这种方式,只要知道
aos
,就可以调用malloc
并获得一个指向所需大小的区域的指针。然后将
average
更改为数组的地址。
在使用
scores
之后,调用free
来释放分配的内存。将指针设置为NULL
是一个好习惯。不是你所有的程序都会有20行,scores
指向的内存在你调用free
后就不再有效了,所以它可以保存你从几个bug中.