开始C程序员 - 使用for循环数组条目的恼人错误

时间:2013-11-02 14:09:05

标签: c arrays

我试图编写一个程序,它将获取一组数字,并生成一个新数组 包含第一个数组条目的正方形。这是应该执行此操作的函数;

void square_entires(numbers, squares){

    for (int i=0; i<5; ++i) {
        squares[i]=numbers[i]*numbers[i];
    }

}

现在我在squares[i] ...行上有3个错误说

"Subscripted value is neither array nor pointer".   

为什么我希望i成为数组或指针!?难道它不应该仅仅是循环的索引才有意义吗?我已经看到其他函数的例子以这种方式循环数组元素并且它们工作正常..只是我的函数不能正常工作!有人可以解释一下这是为什么吗?谢谢它的进步。

4 个答案:

答案 0 :(得分:6)

您的函数声明错误。您必须在函数中指定参数的类型。它应该是

void square_entires(int numbers[], int squares[]) 
{   

如果没有指定参数类型,默认情况下会将其视为int,这在C89中是允许的。

n1570:6.5.2.2函数调用

  

每个参数都应具有类型,以便可以将其值分配给具有其相应参数类型的非限定版本的对象。


  

现在我在广场[i] ...线上说3个错误   “下标值既不是数组也不是指针”。   为什么我希望我成为一个数组或指针!?难道它不应该只是循环的索引才有意义吗?

显然,这个警告是关于变量squaresnumbers,它们应该被声明为数组或指针。只有使用了下标值。

答案 1 :(得分:3)

鉴于A[B],“下标值”为AB是下标。

而且,其他人对丢失的类型说明符和声明符位的说法。

当你写:

int foo(a, b)
/* <- nothing here */
{
}

你正在写一个旧式的功能。这是在20世代80年代进行了一些改进之前编写的C语言,它已经标准化为ANSI C. ab的类型在函数声明符和正文之间声明。如果他们没有被宣布,显然他们默认为int。有两种方法。首选的是使用现代风格:

int square_entries(int *numbers, int *squares) // or some other type: double?
{
}

过时的风格,不推荐,看起来像:

int square_entries(numbers, squares)
int *numbers;
int *squares;
{  
}

答案 2 :(得分:2)

[]是下标运算符。括号内的表达式称为下标。后缀表达式后跟[ ]中的表达式(括号)指定数组的元素。

您尚未在

中指定numbers, squares的类型
 void square_entires(numbers, squares) // Defaults to type int (where actually you need type int array

这(在C89中有效main()隐含地意味着(先前)int main(void)。但是, C99 中已放弃默认的返回类型规则。

我认为你需要这个:

void square_entires(int numbers[], int squares[]) 

void square_entires(int * numbers, int * squares) 

导致数组衰减为函数中的指针,因此无法计算函数中数组的大小 - 所以也传递大小(如果需要),如下所示:

void square_entires(int numbers[], int squares[], int sizenumbers, int sizesquares) 

根据定义,表达式a[b]等同于表达式*((a) + (b)),并且因为加法是关联的,所以它也等同于b[a]

答案 3 :(得分:0)

将参数传递给函数时,参数应表示要传递的参数的类型。在这里,当你看到你传递的参数,即数字和方块时,它并不清楚你将要传递给你的函数的数据类型是什么。

好吧,你要传递一个包含int数据类型的数组,这就是你需要将你的参数声明为int数组的原因,即int numbers [](在subscript []中表示你的参数将成为一个数组,“int”表示该数组包含int类型“。”

的数据

所以,你的代码应该是:

void square_entires(int numbers[], int squares[]) 
{