2012-07-13 47 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數組。