7

問題が見つかりません。これらのエラーが発生し続けます:

"c:2:5: note: expected 'int *' but argument is of type 'int'"
"c:28:1: warning: passing argument 1 of 'CountEvenNumbers' makes pointer from
   integer without a cast [enabled by default]"

コードは次のとおりです。

1 #include <stdio.h>
2 int CountEvenNumbers(int numbers[], int length);
3 int main(void)
4 {
5 int length;
6 int X;int Z; int Y; int W;
7 X=0;Y=0;Z=0;W=0;
8 printf("Enter list length\n");
9 scanf("%d",&length);
10 int numbers[length];
11 
12 if (length<=0)
13 .   {printf("sorry too low of a value\n");
14 .   .   return 0;}
15 else
16 .   {
17 .   printf("Now, enter %d integers\n",length);
18 .   for (X=0;X<length;X++)
19 .   .   {scanf("%d",&Y);//X is position in array, Y is value.
20 .   .   numbers[X]=Y;
21 .   .   }
22 .   printf("The list reads in as follows:\n");
23 .   for (W=0;W<length;W++)
24 .   .   {Z=numbers[W];
25 .   .   printf("%d ",Z);}
26 .   printf("\n");
27 .   }
28 CountEvenNumbers( numbers[length] , length );
29 return 0;
30 }
31 
32 int CountEvenNumbers(int numbers[], int length)
33 {
34 .   int odd_count;int even_count;int P;int Q;
35 .   Q=0; odd_count=0;even_count=0;
36 .   for (P=0;P<length;P++)
37 .   .   if (numbers[Q]==0)
38 .   .   .   {even_count++;
39 .   .   .   Q++;}
40 .   .   else if ((numbers[Q]%2)!=0)
41 .   .   .   {odd_count++;
42 .   .   .   Q++;}
43 .   .   else
44 .   .   .   {even_count++;
45 .   .   .   Q++;}
46 .   printf("There are %d even numbers in the series\n",even_count);
47 .   return 0;
48 }
4

4 に答える 4

14

あなたの質問への答えは、これを交換することです:

CountEvenNumbers(numbers[length], length);

このため

CountEvenNumbers(numbers, length);

ただし、コーディングを続けると、警告/エラー メッセージを解読するスキルが非常に貴重になる場合があります。

「c:2:5: 注: 'int *' が期待されますが、引数の型は 'int'
です」 ]"

それで、それはどういう意味ですか?28 行目 ( CountEvenNumbers( numbers[length] , length ); ) で、引数 1 のキャストを行うことを期待していると述べています。したがって、最初の引数に何か問題があることがわかります。

ここでのトリックはもう 1 行です。expected 'int *' but argument is of type 'int'「整数へのポインターが必要でしたが、整数だけをくれました」と言っています。それが、間違った型を渡していることを知る方法です。

ですから、あなたが自問すべきことは、引数 1 の型は何ですか? 配列内の要素にアクセスする場合は、を使用する必要があることを知っている[]ので (コードの 20 行目と 25 行目でそうしました)、関数に渡すことで、単一の要素1numbers[length]を渡そうとします。期待されるような完全な配列の代わりに。

これの残りの半分はexpected 'int *'、なぜあなたの関数はintへのポインタを期待するのですか? それは、C では、(type) の配列を渡すと、(type)へのポインターに減衰するためです。

1 もちろん、numbers[length] は実際には配列の要素はなく、オーバーフローします。

于 2013-03-01T17:09:27.953 に答える
3

28 行目では、数値のインデックス「長さ」で整数を渡そうとしています。数字自体を渡すだけなので、次のようなものですCountEvenNumbers(numbers, length);

于 2013-03-01T16:50:05.170 に答える
0

本当にCのチュートリアルを読んでください。配列に添え字/インデックスを付け、配列のth 要素をarray[index]生成します。index配列自体を操作するように渡したい場合 (最初の要素へのポインターではなく)、単純にその名前を記述します。

CountEvenNumbers(numbers, length);
于 2013-03-01T16:49:46.163 に答える