2013-05-07 70 views
0

我有類變量聲明爲編譯時已知大小不變:如何在C++中將指針表示的二維數組轉換回二維數組?

static const int array[5][5]; // constants initlialised in another place

而且,幾乎返回它的函數:

virtual const int** getArray() { return array; }

如何獲得這個數組用這種方法,並將其轉換爲固定大小的數組,而不是基於指針的,所以我可以使用它像cout << data[2][2]

樣品是不到風度編譯:

const int[5][5] data = object->getArray(); 
cout << data[2][2]; 

樣品,編譯但崩潰的應用程序:

const int** data = object->getArray(); 
cout << data[2][2]; 

注:一個解決方案是創建typedef arr[5]arr*聲明的方法,但我不我想創建一個typedef爲每個編譯時的大小,我使用像typedef arr5[5]; typedef arr10[10]等。我正在尋找更類似於:

const int(*)[5] data = object->getArray(); // won't compile, example only

我們假設編譯時間常量數組裝載有動態的DLL和已在內存中,是否有可能使用此數據作爲數組不分配新的內存和編譯時間常數填充它?

+0

就像我在上一個問題,說'const int的**'是不一樣的指針與二維數組。它不這樣工作。你不能施放它。如果需要,你可以將'const int *'強制轉換爲'const arr *',其中'arr'是一個typedef。 – 2013-05-07 08:44:24

+0

'getArray'函數沒有意義,並且不是有效的C++。 – 2013-05-07 08:44:37

回答

2
virtual const int** getArray() { return array; } 

這不行,不應該編譯;你試圖返回一個指向某些指針的指針,但是沒有指向指針的指針,只有一個數組的數組。

可以返回一個指向那些陣列,保留型:

virtual const int (*getArray())[5] { return array; } 
const int (*data)[5] = getArray(); 
cout << data[2][2]; 

在C++ 11,它可能是更好的包裹陣列起來std::array,並返回到一個參考,以避免一些令人討厭的語法。

0

這是不可能的。當數組傳遞給函數或從函數返回時,會丟失所有大小信息。數組衰變爲指針,以便說話

+0

好吧我失去了它,但記住,我知道它在編譯時 - 我可以使用這些信息來返回這個數組(像「力維」)? – 2013-05-07 08:44:31

1

使用std::array

#include <array> 

static const std::array<std::array<int, 5>, 5> myarray; // constants initlialised in another place 

virtual const std::array<std::array<int, 5>, 5>& getArray() const 
{ 
    return myarray; 
} 

如果你沒有C++ 11的支持,您可以使用std::tr1::arrayboost::array(或推出自己的固定大小的數組類型)

+0

這是一個完整的編譯時解決方案嗎?如果我的原始陣列需要10MB的內存,這個解決方案是否需要10MB或20MB? (分配動態10MB並從10MB常量中初始化它)。我們討論動態DLL環境,讓我們假設所有編譯時常量都在內存中! – 2013-05-07 08:46:09

+0

@killer_PL它將具有與2D陣列相同的尺寸。沒有動態內存分配。它應該與您的靜態二維數組示例相同。 – juanchopanza 2013-05-07 08:49:03

0

這是很簡單,你幾乎沒有

const int(*)[5] data = reinterpret_cast<int(*)[5]>(object->getArray()); 
+0

這不想編譯:'錯誤:在'const'之前期望primary-expression,錯誤:expected';'在'const'之前(用G ++編譯) – 2013-05-07 08:53:13

+0

錯誤說'在'const'之前,這似乎表明前面的行有錯誤。 – john 2013-05-07 09:19:11