Pointer auf verschachtele Strukturen
-
Hallo, folgendes Problem
typedef struct {char szName[20]; float afNoten[4]; }TStud; typedef struct tEle {struct tEle *pNext; TStud stud; }TEle;mit Tele pRoot* = NULL
und möchte nun erstmal ein struct vom Typ Tstud machen:
TStud neu = {"Chris", 3.0, 4.0, 3.0, 4.0};Erste Warnung:
..\src\SS2013 Aufgabe 2.c:28: warning: missing braces around initializer ..\src\SS2013 Aufgabe 2.c:28: warning: (near initialization for 'neu.afNoten')Und möchte nun dieses struct TStud neu vollständig an Tstud stud übergeben.
Also
pRoot->stud = neu;Nun möchte ich z.B. die namen vergleichen:
Annahme:char *Name ="Chris";strcmp(Name,proot->stud.szName);2te Warnung zu strcmp:
..\src\SS2013 Aufgabe 2.c:34: warning: statement with no effectWas mache ich falsch?
Vielen Dank im voraus!
zoro
-
zoro schrieb:
Erste Warnung:
..\src\SS2013 Aufgabe 2.c:28: warning: missing braces around initializer ..\src\SS2013 Aufgabe 2.c:28: warning: (near initialization for 'neu.afNoten')Ein Array ist auch ein zusammen gesetzter Datentyp und will daher seine eigenen geschweiften Klammern bei der Initialisierung. Du musst also die Klammern schachteln:
TStud neu = {"Chris", {3.0, 4.0, 3.0, 4.0}};Es sollte auch ohne die Klammern funktionieren, aber mit ist es richtig.
Und möchte nun dieses struct TStud neu vollständig an Tstud stud übergeben.
Also
pRoot->stud = neu;Ob das so eine gute Idee ist, wenn pRoot = NULL ist?
Annahme:
char *Name ="Chris";Der Compiler meckert hier zwar nicht, aber besser wäre
const char *Name = "Chris";Zeichenkettenliterale sind an sich zwar nicht const-qualifiziert, aber Änderungen an solchen sind trotzdem undefiniertes Verhalten (und werden in der Regel einen Segfault auslösen) und sollten daher verhindert werden.
strcmp(Name,proot->stud.szName);2te Warnung zu strcmp:
..\src\SS2013 Aufgabe 2.c:34: warning: statement with no effectDu vergleichst die beiden zwar, aber tust halt nichts mit dem Ergebnis des Vergleichs. Das heißt, der ganze Ausdruck macht viel Arbeit für nichts.
-
Danke für die schnelle antwort.
wäre besser:
pRoot = malloc(sizeof("struct"));und dann:
pRoot->stud = neu;Danke im voraus!
-
zoro schrieb:
pRoot = malloc(sizeof("struct"));TEle *pRoot = malloc( sizeof *pRoot );Später bitte brav mit
free()wieder freigeben ...
-
Selbstverständlich


-
was soll sizeof("struct") bei deinem Malloc bitte machen?
-
Sollte nur bedeuten das dort ein bestimmtes struct von iwas drinnen steht, da ja hier die größe des zu belegenden speichers verlangt wird^^