Vector per Call by Reference Füllen



  • Hallo!

    Ich habe ein kleines Problem mit Vectoren und der Funktionsparameterübergabe per Reference.
    Ich habe einen Vector, den ich per Funktion befüllen möchte. Dbei übegrebe ich als ersten Parameter den zu füllenden Vector und als nachfolgende Parameter die zu füllenden Werte.
    Allerdings scheint das ganze nicht so zu klappen wie ich will, Werte verschwinden wohl einfach aus den eintragungen - und ich habe keine Ahnung wieso.^^"

    Die zwei Funktionen:

    bool insertParticleP(vector<particle* > &arr, particle &obj) {
      try {
        arr.push_back(&obj);
        return true;
      } catch (...) {
        return false;
      }
    }
    
    bool insertParticleW(vector<particle* > &arr, float x, float y, float r, float g, float b, float mass, float density) {//Einen partikel anhand gegebener Werte Pushen
      try {
        arr.push_back(new particle(x,y,r,g,b,mass,density));
        return true;
      } catch (...) {
        return false;
      }
    }
    

    Der Vector selbst ist definiert als

    vector<particle* > particles;
    

    Aufrufen tue ich die Funktion dann foglendermaßen:

    insertParticleW(particles, 150,236,1.0,1.0,1.0,60,d_blei);
    

    Erkennt jemand meinen Fehler und könnte mich gegebenenfalls verbessern?
    Ich danke im Voraus!



  • Wenn die Ausnahme nicht geworfen wird, sollte das klappen. Setz dir an den Anfang der Funktion doch einen Breakpoint und guck zu, was so passiert.



  • Problematisch ist die Funktion insertParticleP: Woher weiss die Funktion, wie lang das übergebene Objekt, dessen Zeiger sie gerade in den Vector stopft, lebt? Wenn es sich um ein lokales Objekt in der aufrufenden Funktion handelt, hast Du nach deren Abarbeitung einen schlechten Zeiger im Vector.

    Achja: Exceptions in jeder Funktion fangen und in einen Fehlercode umwandeln zu wollen führt den Sinn von Exceptions ad absurdum. Der Sinn ist ja gerade, Fehler an höherer Stelle zu fangen (AFAIK kann push_back hier eh nur bad_alloc werfen, und da kannst Du meist auf sehr hoher Ebene - evtl. bereits in main() - kapitulieren und das Programm beenden)



  • Mhhh...sehr verwirrend.

    Die partikel werden ja auch eingetragen, aber merkwürdigerweise haben sie dann keine Werte mehr... es scheint immer nur 0 oder NULL als Wert innerhalb der Objekte eingetragen zu sein. (Ich lasse mir ein paar Werte Testweise ausgeben...)



  • Debug mal anständig ... dann siehst du was drin steht ... nicht was testweise ausgeben ... was soll das denn geben?



  • makkurona schrieb:

    Die partikel werden ja auch eingetragen, aber merkwürdigerweise haben sie dann keine Werte mehr... es scheint immer nur 0 oder NULL als Wert innerhalb der Objekte eingetragen zu sein. (Ich lasse mir ein paar Werte Testweise ausgeben...)

    Vielleicht macht der Konstruktor von particle auch nicht ganz das, was er soll?



  • Deswegen soll der debuggen ...



  • Er trägt die Werte ein, da bin ich mir sicher, ich hatte die Klasse bereits in einem anderen Projekt verwendet, da aber die Vectoren anders befüllt. Diesmal ist es einfacher (und im Endeffekt erfüllts hoffentlich auch seinen Zweck) es auf diese Art und Weise zu lösen.

    PS: Ich habe mal "ordentlich debugged". Ich lasse mir alle Werte in der Main, wo ich sie füllen lasse in eine Datei schreiben und einmal in einer anderen Routine.

    Okay...ich habe etwas getestet, während ich das ganze hier geschrieben habe...und bin zu einem Ergebnis gekommen. --
    War ein Schönheitsfehler innerhalb einer zum Debuggen benutzten Funktion. -
    - Sie hat wohl irgendwie Probleme mit den zurückgegebenen Werten. *seufz*

    Ich danke recht herzlich, jetzt dürfte es funktionieren. >_>



  • Hmm schön das es nun geht, aber ließ dir dennoch mal ein Tutorial zum Debuggen durch ... was du da betreibst ist mehr "loggen" 😉


Anmelden zum Antworten