ERLEDIGT
NEIN
NEIN
ANTWORTEN
7
7
ZUGRIFFE
926
926
EMPFEHLEN
-
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;
}
-
Verwende bitte ensprechende Tags für den Code.
Zu deinem Problem: http://c-faq.com/aryptr/ary2dfunc3.html
Gruß,
baddayGalaxy under Fire - 24/7 Online-Real-Time-Strategy-Game - servers are already running - Wir suchen einen Texturier für 3D-Modelle (bei Interesse einfach PM ;) )
-
tut mir leid aber zu der faq bin ich mir nicht im klaren was jetzt genau auf mein problem zutrifft?
-
05.12.10 13:46 #4
- Registriert seit
- Oct 2010
- Beiträge
- 35
Hilfreich wäre zu wissen, was der Fehler in deinem Fall ist.
-
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
)
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
#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).elementGeändert von badday (05.12.10 um 15:04 Uhr)
Galaxy under Fire - 24/7 Online-Real-Time-Strategy-Game - servers are already running - Wir suchen einen Texturier für 3D-Modelle (bei Interesse einfach PM ;) )
-
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 ichCode :1
strcpy((*liste)[1][*zaehl1].name,(*liste)[0][namezaehl].name);
zu
Code :1
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.
-
06.12.10 08:38 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Also grundsätzlich wird ein Array immer über call-by-reference übergeben.
Für Arrays gilt:
Code c:1
&array == array
Du kannst dir also eigentlich die extra Indirektion über einen Zeiger sparen.
Außerdem vereinbart man gerne ein typedef um nicht immer "struct" vor den Typ schreiben zu müssen.Code c:1 2 3 4 5 6 7 8 9
void einles(int *namezaehl,struct listen liste[3][100]) { ... } int main() { ... einles(&zaehl, liste); ... }
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...Code c:1 2 3 4 5 6
typedef struct listen { ... } listen; struct listen x; // OK listen y; // auch OK
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
Streit: call by value / call by reference
Von port29 im Forum .NET CaféAntworten: 10Letzter Beitrag: 31.01.09, 13:57 -
Struktur übergeben -Call by Reference
Von chefsalat- im Forum VisualStudio & MFCAntworten: 8Letzter Beitrag: 22.06.07, 21:55 -
Call by Reference
Von Nikon the Third im Forum PHPAntworten: 1Letzter Beitrag: 07.06.05, 22:52 -
string an eine void Funktion übergeben, warum geht es nicht?
Von Fridulin im Forum .NET ArchivAntworten: 4Letzter Beitrag: 17.03.05, 14:37 -
call by reference
Von incsoft im Forum JavaAntworten: 6Letzter Beitrag: 01.11.04, 14:01





Zitieren
Login






