Stack Implementation



  • Ich weiß trotzdem nicht wie ich implementieren soll



  • Siehe mein erstes Posting.



  • Hab ich ja gelesen aber nur weil eine Ahnung hab was ich machen muss, weiß ich noch nicht wie ich es machen muss & welche Operatoren hier angebracht sind.



  • Du solltest deine Überlegungen zu den Fragen hier posten. Dann gehts weiter.

    Sorry, aber falls es bisher irgendwie noch unklar geblieben ist: Ich werde dir die Lösung nicht auf dem Silbertablett präsentieren.



  • Ich weiß trotzdem nicht wie ich implementieren soll

    Kleine Hilfe:

    Stack* create_stack(unsigned int); {
    neues element von Stack erzeugen. 
    }
    
    void push(Stack *, char);{
    Bei Stack* ein Stack-Elemement übergeben. 
    Das Char am Ende anhängen. 
    depth um 1 ehöhen
    }
    
    char pop(Stack *); {
    das char an stelle "depth" auslesen. 
    Depth um 1 verringern. 
    char zurück geben
    }
    
    int isEmpty(Stack *);{
    könnte (vermutlich) depth zurück geben. 
    }
    
    void destroy_stack(Stack *);{
    Element wieder auflösen. 
    }
    


  • Total kontraproduktiv. 😕 Deine "Hilfe" ignoriert zudem die vorgegebene Bedeutung der struct-Member depth und top. Genau deshalb hab ich den OP doch gebeten, sich über diese Bedeutung erstmal klar zu werden ... wie sieht ein typisches Stack-Objekt eigentlich aus? Danach ergibt sich die Implementierung schon fast zwangsläufig.



  • Stack *s; (Der Zeiger s zeigt auf die Struktur Stack ?)
    s = create_stack(3); (Der Zeiger s zeigt auf die Funktion create_stack mit 3 Rückgabewerten?)



  • Jop. Meinte Top statt Depth.
    Wenn ich an seiner / ihrer Stelle wäre, würde es mir helfen. Also schreib ich auch.
    Und darauf, dass ich mit "top" bestimme(n könnte) wie voll der Stack ist statt mit Depth, hätte ich dann schon von selbst gemerkt.

    EDIT

    Stack *s; (Der Zeiger s zeigt auf die Struktur Stack ?)
    s = create_stack(3); (Der Zeiger s zeigt auf die Funktion create_stack mit 3 Rückgabewerten?)

    Stack *s ist eine Variable die auf ein Stack-Objekt zeigen könnte.

    create_stack(3); gibt ein Stack-Objekt zurück. *s zeigt auf dieses.



  • danke für die hilfe aber mir fehlt es eher an werkzeug.

    neues element von stack erzeugen? eine instanz von Stack?

    mfg



  • n3wbie schrieb:

    Jop. Meinte Top statt Depth.

    Wenn es so einfach wäre, hätte ich das schon gesehen und das auch geschrieben. Ist es aber nicht, z.B. soll top auf ein freies Feld zeigen. Bitte bedenke auch, dass der OP auf dem Level auch triviale Fehler in der Hilfe nicht immer selbst erkennen oder gar korrigieren kann.


  • Mod

    plantplant schrieb:

    neues element von stack erzeugen? eine instanz von Stack?

    Bitte benutze ganze Sätze. Ich weiß nicht, was du wissen möchtest. Kennst du die Begriffe der objektorientierten Programmierung nicht? Oder weißt du nicht, wie du diese Konzepte in C* umsetzen kannst? Oder ganz was anderes?

    *: Falls du dir dessen nicht bewusst bist: Auch wenn du gerade im C++-Forum fragst, so ist dein Code doch typisches C, mit einer einzigen (unnötigen) Zeile C++. Sogenanntes "C mit cout". In C++ würde man Objektorientierung ganz anders umsetzen, da sie direkt von der Sprache her unterstützt wird und du dir das ganze create, destroy und Pointergefummel sparen kannst (oder man nimmt den Stack aus der Standardbibliothek, aber ich kann durchaus nachvollziehen, dass man das vielleicht einmal selber programmieren sollte. Aber wie gesagt, in C++ ginge das ganz anders).



  • plantplant schrieb:

    danke für die hilfe aber mir fehlt es eher an werkzeug.

    neues element von stack erzeugen? eine instanz von Stack?

    mfg

    Weisst du wie man in C (bzw. C++ - je nachdem was es denn werden soll) Speicher anfordert?



  • Ja bei c++ mit "new", wobei ich dann doch auf den heap zugreife, in der Aufgabe es doch aber um den stack geht?!

    Die Vorlesung behandelt c++, ich muss eben versuchen die Aufgabe so c++-typisch wie möglich zu lösen ohne das vorgegeben zu verändern. Ich bin zum einen von diesem Zeigergefummel wie du schon gesagt hast, durcheinander, und zum anderen weiß ich nicht mit welchen Operatoren ich hier ansetzen soll.

    mfg


  • Mod

    plantplant schrieb:

    Ja bei c++ mit "new", wobei ich dann doch auf den heap zugreife, in der Aufgabe es doch aber um den stack geht?!

    Du bringst da ein paar Sachen durcheinander.
    Heap
    Heap
    Stack
    Stack
    Du sollst hier die Datenstruktur "Stack" implementieren.

    In C++ benutzt man übrigens so gut wie nie new, zumindest keines, das nicht sehr gut versteckt ist.



  • Ich dreh mich im Kreis...

    Ich kann doch struct wie eine Klasse behandeln oder?

    und bräuchte ich nicht 3 dateien? eine main.cpp eine stack.h und eine stack.cpp. Ich bin mir gerade doch unsicher wo ich die funktionen überhaupt definieren soll...



  • #include <iostream>
    
    using namespace std;
    
    struct Person {
      int age;
    };
    
    Person* create_person1(int age);
    Person* create_person2(int age);
    Person create_person3(int age);
    
    int main() {
    	struct Person *emil = create_person1(15);
    	struct Person *paul = create_person2(16);
    	struct Person lisa = create_person3(17);
    
    	cout<<"Emils Alter: ";
    	cout<<emil->age<<endl;
    	cout<<"Pauls Alter: ";
    	cout<<(*paul).age<<endl;
    	cout<<"Lisas Alter: ";
    	cout<<lisa.age<<endl;
    
    	return 0;
    }
    
    struct Person* create_person1(int age) {
    	struct Person *newPerson;
    	newPerson->age = 15;
    
    	return newPerson;
    }
    
    struct Person* create_person2(int age) {
    	struct Person *newPerson;
    	(*newPerson).age = 15;
    
    	return newPerson;
    }
    struct Person create_person3(int age) {
    	struct Person newPerson;
    	newPerson.age = 15;
    
    	return newPerson;
    }
    

    5 min gegoogled. 3 Möglichkeiten gefunden ein Element von Struct zu erzeugen.
    Der Code ist nicht getestet und da ich selbst grade erst mit C++ anfange wird er vermutlich auch nicht laufen 🤡
    Aber so in etwa wird es funktionieren.

    Und lass das alles erstmal in einer Datei. Auslagern kannst du später immer noch.

    Scheint auch C mit cout zu sein. Kann ich leider noch nicht so ganz beurteilen 🙂



  • Was für ein Scheiß...


  • Mod

    n3wbie, es ist ja sehr löblich, dass du als Anfänger auch selber über Fragen nachdenkst. Aber wenn du helfen willst, dann sei dir bitte halbwegs sicher, ob deine Antwort auch stimmt. Wenn du selber sagst, dass du dich nicht auskennst und du nicht einmal den Code getestet hast, dann ist deine Antwort sehr wahrscheinlich nicht richtig. In der Tat ist genau das passiert: Alle drei von deinen Versionen gehen entweder voll am Thema vorbei oder sind schlichtweg falsch. Und zwar richtig schlimm falsch, nicht bloß schlecht.

    Ich muss leider sagen, dass dies bei vielen deiner Antworten der Fall ist, nicht nur in diesem Thread.



  • Wenn du selber sagst, dass du dich nicht auskennst und du nicht einmal den Code getestet hast, dann ist deine Antwort sehr wahrscheinlich nicht richtig.

    WTF. MinGW geladen, compiliert und läuft. Keine Fehler, keine Warnung.
    Ja, das macht es nicht unbedingt richtig. Und es ist auch nicht als Lösung gedacht gewesen. Sondern als bsp. dafür wie schnell man zeigen kann, dass man an Eigenleistung interessiert ist. Und ich muss sagen, so beschissen das auch aussehen mag, ich sehe es lieber als: geht alles nicht, macht ihr mal.

    Und zwar richtig schlimm falsch, nicht bloß schlecht.

    Prima, vielleicht schreibst du besser wie es richtig geht. Ich will es ja selbst lernen.
    Und ohne dich angreifen zu wollen, in diesem Thema ist absolut gar nichts produktives, was den TO auch nur ein bisschen auf die richtige Spur bringt.

    Ich muss leider sagen, dass dies bei vielen deiner Antworten der Fall ist, nicht nur in diesem Thread.

    Auch das würde ich zu gerne sehen. Bei den 3 Fachbezogenen Antworten die ich gegeben habe.


  • Mod

    n3wbie schrieb:

    ....

    Das sind halt so etwas von Anfängerfehlern, da lohnt es sich kaum zu antworten. Wenn man jeden Stuss, den jemand schreibt im Details korrigiert, dann kommt man nie zu irgendwas produktivem. Außerdem hast du eigentlich auf jede deiner falschen Antworten schon Kontra bekommen, du hast dich bloß hinterher versucht mit fadenscheinigen Argumenten rauszureden. Darauf hat dann bloß keiner mehr geantwortet, weil es sich nicht lohnt, deine Ausreden auch noch mal zu widerlegen. Aber schön, ausnahmsweise schreib ich mal was zu allen deinen fachlichen Beiträgen. Aber sag hinterher nicht, ich würde dich absichtlich runtermachen. Wenn du um eine Liste deiner Fehler bettelst, dann bekommst du eben auch eine:

    WTF. MinGW geladen, compiliert und läuft. Keine Fehler, keine Warnung.

    Dann kannst du deinen Compiler nicht benutzen. MinGW basiert auf GCC. GCC gibt folgende Warnungen, wenn man ihn korrekt nutzt:

    test.cc:28:16: warning: unused parameter ‘age’ [-Wunused-parameter]
     struct Person* create_person1(int age) {
                    ^
    test.cc:35:16: warning: unused parameter ‘age’ [-Wunused-parameter]
     struct Person* create_person2(int age) {
                    ^
    test.cc:41:15: warning: unused parameter ‘age’ [-Wunused-parameter]
     struct Person create_person3(int age) {
                   ^
    test.cc: In function ‘Person* create_person1(int)’:
    test.cc:30:24: warning: ‘newPerson’ is used uninitialized in this function [-Wuninitialized]
         newPerson->age = 15;
                            ^
    test.cc: In function ‘Person* create_person2(int)’:
    test.cc:37:26: warning: ‘newPerson’ is used uninitialized in this function [-Wuninitialized]
         (*newPerson).age = 15;
                              ^
    

    Das Resultat mal mit valgrind ausgeführt:

    ==13823== Memcheck, a memory error detector
    ==13823== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
    ==13823== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
    ==13823== Command: ./a.out
    ==13823== 
    ==13823== Use of uninitialised value of size 8
    ==13823==    at 0x400967: create_person1(int) (test.cc:30)
    ==13823==    by 0x4008AE: main (test.cc:14)
    ==13823== 
    ==13823== 
    ==13823== Process terminating with default action of signal 11 (SIGSEGV)
    ==13823==  Bad permissions for mapped region at address 0x400A3D
    ==13823==    at 0x400967: create_person1(int) (test.cc:30)
    ==13823==    by 0x4008AE: main (test.cc:14)
    ==13823== 
    ==13823== FILE DESCRIPTORS: 3 open at exit.
    ==13823== Open file descriptor 2: /dev/pts/66
    ==13823==    <inherited from parent>
    ==13823== 
    ==13823== Open file descriptor 1: /dev/pts/66
    ==13823==    <inherited from parent>
    ==13823== 
    ==13823== Open file descriptor 0: /dev/pts/66
    ==13823==    <inherited from parent>
    ==13823== 
    ==13823== 
    ==13823== HEAP SUMMARY:
    ==13823==     in use at exit: 0 bytes in 0 blocks
    ==13823==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
    ==13823== 
    ==13823== All heap blocks were freed -- no leaks are possible
    ==13823== 
    ==13823== For counts of detected and suppressed errors, rerun with: -v
    ==13823== Use --track-origins=yes to see where uninitialised values come from
    ==13823== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
    Segmentation fault (core dumped)
    

    Ups, Segfault. Tja, war wohl doch nicht richtig.

    Die Fehler sind absolute Anfängerfehler:

    struct Person *newPerson;
        newPerson->age = 15;
    

    newPerson zeigt auf nix. Zeiger nicht verstanden. C++-Objektmodell nicht verstanden. Wozu überhaupt ein Zeiger? Du hast nicht verstanden, was die Funktion machen soll, noch wie Zeiger und Objekte funktionieren.

    create_person2: Gleiche Fehler wie bei Version 1.

    struct Person create_person3(int age) {
        struct Person newPerson;
        newPerson.age = 15;
    
        return newPerson;
    }
    

    Du hast nicht verstanden, wowum es hier überhaupt geht. Die Funktion ist zwar funktional richtig, aber trägt nicht dazu bei, dem Fragesteller beizubringen, wie Objektorientierung in C funktioniert. So wie hier geht das nämlich nicht (ich schreibe jetzt aber keinen Aufsatz, wie es richtig ginge).

    Dann noch 3 weitere falsche Antworten von dir:
    1. http://www.c-plusplus.net/forum/p2422550#2422550
    Thema nicht verstanden. Siehe Bashars darauf folgenden Kommentar.

    2. http://www.c-plusplus.net/forum/p2422228#2422228
    Thema verfehlt oder nicht verstanden. Siehe Bashars darauf folgenden Kommentar.

    3. http://www.c-plusplus.net/forum/p2422683#2422683
    Thema nicht verstanden. Siehe Skym0sh0s darauf folgenden Kommentar. Du willst Speicherverwaltung eines Betriebssystems erklären und kommst mit einer Erklärung zu einem 16-Bit OS, ohne virtuellen Speicher? Dabei ist doch sogar das Hauptproblem des Threaderstellers, dass er virtuellen Speicher nicht verstanden hat.

    Drei Mal eine total kontraproduktive Hilfe, weil du das Thema selbst nicht verstanden hast, noch begriffen hast was überhaupt das Problem der Threadersteller ist.

    Und hier noch deine fadenscheinigen Ausreden zum jeweiligen Thema:
    1. http://www.c-plusplus.net/forum/p2422555#2422555
    Du hast nicht einmal verstanden, was an der Antwort falsch war. Siehe Bashars darauf folgenden Kommentar. Du hast gar nicht verstanden, worum es in diesem Thread überhaupt geht oder wie die richtige Lösung auch nur im Ansatz aussieht.

    2. http://www.c-plusplus.net/forum/p2422233#2422233
    Noch einmal die gleiche Allgemeinfloskel, in anderen Worten. Immer noch am Thema vorbei. Deine Begründung, warum es nicht am Thema vorbei wäre, ist eine Wiederholung dessen, was du schon geschrieben hast.

    3. http://www.c-plusplus.net/forum/p2422706#2422706
    Wenn du meinst, dass es reicht, virtuellen Speicher zu erwähnen, wieso tust du es dann nicht. Wieso erklärst du stattdessen, wie vor 30 Jahren der Stand der Technik war? Wenn du sagst, dass du Java-Entwickler wärst und eigentlich keine Ahnung vom Thema hast, wieso antwortest du dann?

    Wie gesagt, mache ich das gerade nur, weil du darum gebettelt hast, sonst würde ich jemandem nicht so detailliert so viele Vorwürfe machen. Wie schon gesagt, ist es sehr löblich, als Anfänger mitzudenken, aber es ist was anderes, eine halbgare Antwort zu geben. Wenn du von Speicherverwaltung in modernen Betriebssystemen, Objektorientierung in C oder von den Feinheiten bei der Wahl einer Programmiersprache keine Ahnung hat, dann fragt man lieber selber was dazu, als dass man vollkommen veraltete Beschreibungen, ungetestete Eigenlösungen oder triviale Allgemeinfloskeln zum besten gibt.


Anmelden zum Antworten