2011-11-05 174 views
0

我有全局變量:轉換矢量陣列問題

point4 * mypoints; 
color4 * mycolors; 

和代碼塊那是一個函數drawPlyFiles

vector<point4> retpolys; 
retpolys.resize(polynum * 3); 
GLint polyx, polyy, polyz; 
for (int i = 0; i < polynum; i++) 
{ 
    inStream >> polyx; 
    inStream >> polyx >> polyy >> polyz; 
    //cout << "x: " << polyx << " y: " << polyy << " z: " << polyz << "\n"; 
    retpolys[i*3] = retVerts[polyx]; 
    retpolys[(i*3) + 1] = retVerts[polyy]; 
    retpolys[(i*3) + 2] = retVerts[polyz]; 
    //retpolys[i] = point4(polyx, polyy, polyz, 1.0); 
} 

mypoints = &retpolys[0]; 
return true; 

最重要的部分的一部分,以從代碼拿走,是我設置全局mypoints(數組)等於retpolys(向量)。 Retpolys獲取來自for循環的數據。當我調試時,retpolys中的所有數據都是正確的。 (retVerts是point4的向量)

後來在我的主要初始化函數此獲取運行:

drawPlyFile("ply_files/airplane.ply"); 
//colorcube(); 
point4 temp = mypoints[1]; 
int thissize = sizeof(mypoints)/sizeof(mypoints[0]); 
for (int i = 0; i < thissize; i++) 
{ 
    mycolors[i] = color4(0.0, 0.0, 0.0, 1.0); 
} 

代碼編譯罰款,但我有一個運行時異常。我調試才能找到問題。我在drawPlyFiles之後檢查了mypoints的值,看起來它只包含一個指向retpolys開始位置的指針。然而,當我調試時,它不會讓我查看數組的其他部分,只是第一個指針(當函數中有im時,我可以看到retpolys的所有單獨值),然後檢查這個大小的值,然後我得到一個像-12894161這樣的數字,這是沒有意義的,因爲它應該是mypoints的大小。

我認爲問題在於從retpolys轉換到mypoints,但我不知道如何解決它,或者即使這是錯誤的實際原因。任何幫助?

p.s.我希望mycolors擁有與mypoints相同數量的元素,並且所有em都是color4(0.0,0.0,0.0,1.0)

回答

2

以下行不正確:

mypoints = &retpolys[0]; 

在這裏,你會以指針上,當你退出該功能被自動銷燬向量的內容。矢量析構函數將釋放這段內存,使您的全局變量指向一個釋放的內存空間。

您應該進行實際的內存分配並複製內容。

+0

我從http://stackoverflow.com/questions/2923272/how-to-convert-vector-to-array-c得到的方法。但是你要說的是,vector函數在函數退出時被釋放,所以指針不是vector的開始,但是在內存中只是一個沒有意義的位置。你的意思是做一個實際的內存分配?你的意思是我應該讓該函數返回矢量並在全局空間中進行轉換? – y3di

+0

你可以像上面提到的羅賓那樣做,讓「mypoints」成爲一個實際的向量而不是一個指針。它會簡化你的代碼和內存管理:「std :: vector mypoints;」。然後,在drawPlyFile中:「mypoints = retpolys;」。儘管這是一個建議,但您可能有限制,導致此示例無法使用。 –

1

您並未將任何數組設置爲等於任何值;你只是存儲一個指向vector的第一個元素的指針;當矢量超出範圍時,這不再有效。

的確,mypoints不是陣列

爲什麼不只是保持矢量?當你需要一個指針(可能傳遞給第三方圖形API),那麼你可以在最後的時刻做到這一點。

+0

編輯:對不起,並不意味着評論 – y3di

1

在C++中,當你聲明這樣的變量:

vector<point4> retpolys; 

它的存儲類是自動的。這意味着當範圍變量聲明在結束時,用於保存內容的內存被自動釋放(並且如果它是一個類,析構函數被調用)。在你的情況下,這意味着當drawPlyFiles函數結束時,retpolys內容被​​釋放。你巧妙地通過返回一個指向vector中第一個值的指針來解決這個問題。這不會工作 - 內容已被釋放。即使有時它有效也是不正確的。

你真正想要做的是爲你自己分配retpolys的內容。這不是讓編譯器根據作用域設置內存,而是使用新運算符來分配它。例如:

vector<point4> *retpolys = new vector<point4>; 

當引用retpolys時,您需要更改函數其餘部分的語法。