使用 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维数组。

p>

【讨论】:

【参考方案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、多维数组和指针时出现编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

多维数组

在标准C中,typedef 一样的结构体取两个不同的别名,编译会报错吗?怎么解决?

添加指向数组的指针时出现分段错误

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误

使用 Java 编译器 API 时出现空指针异常

c中多维数组的编译器错误