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()します。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、1ではなく0に初期化する必要があります。

第4号

行で

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

書式指定子として%dを使用します。これは、指定された引数が整数値であることが期待されることを意味します。代わりに配列を指定します。

于 2012-07-03T21:55:02.047 に答える
3

Cは1回のパスでコードをコンパイルします。これは、使用する前にすべてを定義する必要があることを意味します。関数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()前に宣言を入れてください: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

エラーと警告があります..エラーは明らかにより重要です。

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

フォーマット仕様は%d、値を書き込みたいことを意味しますがint、そうではなく、エラーの原因として考えられます。

'最大の`関数の関数プロトタイプを提供しないなど、注意に値する他の警告がありますが、それらはコンパイルを妨げるエラーを修正するための二次的なものです。

もちろん、警告も削除するか、警告を調べた後で無視するように意識的に決定する必要があります。

于 2012-07-03T21:55:25.847 に答える
0

また、largest()の定義を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 に答える