2

2D配列へのポインターを受け取り、配列にデータを入力する一連の関数を作成しています

これが私が今それを手に入れた方法です:

17 void m4identity(float *m[4][4]) {
18    *m = (float[4][4]) { { 1, 0, 0, 0 },
19                         { 0, 1, 0, 0 },
20                         { 0, 0, 1, 0 },
21                         { 0, 0, 0, 1 } };
22 }

しかし、残念ながら、コンパイラエラーが発生します。

linalg.c:18:7: error: incompatible types when assigning to type ‘float *[4]’ from type ‘float (*)[4]’

質問:

  1. (*)[4]との違いは何*[4]ですか?

  2. これを行うためのより良い方法はありますか?

    最初は関数内に作成された配列へのポインターを返そうとしましたが、スコープ外になるため、別のコンパイラエラーがスローされました。また、関数内から配列にスペースを割り当てることは避けたいと思います。これは、制御が難しいためです。

4

1 に答える 1

1

(*)[4]との違いは何*[4]ですか?

[]宣言指定子の優先順位が高いためfloat *arr[4]、4つのpointers-to-の配列floatfloat (*arr)[4]宣言し、pointer-to-array-of-4-を宣言しますfloat

これを行うためのより良い方法はありますか?

配列をポインタに減衰させて、割り当てを使用するだけです。

void m4identity(float m[4][4])
{
    memset(m, 0, 4 * sizeof(m[0]));
    for (int i = 0; i < 4; i++) {
        m[i][i] = 1;
    }
}
于 2013-03-25T21:10:12.360 に答える