Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hab ein Problem mit zeiger struct unf Funktionen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.05.2006, 20:55 Uhr
Frido



Wie muß ich test richtig deklarieren und übergeben damit ich das ergebnis richtig ausgeben kann in der Unterfunktion und main.
Bitte


Code:
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
# include <string.h>

typedef struct{
    char Name[30];
    int Tore;
} mannschaften_t;

typedef struct{
    int heim;
    int gast;
    int plus;
    int minus;
} paarung_t;

void eingab(mannschaften_t *teilnehmer){

    teilnehmer[0].Tore = 4;
    teilnehmer[1].Tore = 5;
    teilnehmer[2].Tore = 6;
    printf("%i,%i,%i\n", teilnehmer[0].Tore,teilnehmer[1].Tore,teilnehmer[2].Tore);
    strcpy(teilnehmer[0].Name ,"Tobi");
    strcpy(teilnehmer[1].Name ,"Mutti");
    strcpy(teilnehmer[2].Name ,"alex");
    printf("%s,%s,%s\n",teilnehmer[0].Name,teilnehmer[1].Name,teilnehmer[2].Name);
}

void eingab2(mannschaften_t **test){

    *test = (mannschaften_t*)malloc(3 * sizeof(mannschaften_t));
    if(test == NULL) printf("NO");
    test[0]->Tore = 1;
    test[1]->Tore = 2;
    test[2]->Tore = 3;
    strcpy(test[0]->Name,"Marco");
    strcpy(test[1]->Name,"danni");
    strcpy(test[2]->Name,"Tim");
    printf("%i,%i,%i\n", test[0]->Tore,test[1]->Tore,test[2]->Tore);
    printf("%s,%s,%s\n",test[0]->Name,test[1]->Name,test[2]->Name);
    
}

int main (void){

    mannschaften_t *teilnehmer,*test;
    paarung_t **spielplan;
    
    teilnehmer = (mannschaften_t*)malloc(3 * sizeof(mannschaften_t));
    if(teilnehmer == NULL) printf("NO");
    teilnehmer[0].Tore = 1;
    teilnehmer[1].Tore = 2;
    teilnehmer[2].Tore = 3;
    strcpy(teilnehmer[0].Name ,"Marco");
    strcpy(teilnehmer[1].Name ,"Dani");
    strcpy(teilnehmer[2].Name ,"tim");
    printf("%i,%i,%i\n", teilnehmer[0].Tore,teilnehmer[1].Tore,teilnehmer[2].Tore);
    printf("%s,%s,%s\n",teilnehmer[0].Name,teilnehmer[1].Name,teilnehmer[2].Name);
    eingab(teilnehmer);
    printf("%i,%i,%i\n", teilnehmer[0].Tore,teilnehmer[1].Tore,teilnehmer[2].Tore);
    printf("%s,%s,%s\n",teilnehmer[0].Name,teilnehmer[1].Name,teilnehmer[2].Name);

    printf("****************************************************************\n");

    eingab2(&test);
    printf("%i,%i,%i\n", test[0].Tore,test[1].Tore,test[2].Tore);
    printf("%s,%s,%s\n",test[0].Name,test[1].Name,test[2].Name);




    free(teilnehmer);
    free(test);

}


--
http://spielwelt14.monstersgame.net/?ac=vid&vid=28103555
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.05.2006, 16:12 Uhr
Helmut



Hi!
Also test nicht als **test deklarieren, sondern als *test. Dann in eingabe2(...) einen Zeiger
auf test als Referenz übergeben. Dein Programm sieht dann so aus:

C++:


# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
# include <string.h>

typedef struct{
    char Name[30];
    int Tore;
} mannschaften_t;

typedef struct{
    int heim;
    int gast;
    int plus;
    int minus;
} paarung_t;

void eingab(mannschaften_t *teilnehmer){

    teilnehmer[0].Tore = 4;
    teilnehmer[1].Tore = 5;
    teilnehmer[2].Tore = 6;
    printf("%i,%i,%i\n", teilnehmer[0].Tore,teilnehmer[1].Tore,teilnehmer[2].Tore);
    strcpy(teilnehmer[0].Name ,"Tobi");
    strcpy(teilnehmer[1].Name ,"Mutti");
    strcpy(teilnehmer[2].Name ,"alex");
    printf("%s,%s,%s\n",teilnehmer[0].Name,teilnehmer[1].Name,teilnehmer[2].Name);
}

void eingab2(mannschaften_t*& test){

    test = (mannschaften_t*)malloc(3 * sizeof(mannschaften_t));
    if(test == NULL) printf("NO");
    test[0].Tore = 1;
    test[1].Tore = 2;
    test[2].Tore = 3;
    strcpy(test[0].Name,"Marco");
    strcpy(test[1].Name,"danni");
    strcpy(test[2].Name,"Tim");
    printf("%i,%i,%i\n", test[0].Tore,test[1].Tore,test[2].Tore);
    printf("%s,%s,%s\n",test[0].Name,test[1].Name,test[2].Name);
    
}

int main (void){

    mannschaften_t *teilnehmer, *test;
    paarung_t **spielplan;
    
    teilnehmer = (mannschaften_t*)malloc(3 * sizeof(mannschaften_t));
    if(teilnehmer == NULL) printf("NO");
    teilnehmer[0].Tore = 1;
    teilnehmer[1].Tore = 2;
    teilnehmer[2].Tore = 3;
    strcpy(teilnehmer[0].Name ,"Marco");
    strcpy(teilnehmer[1].Name ,"Dani");
    strcpy(teilnehmer[2].Name ,"tim");
    printf("%i,%i,%i\n", teilnehmer[0].Tore,teilnehmer[1].Tore,teilnehmer[2].Tore);
    printf("%s,%s,%s\n",teilnehmer[0].Name,teilnehmer[1].Name,teilnehmer[2].Name);
    eingab(teilnehmer);
    printf("%i,%i,%i\n", teilnehmer[0].Tore,teilnehmer[1].Tore,teilnehmer[2].Tore);
    printf("%s,%s,%s\n",teilnehmer[0].Name,teilnehmer[1].Name,teilnehmer[2].Name);

    printf("****************************************************************\n");

    eingab2(test);
    printf("%i,%i,%i\n", test[0].Tore,test[1].Tore,test[2].Tore);
    printf("%s,%s,%s\n",test[0].Name,test[1].Name,test[2].Name);




    free(teilnehmer);
    free(test);

}





MfG Helmut
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.05.2006, 21:04 Uhr
Frido



Habe da nochmal ne Frage zur Pointer Übergabe Call by Referenz.
Ich habe schon mal was ausprobiert aber das klappt nicht so richtig.
Ich möchte nun gerne ein Pointer und einen Doppelpinter übergeben.
Und dann die Adresse vom Pointer im Doppelpointer speichern.



C++:


# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
# include <string.h>

typedef struct{
    char Name[30];
    int Tore;
} mannschaften_t;

typedef struct{
    int heim;
    int gast;
    int plus;
    int minus;
} paarung_t;


void eingab2(mannschaften_t **test){

    *test = (mannschaften_t*)malloc(3 * sizeof(mannschaften_t));
    if(test == NULL) printf("NO");
    (*test)[0].Tore = 4;
    (*test)[1].Tore = 5;
    (*test)[2].Tore = 6;
    strcpy((*test)[0].Name,"Marco");
    strcpy((*test)[1].Name,"danni");
    strcpy((*test)[2].Name,"Tim");
    printf("%i,%i,%i\n",(*test)[0].Tore,(*test)[1].Tore,(*test)[2].Tore);
    printf("%s,%s,%s\n",(*test)[0].Name,(*test)[1].Name,(*test)[2].Name);
  
}

void eingab3(paarung_t ***spielplan,mannschaften_t *test){

    int i;
    *spielplan = (paarung_t**)malloc(3 * sizeof(paarung_t*));
    if( spielplan == NULL) printf("NO");
    for(i = 0; i < 4; i++){
        spielplan[i]=(paarung_t*)malloc(sizeof(paarung_t));
        if( spielplan[i] == NULL) printf("NO");
    }
    (*spielplan)[0][0].heim = &test[0];
    (*spielplan)[1][0].heim = &test[1];
        (*spielplan)[2][0].heim = &test[2];
    printf("%s\n",spielplan[0][0]->heim);
}

int main (void){

    int i;
    mannschaften_t *test;
    paarung_t **spielplan;
  
  
    eingab(teilnehmer);
    printf("%i,%i,%i\n", teilnehmer[0].Tore,teilnehmer[1].Tore,teilnehmer[2].Tore);
    printf("%s,%s,%s\n",teilnehmer[0].Name,teilnehmer[1].Name,teilnehmer[2].Name);

printf("****************************************************************\n");
    eingab2(&test);
    printf("%i,%i,%i\n", test[0].Tore,test[1].Tore,test[2].Tore);
    printf("%s,%s,%s\n",test[0].Name,test[1].Name,test[2].Name);

    printf("****************************************************************\n");
    eingab3(&spielplan,&test);
    printf("%s\n",spielplan[0][0].heim);

    for(i = 0;i < 4;i++){
        free(spielplan[i]);
    }
    free(spielplan);
    free(test);

}



mod edit: [/cpp] hinzugefügt
--
http://spielwelt14.monstersgame.net/?ac=vid&vid=28103555

Dieser Post wurde am 16.05.2006 um 21:40 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.05.2006, 06:00 Uhr
Helmut



Hi!

C++:
void eingab3(paarung_t ***spielplan,mannschaften_t *test)



***spielplan Brrrrrr!

Bei Dir findet die Fussball-WM wohl jetzt schon statt!?

Also Zeiger auf Zeiger auf Zeiger - kann man machen -> aber nicht bei mehrdimensionalen
Arrays! Der Compiler muß ab der zweiten Dimension die Feldgrenzen kennen.

Und in ner for Schleife Speicher allokieren um sowas nachzubilden, kann ja wohl nicht
das Wahre sein, selbst dann nicht, wenns am Ende funktionieren sollte.

Hab Dein Programm etwas abgeändert :

C++:
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
# include <string.h>

typedef struct{
    char Name[30];
    int Tore;
} mannschaften_t;

typedef struct{
    int heim;
    int gast;
    int plus;
    int minus;
} paarung_t;

void eingab(mannschaften_t *teilnehmer){

    teilnehmer[0].Tore = 4;
    teilnehmer[1].Tore = 5;
    teilnehmer[2].Tore = 6;
    printf("%i,%i,%i\n", teilnehmer[0].Tore,teilnehmer[1].Tore,teilnehmer[2].Tore);
    strcpy(teilnehmer[0].Name ,"Tobi");
    strcpy(teilnehmer[1].Name ,"Mutti");
    strcpy(teilnehmer[2].Name ,"alex");
    printf("%s,%s,%s\n",teilnehmer[0].Name,teilnehmer[1].Name,teilnehmer[2].Name);
}

void eingab2(mannschaften_t **test){

    *test = (mannschaften_t*)malloc(3 * sizeof(mannschaften_t));
    if(test == NULL) printf("NO");
    (*test)[0].Tore = 4;
    (*test)[1].Tore = 5;
    (*test)[2].Tore = 6;
    strcpy((*test)[0].Name,"Marco");
    strcpy((*test)[1].Name,"danni");
    strcpy((*test)[2].Name,"Tim");
    printf("%i,%i,%i\n",(*test)[0].Tore,(*test)[1].Tore,(*test)[2].Tore);
    printf("%s,%s,%s\n",(*test)[0].Name,(*test)[1].Name,(*test)[2].Name);
  
}

typedef paarung_t(*pspielplan)[3]; //! und nicht ***spielplan  
// Der Compiler muß bei Mehrdimensionalität die Feldgrenzen kennen.

void eingab3(pspielplan& spielplan,mannschaften_t* test){  
    //pspielplan& spielplan     Übergabe per Referenz
    spielplan = (pspielplan)malloc(3*3*sizeof(paarung_t));
    //gesamten benötigten Speicher auf einmal allokieren.
    if( spielplan == NULL) printf("NO");            
    spielplan[0][0].heim = (int)&test[0];
    spielplan[1][0].heim = (int)&test[1];
    spielplan[2][0].heim = (int)&test[2];
    printf("%s\n",spielplan[0][0].heim);
}

int main (void){

    mannschaften_t* teilnehmer, *test;
    pspielplan spielplan ;

    teilnehmer = (mannschaften_t*)malloc(3 * sizeof(mannschaften_t));
    if(teilnehmer == NULL) printf("NO");
    teilnehmer[0].Tore = 1;
    teilnehmer[1].Tore = 2;
    teilnehmer[2].Tore = 3;
    strcpy(teilnehmer[0].Name ,"Marco");
    strcpy(teilnehmer[1].Name ,"Dani");
    strcpy(teilnehmer[2].Name ,"tim");
    printf("%i,%i,%i\n", teilnehmer[0].Tore,teilnehmer[1].Tore,teilnehmer[2].Tore);
    printf("%s,%s,%s\n",teilnehmer[0].Name,teilnehmer[1].Name,teilnehmer[2].Name);
  
    eingab(teilnehmer);
    printf("%i,%i,%i\n", teilnehmer[0].Tore,teilnehmer[1].Tore,teilnehmer[2].Tore);
    printf("%s,%s,%s\n",teilnehmer[0].Name,teilnehmer[1].Name,teilnehmer[2].Name);
                                                                                            
    printf("****************************************************************\n");
    eingab2(&test);
    printf("%i,%i,%i\n", test[0].Tore,test[1].Tore,test[2].Tore);
    printf("%s,%s,%s\n",test[0].Name,test[1].Name,test[2].Name);

    printf("****************************************************************\n");
    eingab3(spielplan,test);
    printf("%s\n",spielplan[0][0].heim);

    free(spielplan);
    free(test);
    free(teilnehmer);
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: