Problem mit Array von Zeigern


  • Mod

    Sofern du mit nicht dem Zeiger der bei allen gleich ist den Nullzeiger meinst, ist aus deinem Code nicht ersichtlich, was der Fehler ist. Zeig mal mehr Code und/oder schau mal mit dem Debugger wann der Fehler zuerst auftritt.

    P.S.: Du benutzt die magische Zahl 128. Du magst gute Gründe dafür haben, aber es gibt keinen Grund, dich selber so einzuschränken. Benutz einen zentral änderbaren Wert (Template-parameter, const int) und schon hast du mit einem Schlag eine viel universeller benutzbare Klasse, ohne dass du irgendwelche Nachteile für dein konkretes Problem mit der 128 hast.



  • Oder std::map<int, MyObject*>. 😉



  • Es ist eine Menge Code, aber das hier sollte die wichtigsten Abschnitte abdecken und Funktionsweise erläutern.

    class ArrayPtr
    {
       public:
         ArrayPtr()
         {
            for (int i = 0; i < 128; i++)
              arr[i] = 0;
         }
    
         add(int index, MyObject* o)
         {
            arr[index] = o;
         }
       private:
         MyObject* arr[128];
    };
    
    template <class T>
    class MyQueue
    {
       public:
         insert(const T& t)
         {
            q.push(t);
         }
    
         T get()
         {
            return q.front();
         }
    
       private:
         Queue<T>
    };
    
    // Irgendwo werden Objekte erzeugt und in Queue gelegt
    MyQueue<MyObjetc*> q;
    q.insert(new MyObject());
    
    // Von einer anderen Klasse entnommen und verarbeitet
    MyQueue<MyObjetc*> mq = q;
    ArrayPtr.add(mq.get()); // Alle Zeiger haben gleiche Adresse
    


  • Gibt es einen Grund, warum du nicht std::vector bzw. std::stack benutzt?



  • Ja da das Array eine Baumstruktur repräsentiert und viel mit den Indexen gearbeitet wird. Es ist da wesentlich komfortabler mit einem Zeiger-Array zu arbeiten anstatt mit einem stl::vector. Ich würde gerne die Struktur beibehalten, da sonst sehr viele Änderungen am Code erfolgen müssten...

    Übergebe ich die Zeiger falsch?



  • Folgende Stelle

    // Von einer anderen Klasse entnommen und verarbeitet
    MyQueue<MyObjetc*> mq = q;
    ArrayPtr.add(mq.get()); // Alle Zeiger haben gleiche Adresse
    

    Das add(mq.get()) rufst du das dann zyklisch auf?!

    Weil die get()-Methode ja front() von Queue aufruft (was ist das für ein Typ?) und vermutlich keine Elemente aus der Queue entfernt. Das heißt du bekommst immer das erste zurückgegeben.


  • Mod

    Hummel3 schrieb:

    Ja da das Array eine Baumstruktur repräsentiert und viel mit den Indexen gearbeitet wird. Es ist da wesentlich komfortabler mit einem Zeiger-Array zu arbeiten anstatt mit einem stl::vector. Ich würde gerne die Struktur beibehalten, da sonst sehr viele Änderungen am Code erfolgen müssten...

    Übergebe ich die Zeiger falsch?

    Bei deinem Code hast du zu viel verändert um da durchzusteigen. Aber mein Schlüsselwortdetektor springt gerade an: Baumstruktur, Indexe, komfortabel. ➡ Du suchst std::map!



  • Vermutlich hast du sowas:

    for(int i = 0; i < mq.size(); i++)
    {
      ArrayPtr.add(i, mq.front());
    }
    


  • Ja der Aufruf erfolgt zyklisch. Der Index ist in MyObject enthalten. Leider habe ich vergessen ein pop() mit anzugeben, die Elemente werden also entfernt. Beim Debuggen kommen auch so wie es sein soll verschiedene Elemente aus der Queue heraus.

    Ja map wäre eine Lösung, aber bevor ich das ausprobiere muss ich mir nochmal die Übergabe der Zeiger anschauen. Nicht dass ich umbaue und dann gehts immer noch nicht 😕

    Danke erstmal für eure Hilfe, ich werde das alles nochmal im Debug durchlaufen. Da läuft irgendwo etwas falsch. Da programmiert man solange rum und beim ersten Test läuft alles schief 😞



  • So es läuft schon bereits eine Weile. Danke für eure Mühe, 👍 war absolut falscher Alarm! Multithreading macht es einem nicht gerade einfach, und ein irgendwo gesetztes delete auch nicht... Also ein dummer Fehler meinerseits, ich muss echt aufpassen!

    Wie kann ich den Zeiger global auf 0 setzten? So dass alle Verweise 0 sind?


Anmelden zum Antworten