IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

pointeur de structure en parametre d'une fonction :s


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    Par défaut pointeur de structure en parametre d'une fonction :s
    hello tlm

    alors voilà mon soucis, j'ai un pointeur sur une structure. et je voudrais passé celle-ci en paramètre de 2 fonctions, une pour l'affichage de ma struct, et l'autre pour l'initialisation.

    ayant toujours des problemes lorsqu'il sagit de passage en paramètre avec des pointeurs je me suis renseigner avant mais a la compilation j'ai un warning, et à l'exécution j'ai une erreur de segmentation..

    qq pourrait-il regarder mon code et me dire mon probleme?

    merci bcp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
    struct repart_struct{
    	int repartTab[4][4];
    };
     
    struct nombre_de{
            int reader;
            int joueur;
    };
     
    main(){
    	struct repart_struct* repartition;
    	struct nombre_de* nombre_de;
     
    	init(&repartition);
    	printf("%d\n",repartition->repartTab[0][0]);
    	afficheRepartition(&repartition);
    }
    void afficheRepartition(struct repart_struct* repartition){
    	int i,j;
    	for(i=0;i<4;i++){
    		for(j=0;j<4;j++){
    			switch(j){
    				case 0 : printf("Nb de joueur : ");break;
    				case 1 : printf("Nb de pion de chaque joueur : ");break;
    				case 2 : printf("Nb de pion caché : ");break;
    				case 3 : printf("Nb de pion visible : ");break;
    			}
    			printf("%d ",repartition->repartTab[i][j]);
    		}
    		printf("\n");
    	}
    }
    void init(struct repart_struct* repartition){
    	repartition->repartTab[0][0]= 2;
    	repartition->repartTab[0][1]= 7;
    	repartition->repartTab[0][2]= 7;
    	repartition->repartTab[0][3]= 7;
    	repartition->repartTab[1][0]= 3;
    	repartition->repartTab[1][1]= 7;
    	repartition->repartTab[1][2]= 7;
    	repartition->repartTab[1][3]= 0;
    	repartition->repartTab[2][0]= 4;
    	repartition->repartTab[2][1]= 5;
    	repartition->repartTab[2][2]= 4;
    	repartition->repartTab[2][3]= 4;
    	repartition->repartTab[3][0]= 5;
    	repartition->repartTab[3][1]= 4;
    	repartition->repartTab[3][2]= 4;
    	repartition->repartTab[3][3]= 4;
     
    }
    mes waring :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    serveur.c:72: attention : conflicting types for ‘afficheRepartition’
    serveur.c:70: attention : previous implicit declaration of ‘afficheRepartition’ was here
    serveur.c:87: attention : conflicting types for ‘init’
    serveur.c:68: attention : previous implicit declaration of ‘init’ was here
    et à l'execution ca plante au moment de l'appel a la fonction init(...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Erreur de segmentation
    [/quote]

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Eterenel problème des pointeurs non initialisés, tu passes une adresse non valide, il faut au moins faire un malloc de la structure où alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // respecte la norme du C
    int main(void){
       struct repart_struct repartition;
     
       // a quoi il sert ??
       struct nombre_de* nombre_de;
     
       init(&repartition);
       printf("%d\n",repartition.repartTab[0][0]);
       afficheRepartition(&repartition);
      // la fonction main retourne 0
      return 0;
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    Par défaut
    j'ai modifier ce que tu m'as di pour le main, et le return en fin.

    Mais mon pointeur reçoit déjà qq chose par un appel systeme, je l'ai juste pas mis dans mon code pour pas faire trop charger :s

    bref je vais tout mettre quoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<sys/ipc.h>
    #include<sys/types.h>
    #include<sys/shm.h>
     
    #define PATH_SHARED "key_shared.lock"
     
    struct repart_struct{
    	int repartTab[4][4];
    };
     
    struct nombre_de{
            int reader;
            int joueur;
    };
     
    main(){
    	key_t cle_shared_repart;
    	key_t cle_shared_nombre;
    	int shid_nombre;
    	int shid_repart;
    	struct repart_struct* repartition;
    	struct nombre_de* nombre_de;
     
     
    	printf("SERVEUR DAMEMO : MAJ 2006-04-07\n"); 
     
    	if((cle_shared_nombre=ftok(PATH_SHARED,1))<0){
                    perror("Erreur Ftok");
    	        exit(EXIT_FAILURE);
    	}
     
            if((shid_nombre = shmget(cle_shared_nombre,sizeof(struct nombre_de),IPC_CREAT|0666))<0){
    		perror("Erreur shmget");
    		exit(EXIT_FAILURE);
    	}
     
    	if((nombre_de = (struct nombre_de*)shmat(shid_nombre,NULL,0)) ==(void*)-1 ){
    		perror("Erreur attach nombre_de");
    	        exit(EXIT_FAILURE);
    	}
     
    	printf("SHARED MEMORY : nombre de : ID : %d, cle : %d\n",shid_nombre,cle_shared_nombre);
     
    	if((cle_shared_repart=ftok(PATH_SHARED,22))<0){
                    perror("Erreur Ftok");
    	        exit(EXIT_FAILURE);
    	}
     
            if((shid_repart = shmget(cle_shared_repart,sizeof(struct repart_struct),IPC_CREAT|0666))<0){
    		perror("Erreur shmget");
    		exit(EXIT_FAILURE);
    	}
     
    	if((repartition = (struct repart_struct*)shmat(shid_repart,NULL,0)) ==(void*)-1 ){
    		perror("Erreur attach nombre_de");
    	        exit(EXIT_FAILURE);
    	}
     
    	printf("SHARED MEMORY : repartition : ID : %d, cle : %d\n",shid_repart,cle_shared_repart);
     
    	init(&repartition);
    	printf("%d\n",repartition->repartTab[0][0]);
    	afficheRepartition(&repartition);
    }
    void afficheRepartition(struct repart_struct* repartition){
    	int i,j;
    	for(i=0;i<4;i++){
    		for(j=0;j<4;j++){
    			switch(j){
    				case 0 : printf("Nb de joueur : ");break;
    				case 1 : printf("Nb de pion de chaque joueur : ");break;
    				case 2 : printf("Nb de pion caché : ");break;
    				case 3 : printf("Nb de pion visible : ");break;
    			}
    			printf("%d ",repartition->repartTab[i][j]);
    		}
    		printf("\n");
    	}
    }
    void init(struct repart_struct* repartition){
    	repartition->repartTab[0][0]= 2;
    	repartition->repartTab[0][1]= 7;
    	repartition->repartTab[0][2]= 7;
    	repartition->repartTab[0][3]= 7;
    	repartition->repartTab[1][0]= 3;
    	repartition->repartTab[1][1]= 7;
    	repartition->repartTab[1][2]= 7;
    	repartition->repartTab[1][3]= 0;
    	repartition->repartTab[2][0]= 4;
    	repartition->repartTab[2][1]= 5;
    	repartition->repartTab[2][2]= 4;
    	repartition->repartTab[2][3]= 4;
    	repartition->repartTab[3][0]= 5;
    	repartition->repartTab[3][1]= 4;
    	repartition->repartTab[3][2]= 4;
    	repartition->repartTab[3][3]= 4;
     
    }

  4. #4
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Points : 91
    Points
    91
    Par défaut
    tu dois déclarer tes fonctions avant le main() :
    void afficheRepartition(struct repart_struct* repartition);
    void init(struct repart_struct* repartition);

    et passer en paramètre non pas
    init(&repartition), mais init(repartition)

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: pointeur de structure en parametre d'une fonction :s
    Citation Envoyé par breezer911
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    main(){
    	struct repart_struct* repartition;
     
    <d'apres ton autre post, 'repartition' est mis a jour. ...>
     
    	afficheRepartition(&repartition);
    }
    <...>
    void afficheRepartition(struct repart_struct* repartition){
    Pourquoi faire ce '&' ? Retire le.
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    Par défaut
    c'est fait, maintenant a l'éxécution tout passe, mais il me reste toujours ces warning :s

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par breezer911
    c'est fait, maintenant a l'éxécution tout passe, mais il me reste toujours ces warning :s
    Tu as aussi retiré le '&' de l'appel de afficheRepartition() ?
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Nouveau membre du Club Avatar de Trillian
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 47
    Points : 29
    Points
    29
    Par défaut
    Est-ce que tu as mis les fonctions avant le main()?

    Ou bien juste leurs signatures:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void afficheRepartition(struct repart_struct* repartition);
    void init(struct repart_struct* repartition);
     
    int
    main(){
       key_t cle_shared_repart; 
       ...
     
       return 0;
    }
    Puis quand je cree des structures, en general j'en fais des types.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //attention, C++ n'accepte pas le meme nom pour les 2 !
    typedef struct repart_struct *repart_struct; 
     
    struct repart_struct{
       ...
    };
    et tu te sers de repart_struct comme n'importe quel type. mais bon, c'est une question de choix personnel.
    Les Bulgares ne parlent ni Français, ni Coréen, mais se débrouillent toujours pour obtenir des réductions sur les géraniums.
    Correction, certain(e)s bulgares parlent français...

Discussions similaires

  1. pointeur comme parametre d'une fonction
    Par sissouna01 dans le forum C
    Réponses: 2
    Dernier message: 09/05/2014, 14h15
  2. Réponses: 2
    Dernier message: 09/03/2014, 23h10
  3. Tableau de structures en parametre d'une fonction
    Par -No Comment- dans le forum C
    Réponses: 19
    Dernier message: 29/03/2006, 15h00
  4. Réponses: 12
    Dernier message: 25/01/2006, 07h29
  5. tableau dynamique en parametre d'une fonction
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 27/04/2004, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo