2

我试图编写一个程序,该程序将采用一个数字数组,并生成一个包含第一个数组条目平方的新数组。这是应该执行此操作的功能;

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

4 回答 4

6

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

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

Without specifying type of parameters, it will be considered int by default which is allowed in C89.

n1570: 6.5.2.2 Function calls

Each argument shall have a type such that its value may be assigned to an object with the unqualified version of the type of its corresponding parameter.


Now I get 3 errors on the squares[i]... line saying "Subscripted value is neither array nor pointer". Why on earth would I want i to be an array or a pointer!? Shouldn't it simply be an index for the loop to make sense?

Clearly this warning is about the variables squares and numbers which should be declared either an array or pointer. Only then subscripted value is used.

于 2013-11-02T14:10:38.443 回答
3

给定A[B],“下标值”是AB是下标。

而且,其他人对缺少的类型说明符和声明符位的看法。

当你写:

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

你正在编写一个老式函数。这就是在 1980 年代进行一些改进之前 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;
{  
}
于 2013-11-02T14:12:44.220 回答
2

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

您尚未指定numbers, squaresin的类型

 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]

于 2013-11-02T14:10:07.033 回答
0

当您将参数传递给函数时,该参数应表示您要传递的参数的类型。在这里,当您看到传递的参数(即数字和正方形)时,并不清楚您将传递给函数的数据类型是什么。

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

所以,你的代码应该是这样的:

void square_entires(int numbers[], int squares[]) 
{ 
于 2013-11-02T15:32:29.240 回答