Zum Inhalt springen

Empfohlene Beiträge

Geschrieben (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 von hame
Geschrieben (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 von konsti4u
Geschrieben

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

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

Geschrieben

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

Geschrieben


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.

Geschrieben

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?

Geschrieben
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!

Geschrieben

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.

Geschrieben

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

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