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 effect
Was 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 effect
Du 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^^