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++에 비교적 익숙하다. (자바 배경에서 나온다.) 포인터/참조/메모리 관리는 일반적으로 나에게 새롭다.

감사합니다.

+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::vector 또는 std::array을 사용하십시오.

두 번째 가능한 문제점은 ofRandom과 관련됩니다. ofRandom(a,b)이 숫자> = a를 반환하지만 정확히 <을 반환해야합니다. b. 값이 < = b이면, ofRandom(0, objectVector.size() - 1)이 필요합니다. 일반적으로 이와 같은 함수는 < b 값을 반환하도록 작성되었지만 확인해야합니다. sizeof의 운영자가 어레이에 적용하는 경우

0

, 그것은 그 배열의 총 바이트 수를 산출 포인터의하지 사이즈는 어레이 식별자 을 나타낸다. Quote

그래서 당신이 필요로하는 메모리에 의해 전체 배열과 나누기 위해 alocated 공간을 하나 개의 요소 : sizeof(objectList)/sizeof(*objectList).

0

미스터 Fooz는 segfault를 발생시키는 문제를 발견했습니다.

다른 컴파일 문제는 다음과 같습니다 getRandomObject이 유형 Object*을 기대하면서 object*object*[3] :

listOfObjects 2 개 가지 유형으로 선언됩니다.

listOfObjects[]에는 유형이 object*이고 getRandomObjectObject 유형의 요소를 읽고 object을 반환합니다.