[英]max value in array 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 <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;
}
问题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<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用作格式说明符,这意味着所提供的参数应为整数值。 您可以提供一个数组。
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
的元素数,因为该信息在函数调用时会丢失。 您可以在函数调用中将该表达式向上移动以计算并传递length参数:
largest(myArray,sizeof(myArray)/sizeof(myArray[0]));
这也可能是错字,但您可能打算存储和打印最大值:
int max = largest(myArray,sizeof(myArray)/sizeof(myArray[0]));
printf("%d\n",max);
在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<length; i++)
改成:
for(; i<length; i++)
要么:
for(i = 0; i<length; i++)
或C99:
for(int i = 0; i<length; i++)
您有错误和警告..错误显然更重要。
printf("%d",myArray[]);
%d
格式规范表示您要编写一个int
值,不是这种情况,并且可能是导致错误的原因。
还有其他一些警告值得引起您的注意,例如不为您的“最大”函数提供函数原型等,但是这些警告仅次于纠正阻止编译的错误。
当然,警告也应消除,或者在检查警告后应做出有意识的决定以忽略警告。
您也可以将large()的定义移到main()的定义之上,这样就可以了。
许多人指出了许多问题,但没有人惊讶地提到这一点:
int largest(int array[], int length)
{
length = sizeof(array)/sizeof(array[0]);
否, sizeof
并没有您所认为的那样。 它并不神奇地知道分配的大小,仅占用基础类型的大小。 您所做的等同于sizeof(int*)/sizeof(int)
。
您应该相信呼叫者给您的长度参数。 无法使用sizeof
来获取数组的实际大小,只能让调用者告诉您它的大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.