2013-06-30 2 views
0

Я хотел бы реализовать функцию, которая выбирает случайный объект из массива объектов и возвращает его мне. Это должно быть что-то вроде (в C++ вместо psuedocode):Выберите случайный объект из массива объектов

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 (objectList)/sizeof (object)'? – rendon

+0

Я все еще получаю ошибку сегментации, а стандартные выходные отчеты о том, что sizeof (objectList)/sizeof (object) равен 1 (вместо 3). Таким образом, без sizeof (object) он дает sizeof (objectList) как 8, который, как я предполагаю, связан с размером указателя? –

+0

Ну, если у вас нет особых потребностей (какие другие операции вы будете делать с списком объектов?) С объектами и списком, я предлагаю использовать вектор. – rendon

ответ

3

Я вижу одну определенную проблему и одну возможную. Определенная проблема заключается в том, что sizeof(objectList) возвращает размер указателя objectList, который на большинстве платформ будет 4 или 8. Он не возвращает количество элементов в массиве, objectList. Либо пропустите длину массива, либо используйте std::vector или std::array.

Вторая возможная проблема связана с ofRandom. Убедитесь, что номер ofRandom(a,b) возвращает цифры> = a, но строго < b. Если он возвращает значения < = b, тогда вам понадобится ofRandom(0, objectVector.size() - 1). Как правило, такие функции записываются, чтобы возвращать значения строго < b, но вы должны проверить.

0

У C++ есть класс шаблона массива, который вы, возможно, захотите рассмотреть. Посмотрите документацию здесь: http://www.cplusplus.com/reference/array/array/

У этого типа есть метод, size(), который вернет длину массива.

0

Когда оператор SizeOf наносится на массив, он дает общее количество байтов в этом массиве, не размер указателя представлены идентификатором массива. Quote

Так вы берете пространство для всей Кутаиси вашего массива и разделить на памяти нужно только для одного элемента: sizeof(objectList)/sizeof(*objectList).

0

Г-н Фуз заметил проблемы, которые вызывают segfault.

Другое сборник вопросы:

listOfObjects объявлен с 2-х различных типов: object* и object*[3] в то время как getRandomObject ожидает типа Object*.

listOfObjects[] содержит элементы типа object* в то время как getRandomObject считывает элементы типа Object и возвращает object.

Смежные вопросы