hame Geschrieben 14. Dezember 2009 Geschrieben 14. Dezember 2009 (bearbeitet) ich hab folgende struktur gegeben #define LAENGE 80 typedef struct t_element{ char inhalt[LAENGE]; struct t_element *next; }t_element; typedef struct{ struct t_element *erstesElement; struct t_element *letztesElement; int anzahlElemente; }t_Listenkopf jetzt hab ich zwei funktionen geschrieben die eine intialisiert den Listenkopf mit Null Werten und die andere fügt vorne ein neues Element ein. void initListe(t_Listenkopf *li){ li = malloc(sizeof(t_Listenkopf); li->erstesElement = NULL; li->letztesElement = NULL; li->anzahlElemente = NULL; } void vorneEinfuegen(t_Listenkopf *li, char *str){ t_Listenkopf *neu; neu = malloc(sizeof(t_Element)); if(neu==0){ printf("malloc fehlgeschlagen"); return -1; } neu->inhalt[LAENGE] = str; neu -> next = li -> erstesElement; if(!li -> erstesElement){ li->letztesElement = neu; li->erstesElement = neu; } } jetzt wollt ich fragen ob das so grob stimmt weil ich noch nichts in die strukturen geschrieben habe und es noch nicht getestet habe. mfg. Bearbeitet 14. Dezember 2009 von hame Zitieren
Klotzkopp Geschrieben 14. Dezember 2009 Geschrieben 14. Dezember 2009 Die Funktion initListe hat ein Problem: Parameter in C sind (bis auf Arrays) Call-by-Value, die Funktion arbeitet also immer mit Kopien der Parameter. In diesem Fall ist der Zeiger li also nur eine Kopie des Zeigers, mit dem du diese Funktion aufrufst. Die Änderungen in der Funktion, also das Zuweisen des mit malloc geholten Speichers, betreffen nur diese Kopie. Der Zeiger, der beim Aufruf angegeben wurde, ändert sich nicht. Statt eines Parameters würde sich hier einfach ein Rückgabewert anbieten, denn mit dem reingegeben Zeiger machst du ja eigentlich gar nichts, du überschreibst ihn sofort. In der Funktion vorneEinfuegen sind ein paar Fehler: Du holst für neu Speicher für ein t_element, und benutzt es auch so, deklariert hast du es aber als Zeiger auf t_Listenkopf, das geht in die Hose. Die Zuweisung des Inhalts ist auch falsch. Der Ausdruck inhalt[LAENGE] außerhalb der Deklaration bezieht sich auf ein einzelnes char-Element des Arrays, allerdings an einer Position, die genau hinter dem Ende des Arrays liegt, denn der letzte gültige Index wäre LAENGE-1. Ganz allgemein kannst du Arrays nichts zuweisen. Zum Kopieren von Strings gibt es die Funktion strcpy, hier noch besser strncpy, damit du sicherstellen kannst, dass nicht mehr kopiert wird, als in inhalt hineinpasst (der gefürchtete Pufferüberlauf). Zu guter Letzt muss die Zuweisung an li->erstesElement aus dem if-Block raus. Du musst immer den Anfangszeiger ändern, nicht nur dann, wenn die Liste vorher leer war. Zitieren
hame Geschrieben 14. Dezember 2009 Autor Geschrieben 14. Dezember 2009 Die Funktion initListe hat ein Problem: Parameter in C sind (bis auf Arrays) Call-by-Value, die Funktion arbeitet also immer mit Kopien der Parameter. In diesem Fall ist der Zeiger li also nur eine Kopie des Zeigers, mit dem du diese Funktion aufrufst. Die Änderungen in der Funktion, also das Zuweisen des mit malloc geholten Speichers, betreffen nur diese Kopie. Der Zeiger, der beim Aufruf angegeben wurde, ändert sich nicht. Statt eines Parameters würde sich hier einfach ein Rückgabewert anbieten, denn mit dem reingegeben Zeiger machst du ja eigentlich gar nichts, du überschreibst ihn sofort. ich glaub ich brauch da gar kein malloc, das lass ich mal gleich weg. aber ich glaub das andere ist soweit richtig ich soll ja nur den listenkopf mit nullern initialisieren. der Funktion vorneEinfuegen sind ein paar Fehler: Du holst für neu Speicher für ein t_element, und benutzt es auch so, deklariert hast du es aber als Zeiger auf t_Listenkopf, das geht in die Hose. das hab ich auch gerade gemerkt und hab es verbessert ^^ Die Zuweisung des Inhalts ist auch falsch. Der Ausdruck inhalt[LAENGE] außerhalb der Deklaration bezieht sich auf ein einzelnes char-Element des Arrays, allerdings an einer Position, die genau hinter dem Ende des Arrays liegt, denn der letzte gültige Index wäre LAENGE-1. Ganz allgemein kannst du Arrays nichts zuweisen. Zum Kopieren von Strings gibt es die Funktion strcpy, hier noch besser strncpy, damit du sicherstellen kannst, dass nicht mehr kopiert wird, als in inhalt hineinpasst (der gefürchtete Pufferüberlauf). Zu guter Letzt muss die Zuweisung an li->erstesElement aus dem if-Block raus. Du musst immer den Anfangszeiger ändern, nicht nur dann, wenn die Liste vorher leer war. aber sonst passt alles oder? Zitieren
VaNaTiC Geschrieben 14. Dezember 2009 Geschrieben 14. Dezember 2009 (bearbeitet) Hat sich komplett erledigt, die beiden anderen waren schneller als ich mit meinem T-DSL "leid" Bearbeitet 14. Dezember 2009 von VaNaTiC Zitieren
hame Geschrieben 14. Dezember 2009 Autor Geschrieben 14. Dezember 2009 ich hab mir hat vorher eine header angelegt mit den funktionsdeklarationen und strukturdeklarationen und danach schreib ich mir eine testeliste.c und schreib in der mein() einen listenkopf und schreib was in die struktur und teste es. aber ich hab halt hier noch ein paar probleme wie man sieht ^^ Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.