2017-02-12 6 views
-1

私は、生成された位置を最終的な位置に設定する前に、メッシュのランダムな位置を生成し、それらが他のメッシュにあまり接近していないことを確認しています。このコードは、関数呼び出しで使用されていないときに機能しますが、関数呼び出しによって実行されるときは、1セットの位置だけが生成されます。機能は値を1回だけ設定しますか?

これはなぜ起こるのか説明できますか?

+0

。それ以外の場合は、意図したように参照を渡すのではなく、パラメータをコピーします。 – Nidhoegger

答えて

4

インスタンスをgenerateTargets関数にコピーしているため、呼び出し元側の元のベクトルに変更はありません。

最も簡単な解決策ではなく、参照によってそれらをを渡すことです:

void generateTargets(
    std::vector<glm::vec3>& positions, 
    std::vector<glm::quat>& orientations, 
    int targetNum) { // ... 

そうでない場合は、あなたが機能純度を維持するために、ベクトルのstd::tupleを返すことができます。これにより、の移動セマンティクスとRVOのため、追加コストが発生する可能性はほとんどありません。

auto generateTargets(
    std::vector<glm::vec3> positions, std::vector<glm::quat> orientations, int targetNum) 
{ 
    // ... 
    return std::make_tuple(std::move(positions), std::move(orientations)); 
} 

使用法:

あなたが代わりにreference`で[値]による呼び出し、使用 `コールを使用
std::vector<glm::vec3> positions(targetNum); 
std::vector<glm::quat> orientations(targetNum); 
auto result = generateTargets(std::move(positions), std::move(orientations), targetNum); 
+0

私はそれを逃したと信じられない!簡単な解決法をありがとう:) –

+0

ビットは無関係ですが、x + 1、x + 2と等しいかどうかを調べるのではなく、「x = x + 'y'を含むものまで」という単純な方法がありますそう? –

+0

uh ... 'x <= x + y'? –

関連する問題