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 pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut Pointeur de pointeurs
    Bonjour, j'ai du mal à implanter mon pointeur de pointeurs d'amis dans la structure Personne. Comment dois-je modifier ma fonction sont_amis ? Merci d'avance !

    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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct {
    	char* nom;
    	unsigned int age;
    	unsigned int number;
    	char* adresse;
    	Personne** amis;
     
    }Personne;
     
    /*Prototypes*/
     
    /*Au début une personne n'a pas d'amis, son nom ne change pas mais son adresse peut*/
    void naissance(Personne** quidam,char* nom, unsigned int age, char* adresse);
    /*Crée un lien d'amitié symétrique */
    void sont_amis(Personne** a,Personne** b);
    /*prend deux personnes en paramètres et retourne le nombre d’amis communs*/
    int affinites(Personne* a,Personne* b);
    void demenage(Personne** a, char* adresse);
    void affiche(Personne* a);
    /*désalloue tout*/
    void clear(Personne** quidam);
     
    int main(void){
     
    	/*
     
    	 Nelly Bord (NB) et ALbert Zweinstein (AZ) sont amis
    	 Ahmas Pamouzh (AP) et Pierre Kiroul sont amis
    	 Claude During (CD), Georges Chatnonne (GC) et Alan Boule (AB) sont tous 3 amis
    	 NB, AP, GC et CD sont amis
     
    	 Affichez le nombre d'amis communs à AB et AP puis le nombre d'amis communs à GC et CD
     
    	 Faire déménager NB et l'afficher.
     
    	 */
     
     Personne* NB;
      naissance(&NB,"Bord Nelly", 28, "Rue du Petit-chêne");
      affiche(NB);
     
      Personne* AZ;
      naissance(&AZ, "Albert Zweinstein",34,"Rue de Lyon");
      affiche(AZ);
     
      Personne* AP;
      naissance(&AP, "Albert Zweinstein",45,"Rue du Lac");
      affiche(AP);
     
      Personne* PK;
      naissance(&PK, "Pierre Kiroul",23,"Rue des Alpes");
      affiche(PK);
     
      Personne* CD;
      naissance(&CD, "Claude During",89,"Rue des Oliviers");
      affiche(CD);
     
      Personne* GC;
      naissance(&GC, "Georges Chatnonne",67,"Rue du Port");
      affiche(GC);
     
      Personne* AB;
      naissance(&AB, "Alan Boule",7,"Rue du Commerce");
      affiche(AB);
     
      sont_amis(&NB,&AZ);
     
      printf(NB.amis[1].nom);
     
      demenage(&NB,"Rue des Acacias");
      affiche(NB);
     
      clear(&NB);
      clear(&AB);
      clear(&GC);
      clear(&CD);
      clear(&PK);
      clear(&AP);
      clear(&AZ);
      clear(&NB);
     
      return 0;
    }
     
    /* ================================================================== */
    void naissance(Personne** quidam,char* nom,unsigned int age, char* adresse)
    {
      *quidam=malloc(sizeof(Personne));
      (*quidam)->nom = calloc(strlen(nom)+1,sizeof(char));
      if((*quidam)->nom !=NULL)
        {
          strcpy((*quidam)->nom, nom);
        }
      (*quidam)->adresse = calloc (strlen(adresse)+1, sizeof(char));
      if((*quidam)->adresse != NULL)
        {
          strcpy((*quidam)->adresse, adresse);
        }
     
      (*quidam)->age = age;
      (*quidam)->number = 0;
    }
     
    /* ================================================================== */
    void sont_amis(Personne** a,Personne** b){
     
     (*a)->amis= malloc(((*a)->number+1))
     (*a)->amis[(*a)->number+1]=*b;
     (*b)->amis= malloc(((*b)->number+1)) 
     (*b)->amis[(*b)->number+1]=*a;
     (*a)->number++;
     (*b)->number++;; 
     
    }
    /* ================================================================== */
    void affiche(Personne* a){
    	printf("nom : %s\n",a->nom);
    	printf("age : %d ans\n",a->age);
    	printf("adresse : %s\n",a->adresse);
    	putchar('\n');
    }
    /* ================================================================== */
    void demenage(Personne** a, char* adresse){
            if((*a) != NULL)
            (*a)->adresse = realloc ((*a)->adresse ,(strlen(adresse)+1) *sizeof(char));
            if((*a)->adresse != NULL){
            strcpy((*a)->adresse,adresse);
            }
            printf("%s déménage %s : \n",(*a)->nom,adresse);
            putchar('\n');
    }
    /* ================================================================== */
    void clear(Personne** quidam){
            if((*quidam) != NULL){
                    if((*quidam)->adresse !=NULL){
                            free((*quidam)->adresse);
                            (*quidam)->adresse=NULL;
                    }
                    if((*quidam)->nom !=NULL){
                            free((*quidam)->nom);
                            (*quidam)->nom=NULL;
                    }
            free((*quidam));
            (*quidam)=NULL;
            }
    }

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    En C ceci ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct {
    	char* nom;
    	unsigned int age;
    	unsigned int number;
    	char* adresse;
    	Personne** amis;
     
    }Personne;
    Le compilateur va chercher un type Personne pour amis alors qu'il n'est pas encore déclaré!

    Avec ce type de structure tu n'as pas le choix. Tu dois déjà déclarer la structure normalement avant de définir un nouveau type dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct SPersonne
    {
      char* nom;
      unsigned int age;
      unsigned int number;
      char* adresse;
      struct SPersonne **amis;
    };
     
    typedef struct SPersonne Personne;

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    ok.
    je ne comprends pas pourquoi je n'arrive pas à ajouter une personne amie dans mon pointeur de pointeurs dans la fonction sont_amis... comment accéder aux éléments ?

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Le fait de faire malloc dans sont_amis(); pose 2 problèmes :
    1. Si il y a plusieurs amis seul le dernier subsiste,
    2. tu perds les pointeurs de la mémoire allouée pour les anciens amis. Tu ne peux donc plus libérer proprement au cas où.

    Il faudrait donc repenser la chose en testant si "a" a déjà au moins un ami :
    • Si pas d'ami => malloc();
    • Si déja au moins un ami => realloc();

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Lorsque tu exécutes sont_amis(); les deux pointeurs sont déjà alloués. Il n'est donc pas nécessaire de transmettre l'adresse du pointeur de chaque personne.
    Le prototype suivant suffit donc à l'exécution de ce que tu cherches à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void sont_amis(Personne *a,Personne *b);

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Bon, je ne suis pas très sûr de ma programmation mais je vais te la donner quand même.

    J'ai intégré dans ta fonction les vérifications si il y a plusieurs amis. J'ai aussi fait un peu de récursivité, si ca te fait pas peur .
    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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    struct SPersonne
    {
      char* nom;
      unsigned int age;
      unsigned int number;
      char* adresse;
      struct SPersonne **amis;
    };
     
    typedef struct SPersonne Personne;
     
    /*Prototypes*/
     
    /*Au début une personne n'a pas d'amis, son nom ne change pas mais son adresse peut*/
    void naissance(Personne** quidam,char* nom, unsigned int age, char* adresse);
    /*Crée un lien d'amitié symétrique */
    void sont_amis(Personne *a,Personne *b);
    int affinites(Personne a,Personne b);
    void demenage(Personne a, char* adresse);
    void affiche(Personne* a);
     
     
    int
    main(int argc, char *argv[])
    {
      /*
     
        Nelly Bord (NB) et ALbert Zweinstein (AZ) sont amis
        Ahmas Pamouzh (AP) et Pierre Kiroul sont amis
        Claude During (CD), Georges Chatnonne (GC) et Alan Boule (AB) sont tous 3 amis
        NB, AP, GC et CD sont amis
     
        Affichez le nombre d'amis communs à AB et AP puis le nombre d'amis communs à GC et CD
     
        Faire déménager NB et l'afficher.
     
      */
     
      Personne* NB;
      naissance(&NB,"Bord Nelly", 28, "Rue du Petit-chêne");
     
      Personne* AZ;
      naissance(&AZ, "Albert Zweinstein",34,"Rue de Lyon");
     
      Personne* AP;
      naissance(&AP, "Albert Zweinstein",45,"Rue du Lac");
     
      Personne* PK;
      naissance(&PK, "Pierre Kiroul",23,"Rue des Alpes");
     
      Personne* CD;
      naissance(&CD, "Claude During",89,"Rue des Oliviers");
     
      Personne* GC;
      naissance(&GC, "Georges Chatnonne",67,"Rue du Port");
     
      Personne* AB;
      naissance(&AB, "Alan Boule",7,"Rue du Commerce");
     
      sont_amis(NB,AZ);
      sont_amis(NB,AB);
      sont_amis(NB,CD);
     
      /* printf(NB.amis[1].nom); */
     
      /* demenage(&NB,"Rue des Acacias"); */
      affiche(NB);
     
      /* clear(&NB); */
      /* clear(&AB); */
      /* clear(&GC); */
      /* clear(&CD); */
      /* clear(&PK); */
      /* clear(&AP); */
      /* clear(&AZ); */
      /* clear(&NB); */
      return 0;
    }
     
    /* ================================================================== */
    void
    naissance(Personne** quidam,char* nom,unsigned int age, char* adresse)
    {
      *quidam=malloc(sizeof(Personne));
     
      (*quidam)->nom = calloc(strlen(nom)+1,sizeof(char));
      if((*quidam)->nom !=NULL)
        {
          strcpy((*quidam)->nom, nom);
        }
      (*quidam)->adresse = calloc (strlen(adresse)+1, sizeof(char));
      if((*quidam)->adresse != NULL)
        {
          strcpy((*quidam)->adresse, adresse);
        }
     
      (*quidam)->age = age;
      (*quidam)->number = 0;
    }
     
    /* ================================================================== */
    void
    sont_amis(Personne *a,Personne *b)
    {
      static int reentrant = 0;
     
      if (a->number == 0) // Pas encore d'amis
        {
          /* On alloue un espace mémoire de la taille de Personne puis on ajoute b */
          a->amis= malloc(sizeof (Personne));
          a->amis[0] = b;
     
          /* On incrémente le nombre d'amis pour a */
          a->number++;
     
          /* Il faut maintenant traiter le problème pour b. Un peu de récurcivité ne */
          /* fait jamais de mal ;). On inverse simplement les pointeurs a et b. */
          /* La variable reentrant permet de sortir de la récurcivité. */
          if (reentrant==0)
    	{
    	  reentrant=1;
    	  sont_amis (b, a);
    	  reentrant =0;
    	}
        }
      else  // Il y a déjà au moins un ami
        {
          /* On alloue un espace mémoire supplémentaire de la taille de Personne */
          /* puis on ajoute b */
          a->amis= realloc(a->amis, (a->number+1) * sizeof (Personne));
          a->amis[a->number]=b;
     
          /* On incrémente le nombre d'amis pour a */
          a->number++;
     
          /* Il faut maintenant traiter le problème pour b. L'idée est la même que */
          /* lorsqu'il n'y a pas d'amis */
          if (reentrant==0)
    	{
    	  reentrant=1;
    	  sont_amis (b, a);
    	  reentrant =0;
    	}
        }
    }
     
    /* ================================================================== */
    void
    affiche(Personne* a)
    {
      int i = 0;
      printf("nom : %s\n ",a->nom);
      printf("age : %d\n",a->age);
      printf("adresse : %s\n\n",a->adresse);
      printf("Nombre d'amis : %d\n", a->number);
      printf("---------------\n");
      for (i = 0; i < a->number; i++)
        {
          printf ("ami avec %s\n", a->amis[i]->nom);
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pointeurs et pointeurs de pointeurs
    Par wallace27 dans le forum C
    Réponses: 10
    Dernier message: 09/04/2015, 22h07
  2. Réponses: 21
    Dernier message: 06/08/2009, 09h31
  3. Réponses: 6
    Dernier message: 26/05/2007, 00h33
  4. pointeur de pointeur
    Par petdelascar dans le forum C
    Réponses: 2
    Dernier message: 05/12/2005, 10h26
  5. pointeur sur pointeur
    Par gaut dans le forum C
    Réponses: 3
    Dernier message: 01/11/2005, 21h30

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