Problem mit Dereferenzierung bei einer Struktur
-
Hallo,
Ich komme zur Zeit nicht darauf, was mein Compiler von mir erwartet.Ich habe eine Struktur definiert und ein Array, das die Typdefinition dieser struct besitzt, mittels CbR an eine Funktion übergeben. Bei scanf() schmiert er dann ab. Aber egal, wie ich es umstelle: Das Programm stürzt ab, oder kann gar nicht erst ausgeführt werden. Habe mal gleich mehrere verschiedene Varianten, die ich ausprobiert hbe im Code gelassen. Laut anderer Foren, usw. habe ich das auch richtig gemacht, aber es funktioniert nicht. Oder liegt es vllt an etwas ganz anderem?Interessant ist auch, dass er, wenn ich einen string einlese immer erst nach Eingabe abstürzt, und wenn ich einen int eingebe immer schon vor der eingabe.
Danke für jede Hilfetypedef struct { int day; char month[9]; int year; }date; typedef struct { char name[20]; date birth; int persnum; }person; void write(person *PersDaten[n], int count){ printf("Wie lautet der Name der Person?\n"); scanf("%s", PersDaten[count]->name); //Da es sich um einen String handelt, sollte kein &-Operator nötig sein, aber der Compiler will, dass ich dereferenziere(->) //fgets(PersDaten[count]->name, 20, stdin); printf("Wann ist der Geburtstag der Person?\n"); printf("Tag:\t"); scanf("%d", PersDaten[count]->birth.day); //Variante, die der Rechner will(es klappt dennoch nicht). Warum soll da kein & hin?!?!? printf("\nMonat:\t"); scanf("%s", (*PersDaten[count]).birth.month); //Compiler meckert nicht, bekommt die Ausführung aber auch nicht hin printf("\nJahr:\t"); scanf("%d", &PersDaten[count].birth.year); //Wie ich es mir vorstellen würde (Compiler erkennt dann aber die struct nicht mehr. Auch nciht mit verschiedenster Klammersetzung) }
-
Ungetestet:
void write(person *PersDaten[], int count){ // Das n weglassen in den [] printf("Wie lautet der Name der Person?\n"); scanf("%s", PersDaten[count]->name); printf("Wann ist der Geburtstag der Person?\n"); printf("Tag:\t"); scanf("%d", &PersDaten[count]->birth.day); // Ich denke hier muss ein & hin, es kompiliert auch printf("\nMonat:\t"); scanf("%s", &PersDaten[count]->birth.month); // Keine Ahnung was du vorher hier machen wolltest printf("\nJahr:\t"); scanf("%d", &PersDaten[count]->birth.year); // Doch, der Compiler kennt die struct noch. PersDaten ist allerdings ein Zeiger, deswegen mit -> und nicht mit '.' }
-
Ja. Die Kombination von & und -> hatte ich auch schon probiert, aber dann meint der compiler "links von -> muss ein struct-Ausdruck stehen" (was ja eigentlich der Fall ist).
Und wenn ich das n weglasse (, was ich anfangs auch hatte), übergibt er das array nicht an die Funktion und meint nur "syntax-fehler ´]´"
Habs gerade nochmal geändert (, so wie du es hast) und das programm stürzt ab, nach der ersten Eingabe. Nach wie vor.
Dennoch danke
-
Dann poste mal ein minimales, ausfuehrbares Codebeispiel, bei dem der Fehler auftritt.
Vielleicht liegt der Fehler woanders als im write.
-
Es läuft jetz mit &. Aber immer noch stürzt das Programm ab. Habe 2 verdächtige Warnhinweise:
Warnung 6 warning C4047: 'Funktion': Anzahl der Dereferenzierungen bei 'person **' und 'person *' unterschiedlich
write(&PersDaten[n], count); //Übergabe an Fkt void write(person *PersDaten[], int count){ //Funktions-head
und:
Warnung 7 warning C4024: 'write': Unterschiedliche Typen für formalen und übergebenen Parameter 1Wenn ich das n dort aus [] fortlasse (, was ich liebend gerne tun würde) verschwinden diese beiden Warnungen, aber dafür bekomme ich eine Fehlermeldung (C2059). Auch aus dem Fehlerkatalog:
http://msdn.microsoft.com/de-de/library/t8xe60cf%28v=vs.80%29.aspx
werde ich nicht schlau -.-
-
write(&PersDaten[n], count); //Übergabe an Fkt
ist sicherlich falsch. Das [n] gehoert da nicht hin. Wie hast du denn dein Array deklariert? Wahrscheinlich brauchst du das & gar nicht und dann kannst du das so schreiben:
void write(person PersDaten[], int count){ //Funktions-head
Aber ohne den ganzen Code sehen zu koennen, den man ausfuehren kann, kann ich nur mehr oder weniger raten.
-
also der hauptteil des programms (ohne funktion) ist foglender:
Es muss doch im Grunde an der Struktur liegen, da das programm ja beim schreiben in das array abschmiert, alles andere funktioniert. (solange ich das n im [] habe)#define n 3 typedef struct { int day; char month[9]; int year; }date; typedef struct { char name[20]; date birth; int persnum; }person; [...] int main(){ person PersDaten[n]; int choice, count=0; while(count<n){ printf("Möchten Sie Daten eingeben?\nJa:1\nNein:2\n"); scanf("%d", &choice); switch(choice){ case 1: printf("\n"); write(PersDaten[], count); count++; break; case 2: count=n; break; default: printf("Fehlerhafte Eingabe. Das Programm wird beendet.\n"); exit(0); } } [...]
Fehler:
Fehler 6 error C2059: Syntaxfehler: ']'
-
So kompiliert es und stuerzt bei mir nicht ab.
#include <stdio.h> #define n 3 typedef struct { int day; char month[9]; int year; } date; typedef struct { char name[20]; date birth; int persnum; } person; void write(person PersDaten[], int count) { printf("Wie lautet der Name der Person?\n"); scanf("%s", &(PersDaten[count].name)); printf("Wann ist der Geburtstag der Person?\n"); printf("Tag:\t"); scanf("%d", &PersDaten[count].birth.day); printf("\nMonat:\t"); scanf("%s", &PersDaten[count].birth.month); printf("\nJahr:\t"); scanf("%d", &PersDaten[count].birth.year); } int main() { person PersDaten[n]; int choice, count=0; while(count<n) { printf("Möchten Sie Daten eingeben?\nJa:1\nNein:2\n"); scanf("%d", &choice); switch(choice) { case 1: printf("\n"); write(PersDaten, count); count++; break; case 2: count=n; break; default: printf("Fehlerhafte Eingabe. Das Programm wird beendet.\n"); exit(0); } } }
-
Alles klar. Nun geht es.
Aber wieso darf (muss) man bei der Übergabe an die Funktion das [] weglassen?
Danke.
-
chrissan91 schrieb:
Alles klar. Nun geht es.
Aber wieso darf (muss) man bei der Übergabe an die Funktion das [] weglassen?
Danke.Im Prinzip einfach weil die Syntax der Sprache das so verlangt.
Aber man kann sich das auch so erklaren: Wenn du
person PersDaten[n];
hast, dann ist PersDaten nichts weiteres als ein Zeiger auf das erste Element im Array. Bei der Uebergabe von PersDaten an die Funktion uebergibst du also nicht das Array selber sondern eine Kopie des Zeigers auf das erste Element des Arrays. Es braucht also kein [].
*Edit
Du solltest etwas besser auf die Einrueckung deines Codes achten. Dein Code - so wie du ihn gepostet hast - ist nicht gut leserlich.