geketteter typ/groessenflexibler stapel ---absolute verzweiflung macht sich breit :((



  • hallo,

    ich bin verzweifelt, mein stack funktioniert einfach nicht. sitze jetzt
    schon 2 tage dran und hab kein nerv mehr 😞
    es soll ein geketteter stack werden der daten beliebigen typs und groesse
    aufnehemen kann.
    irgendwo in der push-funktion stimmt was nicht glaub ich. immer wenn ich
    einen neuen wert pushe werden alle werte mit dem neuen überschrieben ...

    hier mal die funktion:

    +++++++++++++++++++

    int Push(void *vPDatum, int G, TStapel *PS){
    
     TElem *PH;
     PH=malloc(sizeof(TElem));
     if (PH == NULL) return 1;
     PH->PDatum=malloc(G);
     PH->PDatum=vPDatum;
     PH->Pnext=PS->Anker;
     PS->Anker=PH;
    
     return 0;
    }
    
    +++++++++++++++++
    
    etwasmehr code (ganz unten noch das lauffähige programm)
    
    ++++++++++++
    
    ...
    
    typedef struct TElement {
       int G; /*groesse des datums in byte*/
       char *PDatum; /*nimmt das datum auf*/
       struct TElement *Pnext;
    }TElem;
    
    typedef struct TStack {
     TElem *Anker;
    }TStapel;
    
    TStapel* InitStapel(void);
    int IsEmpty(TStapel*);
    int Push(void*, int, TStapel*);
    int Pop(void*, int, TStapel*);
    
    int main (void)
    {
     char Antw, Antw2; /*menu*/
     int G;
     int intDatum;
     int *PintDatum;
     char charDatum[21];
     void *vPDatum;
    
     TStapel *PStapel=InitStapel();
    
     printf("\n\nTyp/Groessen-flexibler geketteter LIFO - Stapel");
    
     /*EINGABE VON NEUEM WERT*/
       ...
         /* case 'i': INTEGER-WERT soll eingegeben werden*/
          printf("\ninteger Wert: ");
          scanf("%d", &intDatum); rewind(stdin);
          vPDatum=&intDatum;
          G=sizeof(int);
          if (Push(vPDatum, G, PStapel)) printf("\nSpeicher voll!");
          else printf("integer Wert \"%d\" eingetragen", intDatum);
          break;
    
        ...
    
      ...
       /*AUSGABE*/
    
           ...
        if (Pop(vPDatum, G, PStapel)) printf("\nStack leer!");
        else {
         switch (G) {
          case sizeof(int):
           PintDatum=vPDatum;
           printf("\nPOP: integer Wert \"%d\"", *PintDatum);
           break;
          ...
         }
        }
      ...
     return 0;
    }
    
    TStapel* InitStapel(void) {
     TStapel *PH;
     PH=(TStapel *)malloc(sizeof(TStapel));
     if (PH==NULL) return NULL;
     PH->Anker=NULL;
     return PH;
    }
    
    int Push(void *vPDatum, int G, TStapel *PS){
    
     TElem *PH;
     PH=malloc(sizeof(TElem));
     if (PH == NULL) return 1;
     PH->PDatum=malloc(G);
     PH->PDatum=vPDatum;
     PH->Pnext=PS->Anker;
     PS->Anker=PH;
    
     return 0;
    }
    
    int Pop(void *vPDatum, int G, TStapel *PS){
    
     TElem *PH;
    
     if (PS->Anker  == NULL) return 1;
     PH=PS->Anker;
     vPDatum=PH->PDatum;
     PS->Anker=PH->Pnext;
     free(PH);
     return 0;
    }
    
    int IsEmpty(TStapel *PS){
    
     return (PS->Anker == NULL);
    
    }
    +++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++++++++++++++++
    
    ++++++++++++
    lauffaehig aber funzt net:
    
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++++++++++++++++
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    typedef struct TElement {
       int G;
       char *PDatum;
       struct TElement *Pnext;
    }TElem;
    
    typedef struct TStack {
     TElem *Anker;
    }TStapel;
    
    typedef struct adress{
     char Name[16]; /*Vorname[16],Strasse[16],Ort[16];*/
     char PLZ[6];
    }Adresse;
    
    /***************************************************************************
    ****************************************************************************
    **
    ****************************************************** P R O T O T Y P E S
    ****************************************************************************
    **************
    ****************************************************************************
    ****************************************************************************
    **/
    
    TStapel* InitStapel(void);
    int IsEmpty(TStapel*);
    int Push(void*, int, TStapel*);
    int Pop(void*, int, TStapel*);
    
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    +
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++ P R O T O T Y P E S
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    */
    
    /***************************************************************************
    ****************************************************************************
    **
    ****************************************************** M A I N
    ****************************************************************************
    **************
    ****************************************************************************
    ****************************************************************************
    **/
    int main (void)
    {
     char Antw, Antw2;
    int G;
     int intDatum;
     int *PintDatum;
     char charDatum[21];
     Adresse adrDatum;
     void *vPDatum;
    
     TStapel *PStapel=InitStapel();
    
     printf("\n\nTyp/Groessen-flexibler geketteter LIFO - Stapel");
    
     do {
        printf("\n(e)ingeben, (a)usgeben, (z)erstören, (b)eenden: ");
        fflush(stdout);
        Antw=getch(); putchar(Antw);
        switch (Antw) {
           case 'e':
       do {
        printf("\n\n(i)nteger Wert, (z)eichenkette, (a)dresse, (h)auptmenue: ");
    ////2do::wie geht das ohne (h) ??
        fflush(stdout);Antw2=getch(); putchar(Antw2);
        switch (Antw2) {
         case 'i':
          printf("\ninteger Wert: ");
          scanf("%d", &intDatum); rewind(stdin);
          vPDatum=&intDatum;
          G=sizeof(int);
          if (Push(vPDatum, G, PStapel)) printf("\nSpeicher voll!");
          else printf("integer Wert \"%d\" eingetragen", intDatum);
          break;
         case 'z':
          printf("\nZeichenkette: ");
          scanf("%s", charDatum); rewind(stdin);
          vPDatum=charDatum;
          G=sizeof(charDatum);
          if (Push(vPDatum, G, PStapel)) printf("\nSpeicher voll!");
          else printf("Zeichenkette: \"%s\" eingetragen", charDatum);
          break;
         case 'a':break;
        }
       } while (Antw2 != 'h');
       break;
    
           case 'a':
    
        if (Pop(vPDatum, G, PStapel)) printf("\nStack leer!");
        else {
         switch (G) {
          case sizeof(int):
           PintDatum=vPDatum;
           printf("\nPOP: integer Wert \"%d\"", *PintDatum);
           break;
          case sizeof(charDatum):break;
          case sizeof(Adresse):break;
          default:break;
         }
        }
                    break;
           case 'b': break;
        }
     } while (Antw != 'b');
     return 0;
    }/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++ M A I N
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    */
    
    /***************************************************************************
    ****************************************************************************
    **
    ****************************************************** InitStapel
    ****************************************************************************
    **************
    ****************************************************************************
    ****************************************************************************
    **/
    TStapel* InitStapel(void) {
     TStapel *PH;
     PH=(TStapel *)malloc(sizeof(TStapel));
     if (PH==NULL) return NULL;
     PH->Anker=NULL;
     return PH;
    }/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++ InitStapel
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    */
    
    /***************************************************************************
    ****************************************************************************
    **
    ****************************************************** Push
    ****************************************************************************
    **************
    ****************************************************************************
    ****************************************************************************
    **/
    int Push(void *vPDatum, int G, TStapel *PS){
    
     TElem *PH;
     PH=malloc(sizeof(TElem));
     if (PH == NULL) return 1;
     PH->PDatum=malloc(G);//2do::(char *)malloc(G);
     PH->PDatum=vPDatum;
     PH->Pnext=PS->Anker;
     PS->Anker=PH;
    
     return 0;
    }/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Push
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    */
    
    /***************************************************************************
    ****************************************************************************
    **
    ****************************************************** Pop
    ****************************************************************************
    **************
    ****************************************************************************
    ****************************************************************************
    **/
    int Pop(void *vPDatum, int G, TStapel *PS){
    
     TElem *PH;
     if (PS->Anker  == NULL) return 1;
     PH=PS->Anker;
     vPDatum=PH->PDatum;
     PS->Anker=PH->Pnext;
     free(PH);
     return 0;
    }/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pop
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    */
    
    /***************************************************************************
    ****************************************************************************
    **
    ****************************************************** IsEmpty
    ****************************************************************************
    **************
    ****************************************************************************
    ****************************************************************************
    **/
    int IsEmpty(TStapel *PS){
    
     return (PS->Anker == NULL);
    
    }/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++ IsEmpty
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    +++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    */
    


  • if (PH == NULL) return 1;
    PH->PDatum=malloc(G);
    PH->PDatum=vPDatum;
    //war hier eher memcpy gemeint oder wozu sonst haste malloc(G) gemacht?



  • damit will ich G bytes für PDatum reservieren, dass das nen int-wert oder ne zeichenkette (später noich ne struct) aus dem void-ptr aufnehemn kann.



  • aber mit memcpy. du läßt einfach alle PDatum auf die selbe instanz von int, also auf main::intDatum zeigen.

    nicht PH->PDatum=vPDatum; machen!
    eher memcpy(PH->PDatum,vDatum,G);



  • na dann is wenig verwunderlich dass die immer überschrieben werden 🙂

    danke dir 🙂

    hab hier haufenweise gemälde von den listen, nur die speicherstruktur hab ich mir net klargemacht, das werd ich jetzt mal tun! danke dir, da wär ich nie draufgekkommen 🙂

    da memcopy meinem prof net gefallen wird, werd ich jetzt einfach für jedes neue datum auch neu mallocen, sollte ja gehen.



  • es wird ihm gefallen. warum denn nicht?



  • das ist ganz einfach: memcopy war nicht stoff _seiner_ vorlesung, dh
    -er kennt es möglicherweise nicht (echt wahr 😕 )
    -die lösungen der probleme sollen auf dem durchgenommenen kram basieren

    danke nochmal für die schnelle hilfe 🙂 schönes forum, schick mit der code- darstellung auch hier.... bis zu meinem nächsten problem, hoffe dass ich auchbald soweit bin hier anderen weiterzuhelfen, aber momentan ist mein C einfach übelst 🙂



  • da memcopy meinem prof net gefallen wird...

    Oder du schreibst die Funktion selber mit ins Programm rein, da kann er nicht meckern 🙂

    void memcpy(void* src, void* dst, size_t bytes) {
      char *ps = (char*)src, *pd = (char*)dst;
      for(; bytes; --bytes)
        *pd++ = *ps++;
    }
    


  • sieht irgendwie sexy aus der code




Anmelden zum Antworten