# C Struktur an Funktion übergeben (call by reference) geht nicht. Mit Code.



## t0xic (5. Dezember 2010)

Hi, ich komme hier nicht weiter ich muss eine in der main() deklarierte struktur an eine funktion weitergeben als call by reference. Hier habe ich ein Array zu übergeben aber denke es dürfte keinen unterschied machen.

Funktionsbeschreibung:
Es sollen eingegebene Namen in 3 Listen eingeteilt werden 0.Liste alle Namen 1. und 2. Liste sollen ausgewählt werden. Anschließend soll die Liste1 ausgegeben werden.
Hier der Code. Was ist da falsch?
Der Compiler bringt keine Fehlermeldungen.
Sollen das mit Pfeiloperator machen.


```
#include <stdio.h>
#include <string.h>

#define MAX 20

struct listen {
	char name[MAX];
};



void einles(int *namezaehl,struct listen *liste[3][100])
{
	int auswahl,zaehl1=0,zaehl2=0;

	
	
	while(1)
	{
		printf("Name:");
		gets(liste[0][*namezaehl]->name);
		
		
		if(strlen(liste[0][*namezaehl]->name)==0)
			break;

		

		printf("Welche Liste (1 oder 2) :");
		scanf("%i",&auswahl);

		if(auswahl==1)
		{
			strcpy(liste[1][zaehl1]->name,liste[0][*namezaehl]->name);
			zaehl1++;
		}
		else
		{
			if(auswahl==2)
				strcpy(liste[2][zaehl2]->name,liste[0][*namezaehl]->name);
			zaehl2++;
		}
		
		getchar(); /*dummy getchar*/

		(*namezaehl)++;

	}
}

void ausgabeliste_1(int namezaehl,struct listen *liste[3][100])
	{
		int i;
		

		printf("....1. Liste......\n");

		for(i=0;i<namezaehl;i++)
		{
			printf("%s\n",liste[1][i]->name);
		}

		printf(".....Listenende.....");

	}


int main(void)
{
	int namezaehl=0;
	struct listen liste[3][100]={0,0};

	einles(&namezaehl,&liste[3][100]);
	ausgabeliste_1(namezaehl,&liste[3][100]);

	return 0;
}
```


----------



## badday (5. Dezember 2010)

Verwende bitte ensprechende Tags für den Code.

Zu deinem Problem: http://c-faq.com/aryptr/ary2dfunc3.html

Gruß,

badday


----------



## t0xic (5. Dezember 2010)

tut mir leid aber zu der faq bin ich mir nicht im klaren was jetzt genau auf mein problem zutrifft?


----------



## Trulleberg (5. Dezember 2010)

Hilfreich wäre zu wissen, was der Fehler in deinem Fall ist.


----------



## t0xic (5. Dezember 2010)

ich vermute er liegt in der übergabe der struktur des arrays also call by reference, denn der Algorithmus selbst ist fehlerfrei habs ohne call by reference also mit globalen strukturvariablen getestet.

Konkrete Frage, ist die Übergabe der Struktur und der Pfeiloperator siehe Code so richtig?


----------



## badday (5. Dezember 2010)

Das sollte schonmal funktionieren (hoffe ich mal  )


```
#include <stdio.h>
#include <string.h>

#define MAX 20

struct listen {
char name[MAX];
};



void einles(int *zaehl1,listen (*liste)[3][100])
{
int auswahl,namezaehl=0,zaehl2=0;



while(1)
{
printf("Name:");
gets((*liste)[0][namezaehl].name);


if(strlen((*liste)[0][namezaehl].name)==0)
break;



printf("Welche Liste (1 oder 2) :");
scanf("%i",&auswahl);

if(auswahl==1)
{
strcpy((*liste)[1][*zaehl1].name,(*liste)[0][namezaehl].name);
(*zaehl1)++;
}
else
{
if(auswahl==2)
strcpy((*liste)[2][zaehl2].name,(*liste)[0][namezaehl].name);
zaehl2++;
}

getchar(); /*dummy getchar*/

namezaehl++;

}
}

void ausgabeliste_1(int *z1,listen (*liste)[3][100])
{
int i;


printf("....1. Liste......\n");

for(i=0;i<(*z1);i++)
{
printf("%s\n",(*liste)[1][i].name);
}

printf(".....Listenende.....");

}


int main(void)
{
int zaehl1=0;
struct listen liste[3][100]={0,0};

einles(&zaehl1, &liste);
ausgabeliste_1(&zaehl1,&liste);

return 0;
}
```

Ist allerdings evtl. nicht so mit Pfeiloperatoren, wie ihr das machen sollt. Aber das sollte ja kein Problem sein ggf noch umzuschreiben 


Gruß,

badday


PS: Gerade gesehen, hatte die falsche Version reinkopiert. Was ich dir noch sagen möchte: Bei der Ausgabe für die 1. Liste kannst du nicht einfach die Anzahl aller Namen nehmen, sondern musst die Anzahl der Namen in der 1. Liste benutzen.
Wenn du nun deine Pfeiloperatoren benutzen musst/willst, beachte:
p->element entspricht  (*p).element


----------



## t0xic (5. Dezember 2010)

ich danke dir für deine schnelle Hilfe, jedoch muss vor list noch "struct" davor damit deklariert wird das dies ein element aus der struktur ist.

nun habe ich
	
	
	



```
strcpy((*liste)[1][*zaehl1].name,(*liste)[0][namezaehl].name);
```

zu

```
strcpy((liste)[1][*zaehl1]->name,(liste)[0][namezaehl]->name);
```

geändert und genau an diesem Punkt kommt ein Error denke das geht nicht so einfach mit dem Pfeiloperator bei zweidimensionalen Arrays oder? habe schon mit klammern alles versucht aber hat nichts geholfen.


----------



## deepthroat (6. Dezember 2010)

Hi.

Also grundsätzlich wird ein Array immer über call-by-reference übergeben.
Für Arrays gilt:

```
&array == array
```

Du kannst dir also eigentlich die extra Indirektion über einen Zeiger sparen.

```
void einles(int *namezaehl,struct listen liste[3][100]) {
  ...
}

int main() {
  ...
  einles(&zaehl, liste);
  ...
}
```
Außerdem vereinbart man gerne ein typedef um nicht immer "struct" vor den Typ schreiben zu müssen.

```
typedef struct listen {
  ...
} listen;

struct listen x; // OK
listen y; // auch OK
```
Weiterhin vermute ich mal, dass du wirklich eine Liste (Datenstruktur) implementieren sollst, und dazu brauchst du kein 2-dim. Array. Dabei wäre dann auch der Pfeiloperator viel nützlicher...

Gruß


----------

