2013-06-30 237 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