Stapel => push



  • Hallo Programmierpraktikum-Geschädigte und nette Menschen, die uns helfen,

    Auch mir geht es so... Egal wie ich den Quelltext gestalte, immer kommt bei mir "Syntax-Error before create". Kann das am Compiler liegen (benutze DEV-C++)?? Ich mein, ich bekomm gar nicht die Fehlermeldungen, die schon erwähnt wurden, weil halt schon immer vorher ein Fehler auftritt. Hier beispielsweise mein create Funktion zu TStackA

    #include <stdio.h>
    #include <stdlib.h>
    
    struct TStackA 
    {
      void** info; 
      int maxGroesse;
      int pos;
    };
    
      TStackA stapel; // egal was ich mache kommt hier ein Fehler bzw.
      int anzahl = 0; // unten bei TStackA creat()
    
    TStackA create()
    {
    
      stapel.info = (void **)malloc(sizeof(int));  // Reservierung Speicherbereich in Groesse "int"
      stapel.info = 4;          //Stapelinformation, welche auf Stapel gelegt wird
    
      stapel.maxGroesse;    //Stapelgroesse
    
      stapel.pos = 0;       //Feldposition
    
      return stapel;    //RG von Veranderung des Stapels
    }
    

    Vielen Dank für eure Hilfe im Voraus!



  • @BartMan
    Das Programm, dass du bekommen hast ist als c Dokument gespeichert. Editiere mal die Endung auf *.cpp, dann kommt keine Meldung beim create mehr.



  • In C müssen Funktionen, die keine Parameter haben, das explizit durch void angeben.

    TStackA create(void)
    


  • hab das gleiche problem

    die vorgabe ist c und nicht c++ und lehvis wird sicher auch nur ein c programm annehmen. also bringt es nichts das ding auf .cpp zu ändern

    sonst könntest du ja gleich die c++ klassen dafür nehemen 😃
    in c++ könntest du sogar das struct weg lassen.

    wäre eine möglichkeit:

    typedef struct TStackA 
    {
      void** info; 
      int maxGroesse;
      int pos;
    }TStackA;
    

    in C brauchst du immer ein typedef (,oder?)

    diese aufgabe spiegelt leider auch die vorlesung des prof´s B. wieder. er mischt ständig c mit c++ und das was in C ist entspricht nicht mal dem C99 👎



  • dap schrieb:

    hab das gleiche problem

    Schau mal meinen Post an.

    dap schrieb:

    wäre eine möglichkeit:

    typedef struct TStackA 
    {
      void** info; 
      int maxGroesse;
      int pos;
    }TStackA;
    

    in C brauchst du immer ein typedef (,oder?)

    Wenn du das Schlüsselwort struct in Deklarationen weglassen willst, ja. (Okay, es ginge auch über ein Makro, aber lassen wir das...)

    Dein Konstrukt sollte aber eher so aussehen:

    typedef struct // hier kein Bezeichner
    {
        void** info; 
        int maxGroesse;
        int pos;
    } TStackA;
    


  • ohne dem typedef oder makro kann man sonst die funktion (vorgeabe)
    TStackA create(){} nicht aufrufen, weil beim compilieren ja schon der fehler kommt das er mit dem TStackA nix an zu fangen weiß

    allg. tuh ich mich mit dem anblick des "void**" schwer. zumal der den wert in der main-funktion als integer ausgeben soll und in der eingabe mit scanf kann man auch nur eine zahl eingeben. daher verstehe ich denn sinn überhaupt nicht. und ich denke das da schnell laufzeitfehler entstehen können 😕



  • Hi

    habe die selbe aufgabe gestellt bekommen,
    ich glaube das dass *void dazu dient um in C verschiedene komplexe Datenstrukturen zu speicher, also structs.

    da wir ja **void verwenden erzeugen wir eine Liste, ein array von vielen *voids
    somit kann man leicht hinzufügen wie bei normalen array.

    TStackA push(void* info, TStackA oldStack)
    {
      next = info;
      if (oldStack.pos < oldStack.maxGroesse){
        oldStack.info[oldStack.pos++] = next; // next info wird im info Feld gespeichert, danach pos erhöht um 1
      }
      else {  // wenn kein Platz mehr, erhöhe um 50%
        oldStack.info = (void**)realloc(oldStack.info, (oldStack.maxGroesse + oldStack.maxGroesse / 2));
        oldStack.info[oldStack.pos++] = next; // next info wird im info Feld gespeichert, danach pos erhöht um 1
     }
      return oldStack;
    }
    

    gruß



  • next ist ein void* next;

    eigentlich ist der überflüssig er zeigt nur noch mal deutlich, das es sich um ein nächstes element handelt.

    meine ausgabe ist äußert komisch, ich weis nicht wie ich den inhalt dieses pointer auf pointer ausgeben kann.

    er gibt mir immer nur die adresse aus, wenn ich info[stack.pos] anspreche sollte er eigentlich den inhalt davon ausspucken, nicht wieder den pointer auf die pos.

    gruß



  • Du brauchst *info[stack.pos].



  • HHHIIIIIILLLLLLFFFFFFFEEEEEEE!!!!!!!!

    Ich hab genau die gleichen Probleme wie alle andern auch.
    Mein Programm sieht noch genauso aus wie am Anfang, d.h. meine Vorgage ist immernoch unverändert. 😮
    Und bei den Lösungsansätzen hier verstehe ich rein garnichts.
    Ich bekomme nicht mal das create() hin und hab auch nicht die leiseste Ahnung, wie ich das anstellen soll.

    Ich hoffe, mir kann jemand helfen.



  • ja genau, poste doch mal bitte einer seine lösung 😉 darüber werden sich noch die nächsten generationen von programmierpraktikumsopfern freuen, denn soweit ich weiss werden die aufgaben auch noch in zukunft benutzt.

    ich glaube es fehlt hier noch zu stack mittels array die pop und die top funktion, und bei mir wird das von def.cpp net akzeptiert:

    struct TStackP
    {
      void* info; 
      TStackP* p;
    };
    

    bei TStackP* p; sagt er syntax error before : "TStackP". KP warum.

    gruß



  • achja, ich vermute das bei top sowas in der art da reinkommt aber da kennt er ja das info net also was mach ich da falsch?

    void* top(TStackA stack)
    {
          return info[stack.pos];
    }
    

Anmelden zum Antworten