数组C中的最大值

时间:2012-07-03 21:52:07

标签: 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;
 }  

6 个答案:

答案 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无法获得数组的实际大小,只允许调用者告诉您它有多大。