1

次のコードのコンパイルに問題があります。コンパイラーは次のように述べています。

Assigning to 'RawChunk::Ptr' (aka 'unsigned char (*)[128][16]') from incompatible type 'RawChunk::Chunk *' (aka 'unsigned char (*)[16][128][16]');

誰かが私が間違っていることを知っていますか?単純な間違いのように思えますが、何を変更するのかわかりません。

template <int dim>
class RawChunkWindow {
public:
    typedef unsigned char (*Ptr)[ChunkDimensions::MAX_Y][ChunkDimensions::MAX_Z];
    typedef unsigned char Chunk[ChunkDimensions::MAX_X][ChunkDimensions::MAX_Y][ChunkDimensions::MAX_Z];
    RawChunkWindow() {
        for (int i = 0; i < dim; ++i) {
            for (int j = 0; j < dim; ++j) {
                window[i][j] = &payload[i][j]; //compiler complains here
            }
        }
    }
private:
    Ptr window[dim][dim];
    Chunk payload[dim][dim];
};
4

3 に答える 3

3

あなたが何をしようとしているのかについての詳細な説明がなければ、私には確信が持てませんが、メンバー変数に間違った型を使用した可能性があります。特に、メンバー変数ウィンドウは次のタイプです。

window: 2 次元配列へのポインターの 2 次元配列である unsigned charの配列へのポインターのサイズdimの配列のサイズの配列。dimMAX_YMAX_Z

ペイロード: サイズdimの配列の配列のサイズdimの配列のサイズの配列のサイズMAX_Xの配列のサイズの配列のサイズMAX_Yの配列MAX_Z、つまり 5 次元配列です。

于 2012-07-13T02:28:16.387 に答える
1

のコンストラクターで切り取られたコードから、型は型へのポインターであるRawChunkWindowように見えますが、宣言はそれを反映していません。代わりに、3 次元配列へのポインターではなく、型の 2 次元配列へのポインターです。PtrChunktypedefPtrchar

したがって、これを変更します。

typedef unsigned char (*Ptr)[ChunkDimensions::MAX_Y][ChunkDimensions::MAX_Z];

これに:

typedef unsigned char (*Ptr)[ChunkDimensions::MAX_X][ChunkDimensions::MAX_Y][ChunkDimensions::MAX_Z];

これは、エラー コードが報告しているものでもあります。Aunsigned char (*)[128][16]は 128x16 の 2 次元配列へのポインターであり、コンパイラーは、3 次元の 16x128x16 配列ポインター右辺値 (つまり、unsigned char (*)[16][128][16]右辺値) を間違ったポインター型に割り当てようとしていると不平を言っています。

サイドノードとして、スタックで使用する予定がある場合は、このオブジェクトを宣言する方法に注意してください。寸法が 16x128x16 の場合、単一のChunk型インスタンスは 32Kb を占有し、テンプレート引数としてあまりにも大きな値を渡すと、それらの 2 次元配列はすぐにスタック スペースを使い果たす可能性がありますdim

于 2012-07-13T01:51:38.183 に答える
0

現在の方法でエラーを解消するには、次の行を変更する必要があります。

window[i][j] = &payload[i][j];

window[i][j] = &payload[i][j][x];

「ChunkDimensions::MAX_X」より小さい「x」の場合。ただし、あなたが何をしようとしているのかは明確ではありません。上記の修正はほぼ間違いなくそうではありません(おそらく)。簡単に言えば、3D 配列のコレクションを 1 つのコレクション (ペイロード) に格納しようとしているように見えますが、3D 配列は実際には 2D 配列の単なる配列であるため、それぞれへのポインターを格納しようとしています。別のコレクション (ウィンドウ) 内のこれらの 2D 配列の。ここでは「暗い」という言葉を使うことさえしません。状況はすでに頭をひねって結び目を作るのに十分だからです。いずれにせよ、生の C スタイル配列の代わりに「std::vector」を使用する方がはるかに簡単です。一般に C スタイルの配列を使用する問題をよりよく理解するために (何らかの理由で "std::vector" を使用できない場合)、C++ での 2 次元配列ポインター操作と、C++の関数を使用した多次元配列の操作。私が提示する概念を 3D 配列に拡張することができます。

于 2012-07-13T14:20:24.943 に答える