tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
926
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    t0xic t0xic ist offline Rookie
    Registriert seit
    Dec 2010
    Beiträge
    6
    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;
    }
     

  2. #2
    badday badday ist offline Mitglied Brokat
    Registriert seit
    Dec 2009
    Beiträge
    321
    Blog-Einträge
    1
    Verwende bitte ensprechende Tags für den Code.

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

    Gruß,

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

  3. #3
    t0xic t0xic ist offline Rookie
    Registriert seit
    Dec 2010
    Beiträge
    6
    tut mir leid aber zu der faq bin ich mir nicht im klaren was jetzt genau auf mein problem zutrifft?
     

  4. #4
    Trulleberg Trulleberg ist offline Mitglied Bronze
    Registriert seit
    Oct 2010
    Beiträge
    35
    Hilfreich wäre zu wissen, was der Fehler in deinem Fall ist.
     

  5. #5
    t0xic t0xic ist offline Rookie
    Registriert seit
    Dec 2010
    Beiträge
    6
    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?
     

  6. #6
    badday badday ist offline Mitglied Brokat
    Registriert seit
    Dec 2009
    Beiträge
    321
    Blog-Einträge
    1
    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).element
    Geä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 ;) )

  7. #7
    t0xic t0xic ist offline Rookie
    Registriert seit
    Dec 2010
    Beiträge
    6
    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 :
    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.
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.
    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);
      ...
    }
    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
    
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Streit: call by value / call by reference
    Von port29 im Forum .NET Café
    Antworten: 10
    Letzter Beitrag: 31.01.09, 13:57
  2. Struktur übergeben -Call by Reference
    Von chefsalat- im Forum VisualStudio & MFC
    Antworten: 8
    Letzter Beitrag: 22.06.07, 21:55
  3. Call by Reference
    Von Nikon the Third im Forum PHP
    Antworten: 1
    Letzter Beitrag: 07.06.05, 22:52
  4. Antworten: 4
    Letzter Beitrag: 17.03.05, 14:37
  5. call by reference
    Von incsoft im Forum Java
    Antworten: 6
    Letzter Beitrag: 01.11.04, 14:01

Stichworte