1

我得到一个编译错误,我无法真正修复。我需要创建一个初始化 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;
 }  
4

6 回答 6

5

问题 1

在定义它之前使用largest()in 。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 作为格式说明符,这意味着提供的参数应为整数值。您改为提供一个数组。

于 2012-07-03T21:55:02.047 回答
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因为该信息在函数调用时会丢失。您可以在函数调用中将该表达式上移以计算并传递长度参数:

largest(myArray,sizeof(myArray)/sizeof(myArray[0]));

这也可能是一个错字,但您可能打算存储和打印最大值:

int max = largest(myArray,sizeof(myArray)/sizeof(myArray[0]));
printf("%d\n",max);
于 2012-07-03T21:55:07.937 回答
1

放置一个largest()before声明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++)
于 2012-07-03T21:55:12.957 回答
0

您也可以将最大()的定义移到 main()的定义之上,它会起作用。

于 2012-07-03T22:00:20.983 回答
0

许多人指出了许多问题,但很惊讶没有人提到这一点:

int largest(int array[], int length)
{
  length = sizeof(array)/sizeof(array[0]);

不,sizeof不做你认为它在这里做的事情。它不会神奇地知道分配的大小,只需要底层类型的大小。你所做的相当于sizeof(int*)/sizeof(int).

你应该相信调用者给你的长度参数。无法使用 获取数组的实际大小sizeof,只能让调用者告诉你它有多大。

于 2012-07-03T22:03:38.177 回答
0

您有错误和警告..错误显然更重要。

  printf("%d",myArray[]);

%d格式规范暗示您要写入一个值,但int事实并非如此,并且可能是您的错误的原因。

还有其他警告值得您注意,例如没有为您的“最大”函数提供函数原型等,但这些警告对于修复阻止编译的错误是次要的。

当然也应该消除这些警告,或者在检查它们之后有意识地决定忽略它们。

于 2012-07-03T21:55:25.847 回答