Dynmaisches Array mit globalem Scope



  • Hallo zusammen,

    nach stundenlangem hoffnungslosem Brüten hoffe ich, hier geholfen zu werden 😉

    Folgendes: Ich soll einen Stack mithilfe eines dynamischen Arrays erstellen. Dazu soll zu Beginn ein dyn. Array mit 2 Elementen erstellt werden.

    Mittels Funktionen werden dann die üblichen Befehle push(), pop() etc. ausgeführt. Wir sollen jetzt sobald das Array zu klein ist, ein neues Array zur Laufzeit erstellen, das doppelt so viele Elemente wie das erste enthält, den Inhalt des alten hineinkopieren und das alte löschen.

    Meine prinzipielle Vorgehensweise:

    int *stack = new int[2];
    
    void init(int laenge, int uebergabe_param[]) { //nimmt die übergebenen Parameter in den Stack }
    int pop() {}
    void push (element) {}
    void clear ()
    void test() { //Funktion, mit der man über die Kommandozeile den Stack testen kann, indem push, pop etc. aufgerufen werden }
    int main(int argc, int * argv[])
     {
     if(argc > 1) init(argc-1, argv);
     test()
     clear ()
     return 0;
    }
    

    Problem ist jetzt folgendes: Nehme ich an dem Array stack[] Änderungen vor, sind diese schön global sichtbar, so wies sein soll. Jetzt passiert aber entweder bei init() oder push() ein Überlauf, das heisst ich muss das Array grösser machen.
    Also:

    //ganzes stack[] in stat. temp[] umkopieren
    delete [] stack; 
    int *stack = new int[doppelte_länge];
    //temp nach stack kopieren
    //zusätzlich neues Element in stack kopieren
    

    Das funktioniert hervorragend innerhalb von init() und push(). Ausserhalb dieser Funktionen ist von meinem neuen grösseren Array aber rein gar nichts übrig -.-
    Beim Zugriff erhalte ich nur Mist, das Array läuft über und beim Beenden des Programms erscheint:

    a11(5807) malloc: *** error for object 0x100100080: pointer being freed was not allocated
    *** set a breakpoint in malloc_error_break to debug
    Abort trap
    

    Was mach ich falsch? Wie schaffe ich es, innerhalb einer Funktion ein dynamisches Array mit globalem Scope zu erstellen, sodass ich es von allen Funktionen heraus manipulieren und auslesen kann. Bin total verzweifelt, sitze schon den ganzen Nachmittag an diesem Mist....



  • int *stack = new int[doppelte_länge];
    

    Dann ueberleg mal wie lang der zeiger lebt ... und gratulation zum MemLeak 😃



  • suffix schrieb:

    //ganzes stack[] in stat. temp[] umkopieren
    delete [] stack; 
    int *stack = new int[doppelte_länge];
    //temp nach stack kopieren
    //zusätzlich neues Element in stack kopieren
    

    Ich wäre so vorgegangen:

    void check(int neue_länge)
    {
      if (neue_länge<=alte_länge)
        return;
    
      int *new_stack = new int[doppelte_länge];
      //ganzes stack[] in stat. new_stack[] umkopieren
      delete [] stack;
      //zusätzlich neues Element in new_stack kopieren 	
      stack = new_stack;
    }
    

    Die Funktion wird dann von allen anderen Funktionen, die Änderungen am Array vornehmen aufgerufen.
    Ist es eigentlich erlaubt, Klassen zu verwenden?



  • vorgänger schrieb:

    Ich wäre so vorgegangen:

    void check(int neue_länge)
    {
      if (neue_länge<=alte_länge)
        return;
    
      int *new_stack = new int[doppelte_länge];
      //ganzes stack[] in stat. new_stack[] umkopieren
      delete [] stack;
      //zusätzlich neues Element in new_stack kopieren 	
      stack = new_stack;
    }
    

    Die Funktion wird dann von allen anderen Funktionen, die Änderungen am Array vornehmen aufgerufen.
    Ist es eigentlich erlaubt, Klassen zu verwenden?

    Klassen hatten wir noch nicht behandelt, dürfen wir dann wohl auch nicht verwenden...
    Ich verstehe deinen Code nicht so ganz. In dem Moment, wo du delete [] stack; ausführst, ist doch der globale Array weg? Wie funktioniert dann die Zuweisung stack = new stack; ? (Ich nehme an, ich soll hier ganz normal elementeweise umkopieren).

    Zum Beispiel pop() nimmt ja auch Änderungen am stack vor. pop muss ja aber nicht checken ob ein Überlauf stattfinden würde. Kann ich in so einem Fall ganz normal auf stack[] zugreifen?


Anmelden zum Antworten