Personenliste mit dynamischen Strukturen erstellen
-
Hey, wir sollen im Rahmen eines Praktikums in ANSI konformen C zwei Programme schreiben. Das erste soll Daten über das Keyboard in eine dynamische Struktur einlesen und zum Schluss formatiert in eine .txt-Datei speichern. Das zweite Programm soll diese .txt-Datei auslesen und formatiert auf dem Bildschirm ausgeben.
Nun haben wir das Problem, dass nur bedingt Ahnung von dynamischen Vorgängen haben und dementsprechend vermutlich an Anfängerfehlern scheitern. Ich poste einfach mal ein paar Quelltextausschnitte und hoffe jemand kann etwas damit anfangen.typedef struct gd_e { ui_t GDTag; ui_t GDMonat; ui_t GDJahr; } gd_t; typedef struct person_e { ui_t IdentNr; nam_t FNam, VNam; gd_t GebDat; } person_t; typedef person_t *pperson_t; int main(void) { char dummy[81]; int per_anz = 2; int i; printf("Eingabe von bis zu 10 Personendatensaetzen (Ende: leerer Familienname)\n\n"); printf("Anzahl der einzulesenden Datensaetze: "); scanf("%s", &per_anz); gets(dummy); printf("\n"); if (per_anz-50 > 10) per_anz = 10; if (per_anz-50 < 2) per_anz = 2; per_anz; pperson_t PerArr; PerArr = (pperson_t) calloc(per_anz, sizeof(pperson_t)); for (i = 0; i < per_anz; i++) { printf("\nDatensatz %d/%d\n", i+1, per_anz); PerArr[i].IdentNr = (i+1)*100; printf("Familienname : "); gets(PerArr[i].FNam); printf("Vorname : "); gets(PerArr[i].VNam); printf("Geburtsdatum (dd mm yyyy): "); scanf("%2d %2d %4d", PerArr[i].GebDat.GDTag, PerArr[i].GebDat.GDMonat, PerArr[i].GebDat.GDJahr); gets(dummy); } for (i = 0; i < per_anz; i++) { printf("\nDatensatz %d/%d\n", i+1, per_anz); printf("IdentNR: %d\n", PerArr[i].IdentNr); printf("Vorname: %s\n", PerArr[i].VNam); printf("Nachname: %s\n", PerArr[i].FNam); printf("Geburtsdatum: %2d.%2d.%4d\n", PerArr[i].GebDat.GDTag, PerArr[i].GebDat.GDMonat, PerArr[i].GebDat.GDJahr); } gets(dummy); }
Hier hab ich das Problem, dass das Programm kompiliert und auch bis zum Geburtsdatum eintragen korrekt läuft, dann aber mit einer Fehlermeldung abbricht: "System.AccessViolationException"
Hier soll ein Array mit Personen-Daten, in jeweils einer eigenen Struktur, gefüllt werden und zum Schluss in eine .txt-Datei gespeichert werden (fwrite?).
EIGENTLICH müsste die Eingabe der Daten mittels eines Unterprogramms geschene (pperson_t ReadPerFromKbd(void);), aber ich krieg es um's Verrecken nicht so hin, dass dabei ein Code rauskäme, den ich hier kopieren könnte, darum wäre ich dankbar, wenn das jemand so hinbiegen könnte.Das zweite große Problem betrifft das Programm, bei dem die .txt-Datei ausgelesen werden soll und sieht wie folgt aus:
Es soll mit der Unterfunktion void GetFileName(char pFileName);* der Name der Datei über die Tastatur eingelesen werden und an die Main-Funktion übermittelt werden und von dort aus in ein weiteres Unterprogramm. Das Problem hierbei ist, dass wir nicht richtig mit dem Pointer umgehen können.Für das ganze Projekt sind die Vorgaben zwingend festgelegt.
-
noch so einer von der sorte
http://www.c-plusplus.net/forum/viewtopic-var-t-is-260245-and-start-is-0.html
-
Okay, das erste Problem ist gelöst: Ich hab einfach jeweils das & vor den scanf Argumenten vergessen. ~
Trotzdem scheitere ich jetzt daran den Code in ein Unterprogramm auszulagern, denn ich kann diesem ja nichts per Main übermitteln. Der Gedanke ist nun folgender:for (i = 0; i < per_anz; i++) { printf("\nDatensatz %d/%d\n", i+1, per_anz); PerArr[i] = ReadPerFromKbd(); gets(dummy); }
Ich mache Speicher frei für die vom Benutzer eingetragene Anzahl Personen und speichere dann in das Array die fertigen, mit Nutzerdaten gefüllten Strukturen, die mir ReadPerFromKbd() hoffentlich liefert. Nun komm ich aber nicht weiter, da ich nicht weiß, wie ich eben dieses Unterprogramm aufbauen soll. Mein Versuch war folgender:
pperson_t ReadPerFromKbd(void) { pperson_t PerStrukt; PerStrukt.IdentNr = 100; printf("Familienname : "); gets(PerStrukt.FNam); printf("Vorname : "); gets(PerStrukt.VNam); printf("Geburtsdatum (dd mm yyyy): "); scanf("%2d %2d %4d", &PerStrukt.GebDat.GDTag, &PerStrukt.GebDat.GDMonat, &PerStrukt.GebDat.GDJahr); return PerStrukt; }
Aber hier mäkelt der Compiler: "left of '.FNam' must have class/struct/union" und so weiter für alle weiteren Zuweisungen.
Zudem wird beim oberen Code-Ausschnitt bei der Zuweisung PerArr[i] = ReadPerFromKbd(); folgendes ausgespuckt:
binary '=' : no operator found which takes a right-hand operand of type 'pperson_t' (or there is no acceptable conversion)
-
so geht das natürlich nicht, weil pperson_t ein zeiger ist. das sieht man deutlich am typedef in zeile 12.
im übrigen und zu guter letzt ist auf der von mir verlinkten seite bereits alles vorgekaut.
-
Hab mir den Thread durchgelesen, aber das Problem mit dem Array voller Strukturen in eine .txt zu schreiben wird dort soweit ich das verstehe noch nicht behandelt. Wie funktioniert das dann? Wenn ich es mit fwrite versuche, bekomme ich nur mal wieder Fehler, die nichtmal eine Aussage darüber geben, wo das Problem liegt. "Corruption of the heap" erscheint mir als Laie zumindest nicht sehr hilfreich.
fp = fopen("PerLis.txt", "w"); fwrite(PerArr, sizeof(PerArr), 1, fp);
Ich weiß nicht genau wie fwrite funktioniert, also hoffte ich darauf, dass ich dann anhand des outputs etwas herumwerkeln kann, aber die Datei wird erzeugt, das Programm stürzt ab und reingeschrieben wird nichts weiter.
-
LOl du studierst nicht zufällig an der FH Lübeck xD?
Hab mir den Thread durchgelesen, aber das Problem mit dem Array voller Strukturen in eine .txt zu schreiben wird dort soweit ich das verstehe noch nicht behandelt. Wie funktioniert das dann? Wenn ich es mit fwrite versuche..
Auch wenn dus irgendwie hinkriegst mir fwrite, wärs sowieso falsch weil wir eine lesbare .txt machen sollen und fwrite schreibt binär rein.
Der Aufbau der .txt is ja folgender:
4 100 Meier Hans Otto 17 5 1978 200 Wiesner Anne-Katrin 8 10 1980
Ich habs so gemacht:
Zuerst die Personenanzahl ermitteln mit einer Schleife bis pPerArr[iAktP].fNam[0] != EMPTYTAG_C ist.Danach:
fp = fopen(pFileName, "w"); /* Datei zum Schreiben oeffnen */ fprintf( fp, "%d", PerAnz ); /* PerAnz in Datei schreiben */
und anschließend eine Schleife ( Solange alle Datensaetze durchlaufen sind )
mit fprintf's die sachen reinschreibenDie fprintf's benutzt du z.B. so:
fprintf( fp, "%s", pPerArr[iAktP].fNam );
für ein Zeilenwechsel machste den hier:
char Zeilenwechsel[] = "\n"; fprintf( fp, "%s", Zeilenwechsel );
Gruß
Johann