2009-02-09 33 views
1

如何讓我的指針多維數組,其中有一個未知的大小?我已經試過這樣:如何讓我的指針,它有一個未知的尺寸多維數組?

int **triangles;

triangles = new int[numTriangles][3];

,但我得到這個錯誤:

cannot convert 'int (*)[3]' to 'int**' in assignment

+0

你可能需要編輯你的問題的名稱。 Arrray被拼錯了,問題的名稱比實際的問題更具通用性。 – 2009-02-09 20:09:18

回答

4
triangles = new int[numTriangles*3]; 

然後訪問它:

triangles[numTriangles*triangleIndex+vertexIndex] = blah; 

但這是乏味和容易出錯的,所以我建議使用boost.multi_array代替,或滾動你自己的(很簡單):

template<class T> 
class Matrix { 
public: 
    Matrix(int _w, int _h) : data(_w*_h), w(_w), h(_h) { 
    } 

    T  & operator()(int x, int y)  { return data[y * w + x]; } 
    T const& operator()(int x, int y) const { return data[y * w + x]; } 

private: 
    std::vector<T> data; 
    int w, h; 
}; 

// usage: 
int main() { 
    Matrix<float> triangles(numTriangles, 3); 
    triangles(triangleIndex, vertexIndex) = blah; 
} 

如果,另一方面,你真正想要的三角形的陣列,而不是二維陣列,只需使用一個vector<Triangle>其中三角是一類:)在C

+0

謝謝,我想我會用第一個例子,試圖讓事情在簡單越好;) – 2009-02-09 20:14:41

+0

哦,只要你真正開始編碼這種方式,它會得到可怕的複雜;) – 2009-02-09 20:16:43

+0

是的,如果你簡單的螞蟻去其他建議之一。 – 2009-02-09 20:17:07

1

多維數組++只是語法糖。

int a[n][m]; 

相當於

int a[n*m]; 

,所以你只需要一個普通指針 - 即:

int *triangles; 
triangles = new int[numTriangles*3]; 
4

那麼,錯誤消息說,它:)如果「新的數組,那麼new將返回一個指向其第一個元素的指針。

多維數組爲數組的數組的另一個名稱。你「newed數組的int[3],而這些正是numTriangles元素。所以,新增功能是返回指向int[3]的指針。變量分配的結果必須有一個類型,它是一個指向3個整數數組:

int (*triangles)[3]; 
triangles = new int[numTriangles][3]; 
triangles[triangleIndex][vertexIndex] = 42; 

當然,類型定義也有助於在這裏:​​

typedef int triangles_t[3]; 
triangles_t * triangles = new int[numTriangles][3]; 

需要括號因爲C++優先規則。他們告訴編譯器,它不是創建一個由三個指向整數的指針組成的數組,而是一個指向3個整數數組的指針。這是類似的函數指針("void (*funptr)()")更常見的用途......

4

要做到這一點,你將不得不遍歷一個維度和其他維度分配空間:

int** triangles; 
triangles = new int*[NUMROWS]; 

for (int i = 0; i < NUMROWS; i++) { 
    triangles[i] = new int[NUMCOLS]; 
} 

但要當這樣做的時候要小心,你必須這樣做才能釋放內存。

for (int i = 0; i < NUMROWS; i++) { 
    delete [] triangles[i]; 
    triangles[i] = 0; 
} 
delete [] triangles; 
triangles = 0;