使用 typedef、多维数组和指针时出现编译器错误
Posted
技术标签:
【中文标题】使用 typedef、多维数组和指针时出现编译器错误【英文标题】:Compiler error when using typedefs, multidimensional arrays, and pointers 【发布时间】:2012-07-13 01:41:10 【问题描述】:我在编译以下代码时遇到问题。编译器声明:
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];
;
【问题讨论】:
【参考方案1】:如果没有进一步解释您打算做什么,我无法确定,但似乎您可能为成员变量使用了不正确的类型。特别是成员变量window的类型:
窗口:大小为 dim
的数组、大小为 dim
的数组的指针、MAX_Y
数组的指针、MAX_Z
无符号字符的数组,即指向二维数组的指针的二维数组。
payload:大小为dim
的数组,大小为dim
的数组,大小为MAX_X
的数组,大小为MAX_Y
的数组,大小为MAX_Z
的数组,即5维数组。
【讨论】:
【参考方案2】:从您在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];
这也是您的错误代码报告的内容。 unsigned char (*)[128][16]
是指向 128x16 二维数组的指针,编译器抱怨您试图将 3 维 16x128x16 数组指针右值(即 unsigned char (*)[16][128][16]
右值)分配给错误的指针类型.
作为一个侧节点,如果您打算在堆栈上使用它们,请注意如何声明此对象。如果尺寸为 16x128x16,则单个 Chunk
类型实例将占用 32Kb,如果您将太大的值作为 dim
的模板参数传递,则这些二维数组可能会很快占用您的堆栈空间。
【讨论】:
【参考方案3】:要以您当前的方式消除错误,您需要更改行:
窗口[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”),请参阅我之前对2Dimensional Array Pointer manipulation in C++ 和manipulating multidimensional arrays with functions in C++ 的回复。您可以将我提出的概念扩展到 3D 数组。
【讨论】:
以上是关于使用 typedef、多维数组和指针时出现编译器错误的主要内容,如果未能解决你的问题,请参考以下文章