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 のバックグラウンドから来ている) ため、ポインター / 参照 / メモリ管理全般の多くは初めてです。

ありがとう!

4

4 に答える 4

3

1 つの明確な問題と 1 つの可能性のある問題が見えます。明確な問題は、ほとんどのプラットフォームで 4 または 8 になるポインターsizeof(objectList)のサイズを返すことです。objectList配列の要素数は返しませんobjectList。配列の長さを渡すか、 or を使用しstd::vectorますstd::array

考えられる 2 番目の問題は、 に関するものofRandomです。ofRandom(a,b)が数値 >= a を返しますが、厳密には < b であることを確認してください。値 <= b を返す場合は、 us が必要ですofRandom(0, objectVector.size() - 1)。通常、このような関数は厳密に < b の値を返すように記述されていますが、確認する必要があります。

于 2013-06-30T01:15:14.537 に答える
0

C++ には、使用を検討したい配列テンプレート クラスがあります。こちらのドキュメントをご覧ください: http://www.cplusplus.com/reference/array/array/

この型にはsize()、配列の長さを返すメソッド があります。

于 2013-06-30T01:07:11.387 に答える
0

sizeof 演算子が配列に適用されると、配列識別子によって表されるポインターのサイズではなく、 その配列内の合計バイト数が得られます。見積もり

したがって、配列全体に割り当てられたスペースを取り、1 つの要素だけに必要なメモリで割りますsizeof(objectList) / sizeof(*objectList)

于 2013-06-30T01:18:45.730 に答える
0

Fooz 氏は、segfault を引き起こす問題に気づきました。

その他のコンパイルの問題は次のとおりです。

listOfObjectsは 2 つの異なる型で宣言されています: object*object*[3]whilegetRandomObjectは type を期待していObject*ます。

listOfObjects[]タイプの要素を含み、 タイプの要素object*getRandomObject読み取りObject、 を返しますobject

于 2013-06-30T01:36:00.930 に答える