hame Geschrieben 13. Dezember 2009 Autor Geschrieben 13. Dezember 2009 (bearbeitet) bei mir aber sagt der compiler "forbids mixed declaration" bei t_adresse**adressen = malloc(k*sizeof(t_adresse*)); und außerdem wollte ich doch nicht adressen den speicher zuweisen sonder dem speicher oben in meiner funktion? Bearbeitet 13. Dezember 2009 von hame Zitieren
konsti4u Geschrieben 13. Dezember 2009 Geschrieben 13. Dezember 2009 (bearbeitet) du kompilierst wohl mit dem Ansi-C89-Standard, da musst du die erst alle Variablen am Anfang eines Blocks derklarieren! Und ich erkläre mal genau was hierbei passiert: int main() { int i, j; t_adresse** adressen; //Hier werden Zeiger auf Adressstrukturen gelagert t_adresse* adresse; //Zeiger der auf eine Adresse zeigt printf("Bitte Zahl eingeben: "); scanf("%i", &j); //Liest Zahl ein adressen=malloc(j * sizeof(t_adresse*)); //Reserviert Speicher für j ZEIGER! die auf die Adressen zeigen for (i = 0; i<j; i++) { adressen[i] = eingabe(); //Der i. Zeiger im Array adressen zeigt nun auf das in der eingabe() erstellte Adressstrukturobjekt } //Und immer schön alles freigeben am Ende for (i = 0; i<j; i++) { free(adressen[i]); //Hier wird das erstellte Adressobjekt wieder entfernt } free(adressen); //Und nun die Datenstruktur freigeben = entfernen return 0; }[/code] In eingabe() erstellst du deine Adressstrukturen, in der main() hast du nur Zeiger auf diese... [code] adressen -> adressen[0] ----->adressstruktur; adressen[1] ----->adressstruktur; adressen[2] ----->adressstruktur; .... Also du erstellst in eingabe eine Struktur, den zeiger auf diese gibt die methode zurück: adresse----->adresstruktur In der main gibts das Array adressen, in diesem array sind zeiger die auf nichts zeigen, adressen[0]----->NULL Wenn du nun adressen[0] = adresse; machst zeigt nun adressen[0] ebenfalls auf die Adressstruktur auf die auch adresse zeigt: adressen[0] ------> adressstruktur verständlicher? Bearbeitet 13. Dezember 2009 von konsti4u Zitieren
hame Geschrieben 13. Dezember 2009 Autor Geschrieben 13. Dezember 2009 mir war schon klar was da passiert, hättest ja niicht so ausführlich beschreiben müssen außer vlt das erste mit t_adresse**adressen das war nicht so klar. bei den anderen sachen wusste ich schon was passiert ich arbeite ja schon sein ein paar wochen mit c hehe. zwar nur für die uni aber egal. ^^ das weiß ich halt noch nicht was alle fehlermeldungen heißen. diese beispiel sollte eine bestimmt eine einführung in die listen sein und damit hab ich so ziemlich probleme es fängt ja schon bei der referenzierung bzw dereferenzierung von zeigern -.- Zitieren
hame Geschrieben 13. Dezember 2009 Autor Geschrieben 13. Dezember 2009 du kompilierst wohl mit dem Ansi-C89-Standard, da musst du die erst alle Variablen am Anfang eines Blocks derklarieren! Und ich erkläre mal genau was hierbei passiert: int main() { int i, j; t_adresse** adressen; //Hier werden Zeiger auf Adressstrukturen gelagert t_adresse* adresse; //Zeiger der auf eine Adresse zeigt printf("Bitte Zahl eingeben: "); scanf("%i", &j); //Liest Zahl ein adressen=malloc(j * sizeof(t_adresse*)); //Reserviert Speicher für j ZEIGER! die auf die Adressen zeigen for (i = 0; i<j; i++) { adressen[i] = eingabe(); //Der i. Zeiger im Array adressen zeigt nun auf das in der eingabe() erstellte Adressstrukturobjekt } //Und immer schön alles freigeben am Ende for (i = 0; i<j; i++) { free(adressen[i]); //Hier wird das erstellte Adressobjekt wieder entfernt } free(adressen); //Und nun die Datenstruktur freigeben = entfernen return 0; }[/code] In eingabe() erstellst du deine Adressstrukturen, in der main() hast du nur Zeiger auf diese... [code] adressen -> adressen[0] ----->adressstruktur; adressen[1] ----->adressstruktur; adressen[2] ----->adressstruktur; .... Also du erstellst in eingabe eine Struktur, den zeiger auf diese gibt die methode zurück: adresse----->adresstruktur In der main gibts das Array adressen, in diesem array sind zeiger die auf nichts zeigen, adressen[0]----->NULL Wenn du nun adressen[0] = adresse; machst zeigt nun adressen[0] ebenfalls auf die Adressstruktur auf die auch adresse zeigt: adressen[0] ------> adressstruktur verständlicher? sehr, danke! Zitieren
hame Geschrieben 13. Dezember 2009 Autor Geschrieben 13. Dezember 2009 das passt zwar gard nicht zum thema aber du kennst dich voll gut aus in dem thema bist du lehrer oder so oder was machst du ? hast du dir das alles selber beigebracht? ich versuchs nämlich auch grad aber es hängt halt an ein paar sachen ^^ Zitieren
konsti4u Geschrieben 13. Dezember 2009 Geschrieben 13. Dezember 2009 Studiere Informatik, seit 2,5 Monaten lerne ich C :-D Zitieren
hame Geschrieben 13. Dezember 2009 Autor Geschrieben 13. Dezember 2009 void suche(t_adresse** p, char *name, int k){ for(i=0;i<k;i++){ if(strcmp(p[i]->name,name)){ printf("name: %s\n", p[i]->name); printf("vorname: %s\n", p[i]->vorname); printf("plz: %i\n",p[i]->plz); } } } main(){ int i,k; t_adresse** p; char *name; t_adresse** adressen; t_adresse* adresse; printf("Bitte Anzahl eingeben: \n"); scanf("%i", &k); adressen=malloc(k * sizeof(t_adresse*)); for (i = 0; i<k; i++) { adressen[i] = eingabe(); } printf("Bitte namen eingeben: \n"); gets(name); suche(p,name,k); /*wieso hängt er sich hier auf?*/ for (i = 0; i<k; i++) { free(adressen[i]); } free(adressen); return 0; } kannst du mal nachschaun, er hängt sich auf beim eingeben des namens. Zitieren
hame Geschrieben 13. Dezember 2009 Autor Geschrieben 13. Dezember 2009 oha, ich studiere wirtschaftsinformatik und muss fast alle fächer aus informatik belegen und jetzt ist halt c dran, und ich muss mich sputen. wo studierst du? Zitieren
Klotzkopp Geschrieben 13. Dezember 2009 Geschrieben 13. Dezember 2009 wieso hängt er sich hier auf?Weil p ein uninitialisierter Zeiger ist. Speicher hast du für adressen geholt, nicht für p. Zitieren
hame Geschrieben 13. Dezember 2009 Autor Geschrieben 13. Dezember 2009 Weil p ein uninitialisierter Zeiger ist. Speicher hast du für adressen geholt, nicht für p. heißt ich muss speicher für p holen oder in den argumenten statt p, adressen schreiben? aber er hängt sich danach trotzdem wieder auf! Zitieren
konsti4u Geschrieben 13. Dezember 2009 Geschrieben 13. Dezember 2009 jo, stimmt, adressen der Methode find() übergeben und nicht p, da adressen ein zeiger ist, wird eine kopie vom Zeiger übergeben auf ein und das gleiche Array, also brauchst keine Angst zu haben, dass das Array sich irg.wie verändert oder so. dann musst du name dynamisch allokieren, weil man die größe nicht im voraus kennt, oder aber du definierst am anfang mit char* name[50] und liest es am besten mit fgets ein, aber fürn anfang reicht auch gets. im strcmp prüfst du ob die strings gleich sind, wenn gleich müsstest du auf ==0 prüfen, also: if (strcmp(adressen->name,name) == 0) dann sind sie gleich schau dir die Funktionsweise und rückgabewerte von strcmp an. Zitieren
hame Geschrieben 13. Dezember 2009 Autor Geschrieben 13. Dezember 2009 mich hat die blöd angabe von meinem blatt irritiert...deswegen hab ich p geschrieben. aber ich es klappt jetzt alles wunderbar und ich glaub ich check langsam das ganze konzept von pointer und structs ^^. danke nochmal Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.