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