Warum ist er nichtmehr NULL?



  • Moin,

    ich habe folgendes Problem: Ich soll eine Liste mit Produkten und Preisen einlesen, diese in einer binärdatei schreiben, die liste löschen und aus der binärdatei wieder alles einlesen. Das einlesen und schreiben funktioniert super, allerdings gibts beim lesen der Datei leichte probleme. erstmal hier der code (ich hab alle .c und .h files zu einer gemacht, damits kein gefrickel mit 1000 dateien gibt):

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef 
    
    	struct prodinfo { char name [20];
    
    		          double preis;
    
    	} ProdInfo;
    
    typedef 
    
    	struct prodliste {
    
    		ProdInfo * info;
    
    		struct prodliste * next;
    
    	} ProdListe;
    
    static ProdListe * pos;
    
    void initListe (ProdListe ** liste);
    
    void einfuegenListe (ProdListe ** liste, ProdInfo * produkt);
    
    ProdInfo * naechstesProdukt (ProdListe ** liste);
    
    void SaveList (char * FileName, ProdListe * liste);
    
    void ReadList (char * FileName, ProdListe ** liste);
    
    void KillList (ProdListe ** liste);
    
    void ausgebenProdukt (ProdInfo * prod);
    
    ProdInfo * einlesenProdukt (void);
    
    void initListe (ProdListe ** liste) {
       (*liste) = NULL;
       pos = NULL;
    }
    
    void einfuegenListe (ProdListe ** liste, ProdInfo * produkt) {
       ProdListe * ref;
       printf ("\n\n\n");
       if ((*liste) == NULL) {
          printf ("List NULL\n");
          *liste = malloc (sizeof (ProdListe));
          (*liste)->next = NULL;
          (*liste)->info = produkt;
          pos = *liste;
       } else {
          printf ("List not NULL\n");
          ref = (*liste);
          while (ref->next != NULL) { ref = ref->next; }
          ref->next = malloc (sizeof (ProdListe));
          ref->next->next = NULL;
          ref->next->info = produkt;
       }
       printf ("\n\n\n");
    }
    
    ProdInfo * naechstesProdukt (ProdListe ** liste) {
      ProdInfo * res;
      if (pos != NULL) {
        res = pos->info;
        pos = pos->next;
        return res;
      } else { return NULL; }
    }
    
    void SaveList (char * FileName, ProdListe * liste) {
       FILE * fp;
       ProdListe * ref;
       fp = fopen (FileName, "wb");
       ref = liste;
       while (ref != NULL) {
          fwrite ((*ref).info, sizeof (ProdInfo), 1, fp);
          ref = ref->next;
       } 
       fclose (fp);
    }
    
    void ReadList (char * FileName, ProdListe ** liste) {
      FILE * fp;
      ProdInfo * r;
      if (*liste == NULL) { printf ("f00!"); }
      fp = fopen (FileName, "rb");
      while (fread (r, sizeof (ProdInfo), 1, fp) > 0) {
        //printf ("\n\n%s%lf", r->name, r->preis);
        einfuegenListe (liste, r);
      }
      fclose (fp);
    }
    
    void KillList (ProdListe ** liste) {
      if (*liste != NULL) {
        if ((*liste)->next != NULL) { KillList (&(*liste)->next); }  
        free ((*liste)->info);
        free ((*liste));
      }
      (*liste) = NULL;
    }
    
    ProdInfo * einlesenProdukt (void) {
       ProdInfo * new;
       char buffer [100];
       new = malloc (sizeof (ProdInfo));
       printf ("Insert Product Name: ");
       fgets (new->name, 19, stdin);
       printf ("Insert Price: ");
       fgets (buffer, 99, stdin);
       sscanf (buffer, "%lf", &new->preis);
       return new;
    }
    
    void ausgebenProdukt (ProdInfo * prod) {
       printf ("Productname: %sPrice: %lf\n", prod->name, prod->preis);
    }
    
    int main (void)
    {
       int anzahl, count;
       char buffer [20];
       ProdListe * liste;
       ProdInfo * temp;
       initListe (&liste);
       printf ("Number of Products: ");
       fgets (buffer, 19, stdin);
       sscanf (buffer, "%i", &anzahl);
       for (count = 0; count < anzahl; count++) {
          einfuegenListe (&liste, einlesenProdukt ());
       }
       SaveList ("DATA.DAT", liste);
       while ((temp = naechstesProdukt (&liste)) != NULL) {
          ausgebenProdukt (temp);
       }
       KillList (&liste);
       initListe (&liste);
       liste = NULL;
       ReadList ("DATA.DAT", &liste);
       while ((temp = naechstesProdukt (&liste)) != NULL) {
          ausgebenProdukt (temp);
       }
       return 0;
    }
    

    Das problem tritt bei ReadFile auf. Und zwar sagt mir das Printf, dass *liste = NULL ist. nun wird einfuegenListe aufgerufen und dort geht er in den else zweig, das heißt, dass *liste nichtmehr null ist. Ich verstehe aber absolut nicht warum! Kann mir da bitte einer helfen?

    Danke für alle antowrten! Nidhoegger



  • kann mir da wirklich keiner helfen? ich habs mittlerweile sogar mal testweise komplett neu geschrieben und mit gdb gedebuggt.

    wenn aus readfile das einfuegenliste aufgerufen wird ist die liste nicht null. sollte sie aber. warum? bitte helft mir!



  • In ReadList fehlt die Speicherzuweisung für r.



  • das lesen funktioniert. wenn du mal das printf auskommentierst in der klammer und das einfuegen kommentierst, dann kommen die richtigen daten bei raus.

    die daten werden also korrekt gelesen und in r gespeichert.

    EDIT: Tschuldigung, mein fehler! du hast vollkommen recht. ARGH. sowas überseh ich IMMER -.-


Anmelden zum Antworten