如何讓我的指針多維數組,其中有一個未知的大小?我已經試過這樣:如何讓我的指針,它有一個未知的尺寸多維數組?
int **triangles;
triangles = new int[numTriangles][3];
,但我得到這個錯誤:
cannot convert 'int (*)[3]' to 'int**' in assignment
如何讓我的指針多維數組,其中有一個未知的大小?我已經試過這樣:如何讓我的指針,它有一個未知的尺寸多維數組?
int **triangles;
triangles = new int[numTriangles][3];
,但我得到這個錯誤:
cannot convert 'int (*)[3]' to 'int**' in assignment
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
謝謝,我想我會用第一個例子,試圖讓事情在簡單越好;) – 2009-02-09 20:14:41
哦,只要你真正開始編碼這種方式,它會得到可怕的複雜;) – 2009-02-09 20:16:43
是的,如果你簡單的螞蟻去其他建議之一。 – 2009-02-09 20:17:07
多維數組++只是語法糖。
int a[n][m];
相當於
int a[n*m];
,所以你只需要一個普通指針 - 即:
int *triangles;
triangles = new int[numTriangles*3];
那麼,錯誤消息說,它:)如果「新的數組,那麼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)()"
)更常見的用途......
要做到這一點,你將不得不遍歷一個維度和其他維度分配空間:
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;
你可能需要編輯你的問題的名稱。 Arrray被拼錯了,問題的名稱比實際的問題更具通用性。 – 2009-02-09 20:09:18