ERLEDIGT
JA
JA
ANTWORTEN
6
6
ZUGRIFFE
498
498
EMPFEHLEN
-
Hallo,
Ich muss ein Programm für die Schule schreiben.
Dabei funktioniert auch alles soweit.
Nur wenn ich mehr als 1 Element hinzufüge bekomme ich leider nur Fehler
Ich habe schon einiges probiert und auch schon einige Tutorials gelesen, hat mir leider nicht weiter
geholfen.
Das Programm verwaltet ein Adressebuch:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
#include <stdlib.h> // Wird für Ein/Ausgabe gemacht #include <stdio.h> #include <string.h> /** * Im struct ADDRESS wird die Adresse der Person gespeichert. */ typedef struct{ int plz; int hausNr; char strasse[100]; char ort[100]; }ADDRESS; /** * Im struct PERSON werden die Daten zur Person gespeichert. Zudem wird noch ein ADDRESS struct gespeichert * */ typedef struct{ int id; char vorname[50]; char nachname[100]; char telefon[50]; ADDRESS ad; }PERSON; // Prototypendefinition int del(PERSON *pr, int psize); int add(PERSON *pr, int psize); int ls(PERSON *pr, int psize); /** * In der Main-Methode wird dem Benutzer anzeigt was er zu tun hat, die Werte zu berechnen eingelesen und die entsprechenden Methoden werden aufgerufen. * * @param argc Anzahl der Parameter die übergeben wurde * @param argv Char-Array in dem die übergebenen Parameter stehen */ int main( int argc, char** argv ) { char c,x; // Speicher für die Daten wird reserviert PERSON *ipoint = (PERSON*)malloc(1*sizeof(PERSON)); int psize = 0; // Konnte kein Speicher reserviert werden, dann wird das Programm abgebrochen if( ipoint == NULL) { printf("Fehler bei Speicherreservierung!\n"); return -1; } printf("Willkommen zu meinem Adressbuch-Verwaltungsprogramm!\n\n"); printf("Wollen Sie loeschen(d), neuer Eintrag(n), eintraege Listen(l) oder Programm beenden(e)\n"); scanf("%c", &c); // Schleife die solange läuft, wie der Benutzer Daten eingeben will. do{ // Dementsprechend, was der Benutzer eingegeben hat, wird in der switch-case entschieden switch( c ) { case 'd': psize = del(ipoint, psize); break; case 'n': psize = add(ipoint, psize); break; case 'l': ls(ipoint, psize); break; case 'e': return 1; default: printf( "Falsche Eingabe!!\n" ); } // Benutzer wird nach einer Eingabe gefragt printf("Wollen Sie loeschen(d), neuer Eintrag(n), eintraege Listen(l) oder Programm beenden(e)\n"); scanf("%c", &c); fflush(stdin); }while(c != 'e' ); // do-While Schleife für nochmal berechnen return 1; } /** * In der Funktion del kann ein Struct gelöscht werden. Dazu wird dem Benutzer die ID des jeweiligen Eintrages gezeigt. * Durch Eingabe der ID, kann das Element dann anschließen gelöscht werden. */ int del(PERSON *pr, int psize) { int c, i=0,x; fflush(stdin); printf("\nWelchen Eintrag wollen Sie löschen?\n"); // Elemente werden dem Benutzer angezeigt for(;i < psize; i++) { printf("\n------------------------\n"); printf("ID: %d\n", pr[i].id); printf("Nachname: %s\n", pr[i].nachname); printf("Vorname: %s\n", pr[i].vorname); printf("------------------------\n"); } // ID wird vom Benutzer eingefragt. printf("\n***\nBitte ID eingeben:"); scanf("%d", &x); fflush(stdin); // Wenn Eingabe im Wertebereich war. if( x <= psize) { // entsprechendes Element wird gelöscht free(pr+x); } psize--; return psize; } /** * In der Methode add kann ein neues Element hinzugefügt werden */ int add(PERSON *pr, int psize) { char c[100]; int x; // Speicher für ein weiteres Element wird reserviert pr = (PERSON*)realloc( pr, (psize+1) * sizeof(PERSON)); // Ist die Speicherreservierung fehlgeschlagen, dann wird die Methode beendet if( pr == NULL ) return -1; // id wird psize zugewiesen pr[psize].id = psize; // Die Daten für die Person werden vom Benutzer eingelesen printf("Nachname: "); scanf("%s", &c); fflush(stdin); strcpy(pr[psize].nachname, c); printf("Vorname: "); scanf("%s", &c); fflush(stdin); strcpy(pr[psize].vorname, c); printf("Telefonnummer: "); scanf("%s", &c); fflush(stdin); strcpy(pr[psize].telefon, c); printf("Ort: "); scanf("%s", &c); fflush(stdin); strcpy(pr[psize].ad.ort, c); printf("Strasse: "); scanf("%s", &c); fflush(stdin); strcpy(pr[psize].ad.strasse, c); printf("Hausnummer: "); scanf("%d", &x); fflush(stdin); pr[psize].ad.hausNr = x; printf("PLZ: "); scanf("%d", &x); fflush(stdin); pr[psize].ad.plz = x; // Ein Element mehr->psize wird um 1 erhöht psize = psize +1; return psize; } int ls(PERSON *pr, int psize) { int i=0; // Wurde noch kein Element hinzugefügt, bzw. alle bestehenden gelöscht if( psize == 0 ) { printf("\n\nNO ELEMENTS IN STRUCT!\n"); return -1; } // Existieren noch Elemente, dann werden diese ausgegeben printf("\n\nLISTE DER ELEMENTE:\n %d", psize); for(;i < psize; i++) { printf("------------------------\n"); printf("\tID: %d\n", pr[i].id); printf("\tNachname: %s\n", pr[i].nachname); printf("\tVorname: %s\n", pr[i].vorname); printf("\tTelefonnummer: %s\n", pr[i].telefon); printf("\tOrt: %s\n", pr[i].ad.ort); printf("\tStrasse: %s\n", pr[i].ad.strasse); printf("\tHausnummer: %d\n", pr[i].ad.hausNr); printf("\tPLZ: %d\n", pr[i].ad.plz); printf("------------------------\n"); } return 1; }
Ich würde mich über eine schnelle Antwort freuen
und bedanke mich schon ganz herzlich im vorraus******
MfGGeändert von paul10 (09.12.11 um 00:01 Uhr) Grund: Code aktualisiert
-
Hi
NULL und malloc(0*...) ist nicht das Gleiche.
Mach wirklich ein malloc am Anfang.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
OK, Danke erstmal, hatte ich leider auch schon probiert, werd ich aber sofort nochmal testen.
mfg
-
Wenns nicht geht: Debugger: In welcher Zeile passierts?
Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
So hab ich jetzt probiert mit
PERSON *ipoint = (PERSON*)malloc(1*sizeof(PERSON));
jetzt ist es möglich ein Element hinzuzufügen
reserviere ich mir dann aber mit realloc für das nächste Element Speicher, dann dürfte ich wieder
auf die falsche Speicherstelle zugreifen
mfg
und zum Debugger: Das Programm wird nicht unterbrochen, erst bei der Funktion ls wird dann einfach nur Blödsinn ausgegeben...Geändert von sheel (09.12.11 um 10:36 Uhr) Grund: Doppel
-
09.12.11 07:31 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.malloc darf NULL zurückgeben wenn als Argument 0 angegeben wurde. Oder es gibt einen Zeiger auf 0 Bytes Speicher zurück...
Aber warum sollte man eine Person anlegen, wenn man überhaupt keine Daten hat? Initialisiere doch einfach ipoint mit NULL - dafür brauchst du doch keine Funktion aufrufen...
@paul10: Geh doch im Debugger einfach Zeile für Zeile durch und schau dir genau an was passiert. So groß ist dein Programm doch nicht...
\edit: Hab mir dein Programm mal näher angeschaut.
Bemerkungen:
Erstmal ist fflush auf Eingabeströme nicht definiert. (http://faq.cprogramming.com/cgi-bin/...&id=1043284351)Code c:
Von statischen Array kann man keine Adresse ermitteln. Deswegen verwendet man den & Operator nicht bei Arrays (bei dem c). (ich erhalte eine Warnung weil das Format und der Typ nicht passt)
Und warum machst du das so kompiliziert? Lies doch einfach den Wert direkt in die Struktur ein.
Außerdem hast du keine Fehlerprüfung gemacht. Du solltest psize nur inkrementieren wenn auch alle Werte korrekt eingelesen wurden.
Dann übergibst du den Funktionen add und del eine Kopie des Zeigers ipoint. D.h. nachdem die Funktion zurückgekehrt ist, ist der Wert des Zeigers ipoint unverändert. Du müßtest die Adresse von ipoint übergeben (einen Zeiger auf den Zeiger), damit der Wert in der Funktion geändert werden kann.
Code c:1 2 3 4 5
int add(PERSON **ppr, int psize) { ... } add(&ipiont, psize);
Die del Funktion ist noch komplett falsch. Erstens darf x nicht <= psize sein, sondern muß echt kleiner sein. Dann kannst du nicht einfach ein beliebiges Element mit free löschen. Du mußt vielmehr alle Elemente die hinter dem zu löschenden Eintrag stehen um 1 Position nach links schieben (siehe memmove).
GrußGeändert von deepthroat (09.12.11 um 07:55 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
so, konnte es jetzt endlich lösen, vielen Dank an alle

mfg
Ähnliche Themen
-
Dynamische Speicherverwaltung
Von Googlehupf im Forum C/C++Antworten: 11Letzter Beitrag: 17.01.12, 23:19 -
Dynamische Speicherverwaltung
Von rainer82 im Forum C/C++Antworten: 8Letzter Beitrag: 21.10.09, 08:00 -
Dynamische Speicherverwaltung mit malloc
Von wims_live im Forum C/C++Antworten: 8Letzter Beitrag: 21.01.09, 08:13 -
dynamische Speicherverwaltung
Von ollek81 im Forum C/C++Antworten: 1Letzter Beitrag: 12.06.02, 22:26





Zitieren


Login






