2017-02-12 2 views
-1

Ich erzeuge zufällige Positionen für Meshes und überprüfe, dass sie sich nicht zu nahe an einem anderen Mesh befinden, bevor die generierten Positionen als ihre endgültigen Positionen gesetzt werden. Der Code funktioniert, wenn er nicht in einem Funktionsaufruf verwendet wird, aber wenn er durch einen Funktionsaufruf ausgeführt wird, erzeugt er nur einen Satz von Positionen.Funktion nur Einstellwerte einmal?

Kann jemand erklären, warum das passiert?

+0

Sie verwenden 'Aufruf von value', verwenden Sie' Aufruf von reference' statt. Sonst kopieren Sie Ihre Parameter, anstatt eine Referenz zu übergeben, wie Sie es beabsichtigt haben. – Nidhoegger

Antwort

4

Sie kopieren die std::vector Instanzen in die generateTargets Funktion, daher werden Sie keine Änderungen an den ursprünglichen Vektoren von der Seite des Anrufers sehen.

Die einfachste Lösung besteht darin, sie durch Verweis statt weitergeben müssen:

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

Andernfalls könnten Sie eine std::tuple von Vektoren Rück Funktion Reinheit zu erhalten. Dies wird sehr wahrscheinlich keine zusätzlichen Kosten aufgrund move Semantik und 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)); 
} 

Verbrauch:

std::vector<glm::vec3> positions(targetNum); 
std::vector<glm::quat> orientations(targetNum); 
auto result = generateTargets(std::move(positions), std::move(orientations), targetNum); 
+0

Ich kann nicht glauben, dass ich das verpasst habe! Danke für die einfache Lösung :) –

+0

Ein bisschen unabhängig, aber gibt es eine einfache Art zu sagen "wenn x = x + 'alles bis einschließlich y'", anstatt zu überprüfen, es ist gleich x + 1, x + 2 und bald? –

+0

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