Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

structs

Empfohlene Antworten

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

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

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

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

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

Studiere Informatik, seit 2,5 Monaten lerne ich C :-D


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.

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?

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!

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.

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.