数组C中的最大值
我收到编译错误,我无法解决。 我需要创建一个初始化in数组的程序,然后编写一个最大的函数,它接受2个参数,一个数组和它的长度,并返回数组中最大元素的索引。 然后我将从main调用此函数。 谁能告诉我这是什么问题?
errors:part1.c: part1.c: In function 'main': part1.c:6:3: warning: implicit declaration of function 'largest' part1.c:7:23: error: expected expression before ']' token part1.c: In function 'largest': part1.c:17:4: warning: statement with no effect
谢谢!
#include int main() { int myArray[]={1,2,3,4,5,6}; largest(myArray,6); printf("%d",myArray[]); return 0; } int largest(int array[], int length) { length = sizeof(array)/sizeof(array[0]); int i = 1; int max = array[0]; for(i; i<length; i++) { if(max < array[i]) { max = array[i]; } } return max; }
C一次编译你的代码。 这意味着应该在使用之前定义所有内容。 您的函数largest
是在使用后定义的,因此一旦编译器看到
largest(myArray,6);
它仍然不知道存在largest
!
解决方案是要么移动main
以上的largest
定义,要么更好, 向前声明函数:
#include int largest(int array[], int length); int main() { int myArray[]={1,2,3,4,5,6}; largest(myArray,6); printf("%d",myArray[]); return 0; } int largest(int array[], int length) { /* implementation of largest */ }
此外, sizeof(array)
不会为您提供largest
的元素数,因为在函数调用时该信息会丢失。 您可以在函数调用中将该表达式移动到compute并传递length参数:
largest(myArray,sizeof(myArray)/sizeof(myArray[0]));
这也可能是一个错字,但您可能意味着存储和打印最大值:
int max = largest(myArray,sizeof(myArray)/sizeof(myArray[0])); printf("%d\n",max);
问题1
在定义之前,在main()
使用largest()
。 使用原型,或移动main()
上方的定义。
问题2
在:
length = sizeof(array)/sizeof(array[0]);
您将length声明为int length
,但为其指定size_t
类型的东西。 这导致错误error: 'length' redeclared as different kind of symbol
在您的问题的原始版本中error: 'length' redeclared as different kind of symbol
。
问题3
在
for(i; i
你没有为i赋值。 你的意思是
for(i=0; i
? 虽然您之前为i
分配了一个值,但我相信这会导致warning: statement with no effect
(尽管在提供的代码中没有行号很难确定)。
此外,C中的数组是基于0的。 您可能希望将i
初始化为0而不是1。
问题4
在线
printf("%d",myArray[]);
您使用%d作为格式说明符,这意味着提供的参数应该是一个整数值。 你提供一个数组。
在main()
largest()
之前放置一个maximum largest()
声明来解析隐式声明警告 :
int largest(int array*, int length); int main()
错误错误:’]’令牌之前的预期表达式是由以下原因引起的:
printf("%d",myArray[]);
要打印最大值,您需要存储largest()
的结果或将其用作printf()
的参数:
printf("%d", largest(myArray, 6));
这不是你所期望的:
length = sizeof(array)/sizeof(array[0]);
当数组作为参数传递时,它会衰减为指针。 它相当于:
length = sizeof(int*)/sizeof(int);
只需使用length
参数来控制迭代。 建议将参数设置为largest()
const
因为函数不会修改它们。
警告:声明无效 ,由i;
引起i;
在for
:
for(i; i
改成:
for(; i
要么:
for(i = 0; i
或者如果是C99:
for(int i = 0; i
你也可以将main()的定义移到main()的定义之上,它会起作用。
很多人都指出了很多问题,但没有人提到过这个问题:
int largest(int array[], int length) { length = sizeof(array)/sizeof(array[0]);
不, sizeof
没有做你认为它在这里做的事情。 它不会神奇地知道您的分配大小,只需要基础类型的大小。 你所做的相当于sizeof(int*)/sizeof(int)
。
您应该信任调用者给您的长度参数。 使用sizeof
无法获得数组的实际大小,只允许调用者告诉你它有多大。
您有错误和警告..错误显然更重要。
printf("%d",myArray[]);
%d
格式规范意味着您要编写一个int
值,但情况并非如此,以及可能导致错误的原因。
还有其他一些值得你注意的警告,例如没有为你的’最大’函数等提供函数原型 ,但这些警告是修复阻止编译的错误的第二个警告。
当然,警告也应该被消除,或者在检查之后应该有意识地决定忽略它们。