1. ホーム
  2. c

[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる

2022-01-18 16:59:42

質問

C言語初心者のため、解答がよくわからず、既出の質問で申し訳ありません。 以下は私の関数です。

int rotateArr(int *arr) {
    int D[4][4];
    int i = 0, n =0;
    for(i; i < M; i ++ ){
        for(n; n < N; n++){
            D[i][n] = arr[n][M - i + 1];
        }
    }
    return D;
}

エラーを投げる

main.c|23|error: 添え字の値は、配列でもなければ ポインタまたはベクトル|。

ライン上

D[i][n] = arr[n][M - i + 1]となります。

どうしたんですか?配列要素の値を別の配列要素にセットしているだけなのですが。

渡されたarrは、以下のように宣言されています。

int S[4][4] = { { 1, 4, 10, 3 }, { 0, 6, 3, 8 }, { 7, 10 ,8, 5 },  { 9, 5, 11, 2}  };

解決方法は?

C言語では、添え字演算子を使用することができます [] 配列とポインタに適用されます。この演算子をポインタに使用した場合、結果の型はポインタが指す先の型になります。たとえば []int* の場合、結果は int .

まさにその通りです:あなたが渡しているのは int* これは整数のベクトルに相当します。これに一度下付き文字を使うと int そのため、2つ目の添え字を適用することはできません。

あなたのコードからは arr は2次元配列であるべきです。もしこれがギザギザ配列(つまりポインタの配列)として実装されているならば、パラメータの型は次のようになります。 int ** .

さらに、ローカルの配列を返そうとしているようです。これを合法的に行うには、配列を動的に割り当てて、そのポインタを返す必要があります。しかし、よりよい方法としては、特別な struct を 4x4 の行列に使用し、それを使って以下のように固定サイズの配列をラップしています。

// This type wraps your 4x4 matrix
typedef struct {
    int arr[4][4];
} FourByFour;
// Now rotate(m) can use FourByFour as a type
FourByFour rotate(FourByFour m) {
    FourByFour D;
    for(int i = 0; i < 4; i ++ ){
        for(int n = 0; n < 4; n++){
            D.arr[i][n] = m.arr[n][3 - i];
        }
    }
    return D;
}
// Here is a demo of your rotate(m) in action:
int main(void) {
    FourByFour S = {.arr = {
        { 1, 4, 10, 3 },
        { 0, 6, 3, 8 },
        { 7, 10 ,8, 5 },
        { 9, 5, 11, 2}
    } };
    FourByFour r = rotate(S);
    for(int i=0; i < 4; i ++ ){
        for(int n=0; n < 4; n++){
            printf("%d ", r.arr[i][n]);
        }
        printf("\n");
    }
    return 0;
}

これは は以下を表示します。 :

3 8 5 2 
10 3 8 11 
4 6 10 5 
1 0 7 9