übung listen
-
Berufspenner schrieb:
Und
aktuell= (struct daten*) malloc(sizeof(struct daten));
statt
aktuell= malloc(sizeof(struct daten));
da malloc dir sonst nur void-Pointer bastelt.
du kannst aber den rückgabewert von malloc (void*) einem anderen pointer ohne cast zuweisen. das ist kein problem.
-
fricky schrieb:
Berufspenner schrieb:
Und
aktuell= (struct daten*) malloc(sizeof(struct daten));
statt
aktuell= malloc(sizeof(struct daten));
da malloc dir sonst nur void-Pointer bastelt.
du kannst aber den rückgabewert von malloc (void*) einem anderen pointer ohne cast zuweisen. das ist kein problem.
Solange der Code auch wirklich mit einem C-Compiler und nicht mit einem C++-Compiler übersetzt wird. Oder was meinst du damit genau?
-
Berufspenner schrieb:
Solange der Code auch wirklich mit einem C-Compiler und nicht mit einem C++-Compiler übersetzt wird. Oder was meinst du damit genau?
ich meine damit, dass er den cast weglassen kann, ja sogar besser weglassen sollte.
-
fricky schrieb:
Berufspenner schrieb:
Solange der Code auch wirklich mit einem C-Compiler und nicht mit einem C++-Compiler übersetzt wird. Oder was meinst du damit genau?
ich meine damit, dass er den cast weglassen kann, ja sogar besser weglassen sollte.
Wieso "weglassen sollte" (persönliche Neugierde
)? Und ein C++-Compiler haut ihm wie gesagt eins um die Ohre, wenn er das ganze nicht castet
-
Berufspenner schrieb:
fricky schrieb:
Berufspenner schrieb:
Solange der Code auch wirklich mit einem C-Compiler und nicht mit einem C++-Compiler übersetzt wird. Oder was meinst du damit genau?
ich meine damit, dass er den cast weglassen kann, ja sogar besser weglassen sollte.
Wieso "weglassen sollte" (persönliche Neugierde
)? Und ein C++-Compiler haut ihm wie gesagt eins um die Ohre, wenn er das ganze nicht castet
was ein c++, ada, java, c# oder sonstwas-compiler zu dem code sagt, ist doch völlig bedeutungslos. zum casten von malloc: http://c-faq.com/malloc/mallocnocast.html
-
fricky schrieb:
Berufspenner schrieb:
fricky schrieb:
Berufspenner schrieb:
Solange der Code auch wirklich mit einem C-Compiler und nicht mit einem C++-Compiler übersetzt wird. Oder was meinst du damit genau?
ich meine damit, dass er den cast weglassen kann, ja sogar besser weglassen sollte.
Wieso "weglassen sollte" (persönliche Neugierde
)? Und ein C++-Compiler haut ihm wie gesagt eins um die Ohre, wenn er das ganze nicht castet
was ein c++, ada, java, c# oder sonstwas-compiler zu dem code sagt, ist doch völlig bedeutungslos. zum casten von malloc: http://c-faq.com/malloc/mallocnocast.html
Danke, endlich mal eine sinnvolle und verständliche Erklärung
-
Man könnte hier auch die FAQ lesen.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-206606.html
-
Berufspenner schrieb:
Wieso "weglassen sollte" (persönliche Neugierde
)? Und ein C++-Compiler haut ihm wie gesagt eins um die Ohre, wenn er das ganze nicht castet
Wieso "weglassen sollte" (persönliche Neugierde
)? Und ein C++-Compiler haut ihm wie gesagt eins um die Ohre, wenn SIE das ganze nicht castet
-
Hallo stoeoe,
so wie ich deine Aufgabe verstehe, möchtest du eine Liste programmieren,
die ein Objekt bestehend aus einem Namen (höchstens 9 Zeichen) und einem
Alter verwaltet.Hierfür würde ich dann vielleicht einen solchen Struct definieren:
struct Person { char *name; int alter; };
Und als Liste dann:
struct Liste { struct Person *person; struct Liste *next; };
Um die Liste ein wenig allgemeiner zu definieren, kannst du auch soetwas
machen:struct Liste { void *obj; struct Liste *next; };
Dazu kann man dann Funktionen schreiben, die ein Element in die Liste einfügt,
ein Element löscht, oder vielleicht ein Element ausgibt:struct Person *new_person(char *name, int alter); struct Liste *add_person(struct Liste *l, struct Person *p); ...
Zum Einlesen des Namen würde ich die Funktion fgets() verwenden.
Ihr übergibst ein Array, die Größe des Arrays und woher eingegeben wird.
Bsp:char name[100]; fgets(name, 100, stdin);
fgets speichert das '\n' mit im Array. Das solltest du dann vielleicht noch
entfernen, bevor du damit weiterarbeitest.Gruß mcr
PS: deine weiteren Fehler werde ich nachher noch ansprechen.
-
Ok, dann nun zu ein paar Fehlern, die mir aufgefallen sind.
In Zeile 43:
} while (alter[i-1]=32);
Wird die while-schleife nie abgebrochen, da du hier eine
Zuweisung stehen hast, und eine Zuweisung immer true zurückliefert.Richtiger wäre:
} while (alter[i-1]==32);
Hier gibt es ein weiteres Problem:
scanf liefert dir das Zeichen 32 (' ') nicht zurück:
Auszug aus den Man-Pages:... [b]Leerräume[/b] (wie [b]Leerzeichen[/b], Tabulatoren oder Zeilenumbrüche) im String format passen zu einem Freiraum jeder Größe, eingeschlossen keinem Freiraum, der Eingabe. ... s Findet eine Folge von Zeichen, die [b]keinen Leerraum[/b] darstellen; der nächste Zeiger muss Zeiger auf char sein, und das Feld muss groß genug sein um die Folge und das abschließende NUL Zeichen aufzunehmen. Der Eingabestring [b]stoppt an Leerräumen[/b] oder an der maximalen Feldgrößen, je nachdem, was zuerst auftritt.
Somit ist die gewollte Abbruchbedingung nicht erfüllt.
Ein ähnliches Problem findet sich in Zeile 55. Hier weist zu dem Pointer
die NULL zu, anstelle der Abfrage auf NULL.Eine mögliche Verbesserung habe ich ja schon in meinem vorangegangem Post
beschrieben.Gruß mcr
PS: ich habe nicht nach weiteren Fehlern geschaut.