2015-09-15 65 views
0

我有一個二維數組組織爲傳遞數組類函數C++

float vertices[3][3] 

在我的計劃中的一個迭代循環,我看到在我的調試器的陣列填滿像這樣:

vertices[0] = {-1, -1, 1} 
vertices[1] = {-1, -.5, .5} 
vertices[2] = {-.5, -1, .5} 

然後我將三個頂點傳遞給我的三角形類。

Triangle *t = new Triangle(vertices[0], vertices[1], vertices[2]); 
triangles.push_back(*t); 

三角形構造函數被編碼爲這樣:

Triangle::Triangle(float *a, float *b, float *c) 
{ 
    memcpy(v1, a, sizeof(a)); 
    memcpy(v2, b, sizeof(b)); 
    memcpy(v3, c, sizeof(c)); 
} 

我的調試器現在顯示

v1 = {-1, -431602080, -431602080} 
v2 = {-1, -431602080, -431602080} 
v3 = {-.5, -431602080, -431602080} 

調試器還示出了A/B/C是僅1個元件長時間? 所以顯然只有數組的第一個元素被傳遞?

+1

您還需要傳遞數組的大小! – CinCout

回答

3

的sizeof(A)

實際上是

的sizeof(浮子*)

這不是3×浮子,它是1個指針。通過附加參數size_t number_of_members_in_array並替換

memcpy(v1,a,sizeof(a));

的memcpy(V1,一個,的sizeof(* A)* number_of_members_in_array);

Triangle::Triangle(float *a, int numA, float *b, int numB, float *c, int numC) 
{ 
    memcpy(v1, a, sizeof(float) * numA); 
    memcpy(v2, b, sizeof(float) * numB); 
    memcpy(v3, c, sizeof(float) * numC); 
} 
+0

這種方法(或使用std :: vector)也可以幫助您稍後將頂點轉換爲相當流行的4元素版本:其中w = 0:Point和w = 1:Vector。 – BitTickler

+0

有趣的是,如果你在代碼中寫入「float a [3];」,那麼sizeof(a)將會是3 * sizeof(float),儘管它不影響你的問題 –

+0

它是簽名參數)。他仍然可以用''float [3] a''而不是''float * a''來寫。即使沒有人這樣做,我甚至忘記了爲什麼通常會避免這種情況,自永恆以來就避免了這種情況。 – BitTickler

0

這裏的問題是你的sizeof運營商的使用,因爲一旦一個數組已經衰減到它失去所有大小信息的指針,而在功能做例如sizeof(a)只會給你的大小,指針而不是它指向的內容。

有一種簡單的方法可以解決C++中的這些問題,也就是使用std::vectorstd::array代替。如果你由於某種原因不想使用那些方便的類,那麼你需要以某種方式將該大小傳遞給該函數,例如參數或作爲模板參數。

0

在你的情況下,sizeof(a)會給你指針的大小,而不是它指向的數據。這是因爲a是一個float指針!(你的情況3)的元素 通行證數目作爲一個參數:

執行此

Triangle::Triangle(float *a, float *b, float *c, int numElements) 
    { 
     memcpy(v1, a, sizeof(a) * numElements); 
     memcpy(v2, b, sizeof(b) * numElements); 
     memcpy(v3, c, sizeof(c) * numElements); 
    } 
0

另一種方法是預期的固定大小float數組:

Triangle::Triangle(const float (&a)[3], const float (&b)[3], const float (&c)[3]) 

但傳遞size或使用std::array<float, 3>std::vector<float>似乎更簡單。

從其他解決方案
0

除此之外,我想指出的是,你的代碼有內存泄漏:

Triangle *t = new Triangle(vertices[0], vertices[1], vertices[2]); 
triangles.push_back(*t); 

當你push_back(*t),你在*t推動分配對象的副本,而不是一個副本指針t。該向量在內部爲另一個Triangle分配空間並將給定的對象複製到其中。在此代碼之後,該指針將丟失,並且分配的對象將被孤立/泄漏。

如果你的意思是讓你的三角形作爲單獨分配的對象,然後triangles應該是vector<Triangle *>和代碼應該是這樣的:

Triangle *t = new Triangle(vertices[0], vertices[1], vertices[2]); 
triangles.push_back(t); 

如果你的意思是保持trianglesvector<Triangle>,那麼你想要更多的東西是這樣的:

Triangle t(vertices[0], vertices[1], vertices[2]); 
triangles.push_back(t); 

或者,如果你的編譯器/ STL實現支持vector::emplace_back(),這是更簡單:

triangles.emplace_back(vertices[0], vertices[1], vertices[2]); 

它將構建直接導入向量中的新條目。