Zum Inhalt springen

structs


hame

Empfohlene Beiträge

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 von hame
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von konsti4u
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 -.-

Link zu diesem Kommentar
Auf anderen Seiten teilen

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! ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen


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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...