2012-07-13 21 views
1

我在编译下面的代码时遇到了问题。编译器指出:使用typedefs,多维数组和指针时发生编译器错误

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]; 
}; 
+0

数组是邪恶的。 – Managu 2012-07-13 02:31:13

回答

1

从你的代码中的RawChunkWindow构造剪断,它看起来像你的Ptr类型应该是指向Chunk类型,但你typedef声明不反映这一点。相反,Ptr是指向二维数组类型的指针,而不是指向三维数组的指针。

所以更改此设置:

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

这样:

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

这也是你的错误代码报告。 A unsigned char (*)[128][16]是一个指向128x16二维数组的指针,编译器抱怨说您正试图将三维16x128x16数组指针右值(即unsigned char (*)[16][128][16]右值)指定为错误的指针类型。

作为一个旁节点,如果您计划在堆栈中使用它们,请注意如何声明此对象。如果尺寸为16x128x16,则单个Chunk类型实例将占用32Kb,如果传递的值太大,则可能会因为dim的模板参数而导致其中的二维数组很快耗尽堆栈空间。

3

没有你打算做什么的进一步解释,我不能确定,但​​似乎你可能使用了不正确的类型的成员变量。特别地,成员变量窗口的类型为:

窗口:指针的MAX_Z无符号字符MAX_Y数组的数组的大小dim的阵列的大小dim的数组,即指针的2维阵列至2个维阵列。

有效载荷:尺寸MAX_Z的阵列的大小MAX_Y的阵列的大小MAX_X的阵列的大小dim的阵列的大小dim,也就是说,一个5维数组的数组。

0

为了消除错误您目前的方式,则需要更改的行:

窗口[i] [j] = &有效载荷[i] [j];

窗口[i] [j] = &有效载荷[i] [j] [X];

某些“x”小于“ChunkDimensions :: MAX_X”。然而,我不清楚你想要做什么,而上面的修复几乎肯定不是(可能)。简而言之,您可能试图在一个集合(有效载荷)中存储3D数组的集合,并且由于3D数组实际上只是一个2D数组的数组,因此您试图存储一个指向每个这些二维数组在另一个集合(窗口)中。我甚至不会在这里使用“朦胧”,因为这种情况已经足以让人的头部变成一个结。在任何情况下,使用“std :: vector”而不是原始c风格的数组会更容易。为了更好地理解使用c风格数组的问题(如果因为某些原因无法使用“std :: vector”),请参阅我以前对2Dimensional Array Pointer manipulation in C++manipulating multidimensional arrays with functions in C++的回复。您可以将我呈现的概念扩展到3D数组。