繁体   English   中英

数组C中的最大值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM