2

数値の配列を取り、最初の配列のエントリの二乗を含む新しい配列を生成するプログラムを作成しようとしました。これを行うはずの関数は次のとおりです。

void square_entires(numbers, squares){

    for (int i=0; i<5; ++i) {
        squares[i]=numbers[i]*numbers[i];
    }

}

今、squares[i]...行 に3つのエラーが表示されます

"Subscripted value is neither array nor pointer".   

iなぜ私は配列やポインタになりたいのですか!? ループが意味をなすための単なるインデックスであるべきではありませんか? このように配列要素をループする関数の他の例を見たことがありますが、それらは正常に動作します..私の関数だけが正しく動作しません! 誰かがこれがなぜなのか説明してもらえますか? ありがとうございます。

4

4 に答える 4

6

関数宣言が間違っています。関数の引数の型を指定する必要があります。そのはず

void square_entires(int numbers[], int squares[]) 
{   

パラメーターのタイプを指定しないとint、C89 で許可されているデフォルトで考慮されます。

n1570: 6.5.2.2 関数呼び出し

各引数は、その値が対応するパラメータの型の修飾されていないバージョンを持つオブジェクトに割り当てられるような型を持つものとします。


これで、squares[i]... 行に「添字付きの値は配列でもポインターでもありません」という 3 つのエラーが表示されます。なぜ私は配列またはポインターになりたいのですか!? ループが意味をなすための単なるインデックスであるべきではありませんか?

明らかに、この警告は変数に関するものであり、配列またはポインターのいずれかとして宣言する必要がありますsquaresnumbersその場合にのみ、添字付きの値が使用されます。

于 2013-11-02T14:10:38.443 に答える
3

が与えられA[B]た場合、「添え字付きの値」はAです。Bは添字です。

そして、欠落している型指定子と宣言子ビットについて他の人が言ったこと。

あなたが書くとき:

int foo(a, b)
/* <- nothing here */
{
}

あなたは古いスタイルの関数を書いています。これは、1980 年代に ANSI C として標準化されるいくつかの改良が行われる前に C がどのように書かれたかです。aとの型bは、関数宣言子と本体の間で宣言されます。それらが宣言されていない場合、明らかにデフォルトでint. 2つの方法があります。最も好ましいのは、モダンなスタイルを使用することです。

int square_entries(int *numbers, int *squares) // or some other type: double?
{
}

推奨されていない廃止されたスタイルは、次のようになります。

int square_entries(numbers, squares)
int *numbers;
int *squares;
{  
}
于 2013-11-02T14:12:44.220 に答える
2

[]下付き演算子です。括弧内の式は添え字と呼ばれます。(大括弧) 内の式が後に続く後置式[ ]は、配列の要素を指定します。

numbers, squaresの型が指定されていません

 void square_entires(numbers, squares) // Defaults to type int (where actually you need type int array

これは ( C89 で有効です)main()暗黙のうちに (以前は) を意味していましint main(void)た。ただし、デフォルトの戻り値の型規則はC99で廃止されました。

これが必要だと思います:

void square_entires(int numbers[], int squares[]) 

また

void square_entires(int * numbers, int * squares) 

関数内で配列がポインターに崩壊する原因となるため、関数内で配列のサイズを計算することはできません。そのため、(必要に応じて) 次のようにサイズも渡します。

void square_entires(int numbers[], int squares[], int sizenumbers, int sizesquares) 

定義により、式a[b]は式 と同等*((a) + (b))であり、加算は結合的であるため、 とも同等b[a]です。

于 2013-11-02T14:10:07.033 に答える