push/pop als eigene Funktionen



  • Moin,

    ich habe ein kleines Programm geschrieben, welches erst 50 Zahlen auf den Heap schreibt und sie danach wieder ausgibt:

    #include <iostream.h>
    
    class heap
    {
    public:
    	heap() {}
    	~heap() {}
    	int getInhalt() const { return itsInhalt; }
    	void setInhalt(int inhalt) { itsInhalt = inhalt; }
    
    private:
    	int itsInhalt;
    };
    
    void main()
    {
    
    	heap *stapel[49];
    	int i;
    	heap *pHeap;
    
    	for(i = 0; i < 50; i++) // push auf den Stapel
    	{
    		pHeap = new heap;
    		pHeap->setInhalt( 100- i*2 );
    		stapel[i] = pHeap;
    	}
    
    		for(i = 0; i < 50; i++) // pop vom Stapel
    	{
    		cout << "Stapel Nr. " << i << " ist ";
    		cout << stapel[i]->getInhalt() << "\n";
    	}
    
    }
    

    Nun will ich die for-Schleifen als eigene Funktionen aufrufen (push, pop).
    Allerdings weiß ich nicht genau, wie ich die am besten integrieren kann.
    Denn nun sind pHeap und stapel "undeclared identifier".
    Beide Funktionen müssen ja Zugriff drauf haben, oder nicht ? Wo soll ich die denn nun am besten definieren ?

    Danke für jegliche Ansätze 🙂

    void push()
    {
    	for(i = 0; i < 50; i++)
    	{
    		pHeap = new heap;
    		pHeap->setInhalt(50-i*2);
    		stapel[i] = pHeap;
    	}
    }
    
    void pop()
    {
    	for(int i = 0; i < 50; i++)
    	{
    		cout << "Stapel Nr. " << i << " ist ";
    		cout << stapel[i]->getInhalt() << "\n";
    	}
    }
    


  • Hi, man würde das zwar anders benennen und anders lösen, aber zu deiner Frage:
    Übergebe stapel an die Funktion, dh du brauchst einen Parameter dafür und pheap kannst du dir in der Funktion nochmal definieren.

    void push(heap *stapel[])
    {
        for(i = 0; i < 49; i++)
        {
            heap *pHeap = new heap;
            pHeap->setInhalt(50-i*2);
            stapel[i] = pHeap;
        }
    }
    
    //... in main
    push(stapel);
    

    Zudem hast du 49 Elemente, die von 0-48 indiziert werden, du zählst aber von 0-49 und andere Kleinigkeiten noch, aber das später 😉



  • zunächst mal:
    1. verwende nicht <iostream.h> sondern <iostream>.
    2. main muss als int main () deklariert werden.
    3. stapel ist ein array von 49 zeigern auf heap, in deiner schleife erzeugst du aber 50 heap-instanzen.
    4. speicher, den du mit new allokierst, musst du mit delete wieder freigeben.
    5. variablen immer erst so spät wie möglich definieren. d.h. die i, welches du nur in der schleifebrauchst, im schleifenkopf und pHeap, welches du nur in der schleife brauchst, auch nur dort.

    beachtest du dies alles, sieht deine funktion dann so aus:

    int main()
    {
    
        heap *stapel[50];   
    
        for(int i = 0; i < 50; i++) // push auf den Stapel
        {
            heap* pHeap = new heap;
            pHeap->setInhalt( 100- i*2 );
            stapel[i] = pHeap;
        }
    
        for(int i = 0; i < 50; i++) // pop vom Stapel
        {
            cout << "Stapel Nr. " << i << " ist ";
            cout << stapel[i]->getInhalt() << "\n";
        }
    
        for(int i = 0; i < 50; ++i)
        { 
            delete stapel[i];
        }   
    }
    

    jetzt zu deiner frage. du musst der funktion, die du aufrufen willst, deinen stapel als parameter übergeben. das funktioniert so:

    void push(heap * * stapel)
    {
        for(int i = 0; i < 50; i++)
        {
            heap* pHeap = new heap;
            pHeap->setInhalt(50-i*2);
            stapel[i] = pHeap;
        }
    }
    
    //aufruf in main:
    push (stapel);
    

    ein array kann in einen zeiger auf dessen erstes element umgewandelt werden.
    die elemente sind zeiger auf heaps.
    kombiniere: dein array wird in einen zeiger auf einen zeiger auf einen stapel umgewandelt.

    abgesehen von dem allen solltest du deine funktionen nicht push und pop nennen, sondern ihnen namen geben, die beschreiben, was sie tatsächlich tun. bspw. fill und print.



  • Moin,

    danke nochmal für die Hilfe, habe versucht eurer Vorschläge umzusetzen, Programm läuft auch und Ausgabe ist auch richtig 🙂

    Vielleicht könntet Ihr nochmal drüber sehen und gucken ob das auch soweit alles stimmt. Danke ! 👍

    PS: Die Zeiger werden nie meine Freunde sein 🤡

    #include <iostream.h>
    
    class heap
    {
    public:
    	heap() {}
        ~heap() {}
        int getInhalt() const { return itsInhalt; }
        void setInhalt(int inhalt) { itsInhalt = inhalt; }
    
    private:
        int itsInhalt;
    }; 
    
    void fuellen(heap * * stapel);
    void ausgeben(heap * * stapel);
    
    void fuellen(heap * * stapel)
    {
        for(int i = 1; i < 51; i++)
        {
            heap* pHeap = new heap;
            pHeap->setInhalt(50-i);
            stapel[i] = pHeap;
        }
    } 
    
    void ausgeben(heap * * stapel)
    {
    	for(int i = 1; i < 51; i++) // pop vom Stapel
        {
            cout << "Stapel Nr. " << i << " ist ";
            cout << stapel[i]->getInhalt() << "\n";
        }
    }
    
    int main()
    {
    
        heap *stapel[51];  
    
        fuellen(stapel);
    	ausgeben(stapel);
    
    	for(int i = 1; i < 51; ++i)
        {
            delete stapel[i];
        }
    
    	return 0;
    }
    


  • Also auf den ersten Blick sieht es gut aus (abgesehen davon, daß du den Platz für stapel[0] verschwendest, die Anzahl fest einkordiert ist - und du deutlich zu viel mit nackten Zeigern hantierst).



  • CStoll schrieb:

    und du deutlich zu viel mit nackten Zeigern hantierst)

    Das stört mich auch etwas..gibt es denn eine bessere Alternative ?



  • Ja, du könntest direkt die Werte in dein Array packen - noch besser ist's natürlich, wenn du mit std::vector<> arbeitest.


Anmelden zum Antworten