# dereferencing pointer to incomplete type



## will2k (5. Januar 2008)

Fehlermeldung: siehe Bild: 

http://img507.imageshack.us/my.php?image=testat5.gif

Gibts hier kein farbiges code highlighting for C syntax ?

Programmbeschreibung: Anhängernummer und Anhängername werden eingegeben und einfach ungeordnet an die liste gehängt. Das geordnete kommt später ...

```
struct anhaenger
  {
    int  iAnhaengerNummer;
    char sAnhaengerName[256];
    struct anhaenger *next;
  };

  struct anhaenger *next   = NULL;
  struct anheanger *anfang = NULL;

void eingabe_Anhaenger()
  {
      int iAnNummer;
      char sAnName[256];

      printf("Geben Sie eine Anhaengernummer ein: ");
      scanf("%i",&iAnNummer);
      fflush(stdin);

      printf("Geben Sie einen Anhaengernamen ein: ");
      scanf("%s",sAnName);
      fflush(stdin);

      haengean_Anhaenger(iAnNummer,sAnName);
  }


 void haengean_Anhaenger(int iAnNummer, char *sAnName)
  {
     struct anhaenger *zeiger;

     if(anfang == NULL) // Wenn der Zeiger "anfang" == NULL ist, wurde noch kein Strukturelement erstellt bzw. Anhänger angehängt
     {

       anfang = malloc(sizeof(struct anhaenger)); // der Zeiger "anfang" Zeigt nun auf die Adresse eines neuen Strukturelements

       if (anfang == 0)
       {
         fprintf(stderr, "Es konnte für den Zeiger 'anfang' keinen Speicher reserviert werden, vielleicht zu wenig RAM eingebaut... \n");
         return;
       }

       anfang->iAnhaengerNummer = iAnNummer;
       strcpy(anfang->sAnhaengerName, sAnName);

       anfang->next = NULL;
     }
     else
     {
       zeiger=anfang; // Sonst wird auf das 1. Strukturelement gezeigt

       while(zeiger->next != NULL) // Solange der Zeiger "next" nicht auf das Ende der Strukturliste zeigt bzw. nicht auf das letzte Strukturelement
       zeiger = zeiger->next; // Der Zeiger "zeiger" zeigt nun ein Strukturelement weiter

       zeiger->next = malloc(sizeof(struct anhaenger));

       if (zeiger->next == NULL)
       {
         fprintf(stderr, "Es konnte für den Zeiger für das letzte Element reserviert werden\n");
         return;
       }

       zeiger = zeiger->next; // zeige auf den neuen Speicherplatz

       anfang->iAnhaengerNummer = iAnNummer;
       strcpy(anfang->sAnhaengerName, sAnName);
       
       zeiger->next = NULL; 
     }
  }
```


----------



## will2k (5. Januar 2008)

ok hatte einen Schreibfähler im Zeiger auf meinen struct... ea anstatt ae :-(

naechste Frage:

damit will ich alle Anhänger ausgeben, die zuvor eingegeben wurden.

Das klappt zwar doch nicht 100 richtig. Ich gebe z.B. ein

Nummer: 1 Name: bla
Nummer: 3 Name: muh

wenn ich jetzt die ausgabe Anhänger fkt. aufrufe bekomme ich die Nummer 3 ausgegeben sprich die erste Ausgabe ist die letzte Eingabe und danach bekomme ich nochmals ein Ausgabe mit einem "kaputten" Namen und Nummer sprich irgendwelchen ascii codes, ich denke der Zeiger scheint etwas wild wo hinzuzeigen... nur wo... ich vermute jetzt einfach mal ins Blaue, dass der Zeiger "anfang" nicht auf das 1. Element zeigt sondern auf das letzte Element der verketteten Liste doch wie bekomme ich den Zeiger "ptr" auf das 1. Element?

Hm doch vielleicht ist es auch so, dass bei Eingabe der beiden wagennummern diese sich überschreiben und mein Code ist inkonsistent? wies so schön heißt   

Könnte das jemand überprüfen bitte und mir Bescheid geben ich komm nicht drauf..., danke schön!

```
void gebeaus_Anhaenger()
  {
     struct anhaenger *ptr = anfang;

     while(ptr != NULL)
     {
        printf("\nDer Wagen mit der Wagennummer: %i hat den Wagennamen: %s",ptr->iAnhaengerNummer,ptr->sAnhaengerName);
        ptr = ptr->next;
     }
  }
```


----------



## Onkel Schuppig (6. Januar 2008)

Sieh mal unten:

```
void haengean_Anhaenger(int iAnNummer, char *sAnName)
  {
     struct anhaenger *zeiger;

     if(anfang == NULL) // Wenn der Zeiger "anfang" == NULL ist, wurde noch kein Strukturelement erstellt bzw. Anhänger angehängt
     {

       anfang = malloc(sizeof(struct anhaenger)); // der Zeiger "anfang" Zeigt nun auf die Adresse eines neuen Strukturelements

       if (anfang == 0)
       {
         fprintf(stderr, "Es konnte für den Zeiger 'anfang' keinen Speicher reserviert werden, vielleicht zu wenig RAM eingebaut... \n");
         return;
       }

       anfang->iAnhaengerNummer = iAnNummer;
       strcpy(anfang->sAnhaengerName, sAnName);

       anfang->next = NULL;
     }
     else
     {
       zeiger=anfang; // Sonst wird auf das 1. Strukturelement gezeigt

       while(zeiger->next != NULL) // Solange der Zeiger "next" nicht auf das Ende der Strukturliste zeigt bzw. nicht auf das letzte Strukturelement
       zeiger = zeiger->next; // Der Zeiger "zeiger" zeigt nun ein Strukturelement weiter

       zeiger->next = malloc(sizeof(struct anhaenger));

       if (zeiger->next == NULL)
       {
         fprintf(stderr, "Es konnte für den Zeiger für das letzte Element reserviert werden\n");
         return;
       }

       zeiger = zeiger->next; // zeige auf den neuen Speicherplatz

       /* Hier falsche Adresse!
       anfang->iAnhaengerNummer = iAnNummer;
       strcpy(anfang->sAnhaengerName, sAnName); */

       /* Anhaenger muss nach "zeiger"! */
       zeiger->iAnhaengerNummer = iAnNummer;
       strcpy(zeiger->sAnhaengerName, sAnName);
       
       zeiger->next = NULL; 
     }
  }
```


----------



## Ryu1991 (6. Januar 2008)

will2k hat gesagt.:


> Gibts hier kein farbiges code highlighting for C syntax ?



Für C vermutlich nicht aber für C++, einfach "cpp" bzw. "/cpp" in eckigen Klammern statt in ".


----------

