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 的类型为:

窗口:数组大小dim的数组dim,指向无符号字符数组的指针MAX_Y大小的数组MAX_Z,即指向二维数组的指针的二维数组。

payload:大小dim数组大小dim数组大小数组大小MAX_X数组大小MAX_Y数组MAX_Z,即5维数组。

于 2012-07-13T02:28:16.387 回答
1

从您在构造函数中截取的代码RawChunkWindow看来,您的Ptr类型应该是指向Chunk类型的指针,但您的typedef声明并未反映这一点。而是Ptr指向二维数组char类型的指针,而不是指向三维数组的指针。

所以改变这个:

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 二维数组的指针,编译器抱怨您试图将 3 维 16x128x16 数组指针右值(即unsigned char (*)[16][128][16]右值)分配给错误的指针类型。

作为一个侧节点,如果您打算在堆栈上使用它们,请注意如何声明此对象。Chunk如果维度为 16x128x16,则单个类型实例将占用 32Kb,如果您将太大的值作为dim.

于 2012-07-13T01:51:38.183 回答
0

要以您当前的方式消除错误,您需要更改该行:

窗口[i][j] = &payload[i][j];

窗口[i][j] = &payload[i][j][x];

对于一些小于“ChunkDimensions::MAX_X”的“x”。但是,我不清楚您要做什么,并且几乎可以肯定上述修复不是(可能)。简单来说,您可能正在尝试将 3D 数组的集合存储在一个集合(有效负载)中,并且由于 3D 数组实际上只是 2D 数组的数组,因此您尝试存储指向每个数组的指针这些二维数组在另一个集合(窗口)中。我什至不会在这里使用“dim”,因为这种情况已经足以让人头晕目眩。在任何情况下,使用“std::vector”而不是原始 c 样式数组会容易得多。为了更好地理解使用 c 样式数组的问题(如果由于某种原因您不能使用“std::vector”),C++ 中的二维数组指针操作使用 C++ 中的函数操作多维数组。您可以将我提出的概念扩展到 3D 数组。

于 2012-07-13T14:20:24.943 回答