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

t0xic

Grünschnabel
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.

Code:
#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;
}
 
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?
 
Das sollte schonmal funktionieren (hoffe ich mal ;) )

C++:
#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
 
Zuletzt bearbeitet:
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
Code:
strcpy((*liste)[1][*zaehl1].name,(*liste)[0][namezaehl].name);

zu
Code:
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.
 
Hi.

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

Du kannst dir also eigentlich die extra Indirektion über einen Zeiger sparen.
C:
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.
C:
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ß
 
Zurück