2013-06-30 193 views
0

我想實現一個從對象數組中選擇隨機對象並將其返回給我的函數。它應該是這樣的(在C++而不是僞代碼):從對象數組中選擇一個隨機對象

getRandomObject(objectList) { 
    return objectList[int(random(length of objectList))]; 
} 

我當前的代碼看起來是這樣,但似乎並沒有工作:

//definition of random selector 
object getRandomObject(Object* objectList) { 
    return objectList[int(ofRandom(0, sizeof(objectList)))]; 
}; 

//create a pointer for the listOfObjects 
object* listOfObjects; 

//create an empty object to put the randomly selected object in 
object randomObject; 

//later in the code, populate the array: 
object* listOfObjects[] = { 
    new Object(), 
    new Object(), 
    new Object() 
}; 

//select random object 
randomObject = getRandomObject(listOfObjects); 

但這似乎返回分段錯誤。我注意到了一些問題:

sizeof()返回getRandomObject中指針的大小,而不是數組的大小。有沒有一種很好的方法來獲得數組的大小?它可能涉及到不使用數組的float *指針。這是一個很好的載體用例嗎?

我認爲大部分的問題在於我如何創建我的數組,而不是我如何從他們中選擇隨機對象。我相對較新的C++(來自Java背景),所以大部分指針/引用/內存管理對我來說都是新的。

謝謝!

+0

如果用sizeof(objectList)/ sizeof(object)''更改sizeof(objectList)'會發生什麼? – rendon

+0

我仍然遇到分段錯誤,標準輸出報告sizeof(objectList)/ sizeof(object)是1(而不是3)。 也就是說,如果沒有sizeof(object)它將sizeof(objectList)設爲8,我假設它與指針的大小有關? –

+0

那麼,除非你有特殊的需求(對象列表有什麼其他操作),對象和列表我建議使用一個向量。 – rendon

回答

3

我看到一個確定的問題和一個可能的問題。確切的問題是sizeof(objectList)返回objectList指針的大小,在大多數平臺上它將爲4或8。它不返回數組中元素的數量,objectList。通過陣列的長度或使用std::vectorstd::array

第二個可能的問題與ofRandom有關。確保ofRandom(a,b)返回數字> = a,但嚴格爲< b。如果它返回值< = b,那麼你需要我們ofRandom(0, objectVector.size() - 1)。通常,像這樣的函數被寫入以嚴格返回值< b,但您應該檢查。

0

當sizeof運算符被應用於陣列,它產生的總 數數組中的字節,不指針的大小表示由陣列標識符 。 Quote

所以你需要通過存儲alocated爲您的整個陣列和分裂所需要的空間只是一個元素:sizeof(objectList)/sizeof(*objectList)

0

Fooz先生髮現了導致段錯誤的問題。

其他編譯問題是:

listOfObjects聲明瞭2種不同類型:object*object*[3]getRandomObject需要一個類型Object*

listOfObjects[]包含object*類型的元素,而getRandomObject讀取Object類型的元素並返回object