-1

これが私がやっていることです:

const uint16_t LAYERS_RIGHT[TOTAL_LAYERS][NBROW][NBCOL] = {
  {{c00, c10, c20, c30, c40, c50, c60},
   {c01, c11, c21, c31, c41, c51, c61},
   {c02, c12, c22, c32, c42, c52, c62},
   {c03, c13, c23, c33, c43, c53, c63},
   {c04, c14, c24, c34, c44, c54, c64},
   {c05, c15, c25, c35, c45, c55, c65}}
   /* blah blah */
};
const uint16_t LAYERS_LEFT[TOTAL_LAYERS][NBROW][NBCOL] = {
   /* blah blah */
   /* blah blah */
};

uint16_t *(LAYERS[TOTAL_LAYERS][NBROW][NBCOL]);

私の目標は、右の構造または左の構造へのポインターを作成することです。

LAYERS = &LAYERS_RIGHT;

コンパイラは次のように述べています。

error: incompatible types in assignment of 
'const uint16_t (*)[7][6][7] {aka const unsigned int (*)[7][6][7]}' to 
'uint16_t* [7][6][7]         {aka unsigned int* [7][6][7]}'

コードを機能させるにはどうすればよいですか?

4

1 に答える 1

1

LAYERSポインターの 3D 配列として定義しました。3D 配列への const ポインターが必要です。

const uint16_t (*LAYERS)[TOTAL_LAYERS][NBROW][NBCOL];

ただし、これを使用するには、次のような構文を使用する必要があります。

(*LAYERS)[a][b][c];

3D 配列としてインデックスを付けたい場合LAYERSは、代わりに次のように定義できます。

const uint16_t (*LAYERS)[NBROW][NBCOL];

そして、次のように割り当てます。

LAYERS = LAYERS_RIGHT;

これは、一部のコンテキストでは、配列が最初の要素へのポインターに崩壊するという事実を利用しています。上記の課題はその一つです。

LAYERS_RIGHTは の配列でconst uint16_t [NBROW][NBCOL]あるため、これらの配列要素の 1 つのアドレスの型は でありconst uint16_t (*)[NBROW][NBCOL]、これは の型ですLAYERS

次にLAYERS[0]、最初const uint16_t [NBROW][NBCOL]の 、LAYERS[1]、2 番目などを参照します。

したがって、上記の割り当ての後、この式は

LAYERS_RIGHT[a][b][c];

次の式と同じ値が得られます。

LAYERS[a][b][c];
于 2016-09-22T17:57:53.827 に答える