Stack Implementation



  • 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.



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

    g++.exe main.cpp -o main.exe
    Das habe ich gemacht. Kein Error, keine Warnung. Vermutlich ist das falsch, aber ich stehe an der gleichen stelle wie der TO.
    Guck dir doch mal die Fragen an:

    plantplant schrieb:

    aber ich kann den Unterbau der Funktionen nicht schreiben.

    plantplant schrieb:

    Was soll Stack *create_stack(unsigned int); bedeuten?

    neues element von stack erzeugen? eine instanz von Stack?

    Denkst du, wer solche Fragen stellt kann seinen Compiler richtig bedienen?
    Er ist absolut am Anfang.

    SeppJ schrieb:

    Die Funktion ist zwar funktional richtig, aber trägt nicht dazu bei, dem Fragesteller beizubringen, wie Objektorientierung in C funktioniert

    DAS ist im Moment auch nicht seine Baustelle. Er kann wie ich keine Zeiger, er kann nicht mal eine Funktion schreiben. Meinst du nicht, vielleicht wäre es erstmal cool, wenn er das könnte?

    SeppJ schrieb:

    (ich schreibe jetzt aber keinen Aufsatz, wie es richtig ginge).

    Prima, das hilft natürlich. Der TO kommt voll nicht klar, dreht sich mit diesem mega kleinen Programm im Kreis, und während ich versuche hinweise zu geben was vielleicht möglicherweise ein Ansatz wäre, jammerst du rum wie schlecht alles ist und verweigerst die Verbesserung.

    SeppJ schrieb:

    Wenn du sagst, dass du Java-Entwickler wärst und eigentlich keine Ahnung vom Thema hast, wieso antwortest du dann?

    Und genau deshalb antworte ich. Weil sonst alle nur laut "Das ist Scheiße" und "Du hast keine Ahnung" schreien und dann ihre Hilfe verweigern.

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

    Nein, sehr falsch. DU hast das Problem des TO nicht verstanden.
    Das Problem des TO hier ist,dass er absolut gar keinen Ansatz findet.

    Auch im Speicher-Thema hast DU das Problem des TO nicht verstanden. Denn sein Problem tritt unabhängig von virtuellem Speicher auf. Mal abgesehen davon gab es wieder nur "Ehhhhh, alles kacke" statt Bereicherung (mit einer Tatsächlichen Ausnahme, die für mich sehr interessant ist, dem TO seine Frage aber nicht besser, bzw gar nicht beantwortet).

    SeppJ schrieb:

    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.

    Den Rest nehme ich einfach mal als Geschenk hin.

    SeppJ schrieb:

    Wie schon gesagt, ist es sehr löblich, als Anfänger mitzudenken, aber es ist was anderes, eine halbgare Antwort zu geben.

    Das ist deine Meinung. Ein Essen muss erstmal halbgar werden, bevor es gar werden kann.
    Denk an deine Anfänge zurück. Womit hast du gekämpft? Worüber hättest du dich gefreut. Die alte Kuh so schnell vergisst, dass sie selbst mal Kalb gewesen ist.

    Das sind halt so etwas von Anfängerfehlern, da lohnt es sich kaum zu antworten.
    

    Und glaubst du, dadurch wird irgend etwas besser? Glaubst du, durch nicht Antworten, macht der TO, oder auch ich, irgend etwas besser?


  • Mod

    🙄 Der Punkt ist: Dadurch, dass du zu helfen versucht, ohne die Antwort zu kennen, machst du alles nur noch schlimmer! Was soll der TE mit deiner Hilfe anfangen? Er und wir müssen sogar noch Zusatzaufwand betreiben, weil wir deine falsche Hilfe als solche kommentieren müssen und er muss diese Kommentare lesen und verstehen. Was meinst du, hätten Bashar, Mechanics, Skym0sh0s und ich in der Zeit tun können? Zum Beispiel dem Threadersteller helfen. Oder dir, wenn du eine Frage gestellt hättest. Stattdessen mussten wir deine falschen Antworten, von denen du anscheinend wusstest, dass sie höchstwahrscheinlich falsch sind, als solche markieren und jetzt auch noch stundenlang mit dir diskutieren, weil du es nicht als selbstverständlich ansiehst, dass man in einem Hilfeforum keine falschen Antworten geben sollte, wenn man von einem Thema nichts versteht.

    Wenn du bei einem Thema mitreden willst, weil du mehr darüber wissen möchtest, dann stell Fragen, anstatt absichtlich falsche Antworten zu geben!



  • @n3wbie
    Wenn du es nicht hinbekommst dir zu ergoogeln wie man in C++ ein Objekt dynamisch erstellt, dann solltest du dir ein anderes Hobby suchen.
    Und wenn der OP das nicht hinbekommt, dann gilt für ihn das selbe.



  • Kann mir jemand sagen wir ich die Buchstaben

    s->push(s, 'a');
    s->push(s, 'b');
    s->push(s, 'c');
    s->push(s, 'd');

    durch die Funktion übergeben kann?

    void push(Stack *, char);

    hab nichts passendes dazu gefunden... top muss ich um 1 erhöhen, das weiß ich.



  • [/code]
    #include "stack.h"
    #include <iostream>
    using namespace std;

    Stack* Stack::create_stack(unsigned int size)
    {
    Stack *s = new Stack;
    s->depth = size - 1;
    s->content = new char[size];
    s->top = 0;
    return s;
    }

    void Stack::push(Stack *, char)
    {
    top++;
    *content = top;

    }

    char Stack::pop(Stack 😉
    {
    top--;
    *content = top;
    return *content;
    }

    int Stack::isEmpty(Stack 😉
    {
    if (top == 0);

    return 0;

    }

    void Stack::destroy_stack(Stack 😉
    {
    delete content;
    content = NULL;
    }[/code]

    Das hab ich soweit zusammengewurschtelt, ich weiß nicht wie ich die isEmpty Methode richtig realisieren soll und auch nicht wie ich depth miteinbeziehen soll. Momentan hab ich eine Endlosschleife.


Anmelden zum Antworten