我收到编译错误,我无法解决。我需要创建一个初始化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 <stdio.h>
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;
}
答案 0 :(得分:5)
问题1
在定义之前,您在largest()
中使用main()
。使用原型,或移动main()
上方的定义。
第2期
在:
length = sizeof(array)/sizeof(array[0]);
您将长度声明为int length
,但为其指定类型为size_t
的内容。这导致了问题原始版本中的错误error: 'length' redeclared as different kind of symbol
。
问题3
在
for(i; i<length; i++)
您没有为i分配值。你的意思是
for(i=0; i<length; i++)
?虽然您之前为i
分配了一个值,但我认为这会导致warning: statement with no effect
(虽然很难确定所提供的代码中没有行号)。
此外,C中的数组是基于0的。您可能希望将i
初始化为0而不是1。
问题4
在第
行printf("%d",myArray[]);
您使用%d作为格式说明符,这意味着所提供的参数应为整数值。你提供一个数组。
答案 1 :(得分:3)
C一次编译你的代码。这意味着所有内容都应该在之前定义。您的函数largest
在使用后定义,因此一旦编译器看到
largest(myArray,6);
它仍然不知道largest
存在!
解决方案是将largest
的定义移到main
以上,或者更好,转发声明该函数:
#include <stdio.h>
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);
答案 2 :(得分:1)
在largest()
之前声明main()
以解析隐式声明警告:
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;
中的for
引起的:
for(i; i<length; i++)
更改为:
for(; i<length; i++)
或:
for(i = 0; i<length; i++)
或如果是C99:
for(int i = 0; i<length; i++)
答案 3 :(得分:0)
您有错误和警告..错误显然更重要。
printf("%d",myArray[]);
%d
格式规范意味着您要编写int
值,但情况并非如此,并且可能是您出错的原因。
还有其他警告值得你注意,例如没有为你的'最大'函数等提供函数 prototype ,但那些是修复阻止编译的错误的次要问题。
当然,警告也应该被消除,或者在检查之后应该有意识地忽略它们。
答案 4 :(得分:0)
你也可以将main()的定义移到main()的定义之上,它会起作用。
答案 5 :(得分:0)
int largest(int array[], int length)
{
length = sizeof(array)/sizeof(array[0]);
不,sizeof
没有做你认为它在这里做的事情。它不会神奇地知道您的分配大小,只需要获取基础类型的大小。你所做的相当于sizeof(int*)/sizeof(int)
。
您应该信任来电者给您的长度参数。使用sizeof
无法获得数组的实际大小,只允许调用者告诉您它有多大。