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

  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 322
    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 322
    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 322
    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 322
    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 322
    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 322
    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 322
    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 322
    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);
        }
    }

  7. #7
    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
    Ah c'est astucieux d'ajouter la variable reentrant ! Je n'y aurai jamais pensé! Merci! Y a -t-il une différence entre static et const ?

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 322
    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 322
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par gbauby Voir le message
    Ah c'est astucieux d'ajouter la variable reentrant ! Je n'y aurai jamais pensé! Merci! Y a -t-il une différence entre static et const ?
    Oui il y en a une, et pas des moindres :
    • const : une fois la valeur attribuée tu ne peux plus la changer,
    • static : la variable n'est plus considérée par le compilateur comme locale. Elle a donc le même comportement qu'une variable globale. Ceci étant dit, ce comportement n'est vrai qu'à l'intérieur de la fonction où elle a été déclarée.

  9. #9
    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
    la console m'affiche pleins de valeurs bizarres quand j'exécute le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int affinites(Personne* a,Personne* b){
       int i,j;
       int nb=0;
      for( i=0; i<a->number;i++){
       for( j=0; j<b->number;j++) {
          if(a->amis[i]==b->amis[j]){
            nb++;
          }
        }
     
     }return nb;

  10. #10
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 322
    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 322
    Billets dans le blog
    5
    Par défaut
    Montre-nous.

  11. #11
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int affinites(Personne* a,Personne* b){
       int i,j;
       int nb=0;
      for( i=0; i<a->number;i++){
       for( j=0; j<b->number;j++) {
          if(a->amis[i]==b->amis[j]){
            nb++;
          }
        }
     
     }return nb;
    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
    *** glibc detected *** ./exo2: double free or corruption (out): 0x0000000000a9a1c0 ***
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x78a8f)[0x7ff7d20ffa8f]
    /lib/x86_64-linux-gnu/libc.so.6(cfree+0x73)[0x7ff7d21038e3]
    ./exo2[0x400de6]
    ./exo2[0x400922]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xff)[0x7ff7d20a5eff]
    ./exo2[0x400639]
    ======= Memory map: ========
    00400000-00402000 r-xp 00000000 08:01 401053                             /home/gabriellebuytaert/exo2
    00601000-00602000 r--p 00001000 08:01 401053                             /home/gabriellebuytaert/exo2
    00602000-00603000 rw-p 00002000 08:01 401053                             /home/gabriellebuytaert/exo2
    00a9a000-00abb000 rw-p 00000000 00:00 0                                  [heap]
    7ff7cc000000-7ff7cc021000 rw-p 00000000 00:00 0 
    7ff7cc021000-7ff7d0000000 ---p 00000000 00:00 0 
    7ff7d1e71000-7ff7d1e86000 r-xp 00000000 08:01 266325                     /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ff7d1e86000-7ff7d2085000 ---p 00015000 08:01 266325                     /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ff7d2085000-7ff7d2086000 r--p 00014000 08:01 266325                     /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ff7d2086000-7ff7d2087000 rw-p 00015000 08:01 266325                     /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ff7d2087000-7ff7d2211000 r-xp 00000000 08:01 266297                     /lib/x86_64-linux-gnu/libc-2.13.so
    7ff7d2211000-7ff7d2410000 ---p 0018a000 08:01 266297                     /lib/x86_64-linux-gnu/libc-2.13.so
    7ff7d2410000-7ff7d2414000 r--p 00189000 08:01 266297                     /lib/x86_64-linux-gnu/libc-2.13.so
    7ff7d2414000-7ff7d2415000 rw-p 0018d000 08:01 266297                     /lib/x86_64-linux-gnu/libc-2.13.so
    7ff7d2415000-7ff7d241b000 rw-p 00000000 00:00 0 
    7ff7d241b000-7ff7d243c000 r-xp 00000000 08:01 266284                     /lib/x86_64-linux-gnu/ld-2.13.so
    7ff7d2628000-7ff7d262b000 rw-p 00000000 00:00 0 
    7ff7d2638000-7ff7d263b000 rw-p 00000000 00:00 0 
    7ff7d263b000-7ff7d263c000 r--p 00020000 08:01 266284                     /lib/x86_64-linux-gnu/ld-2.13.so
    7ff7d263c000-7ff7d263e000 rw-p 00021000 08:01 266284                     /lib/x86_64-linux-gnu/ld-2.13.so
    7fffbae1d000-7fffbae3e000 rw-p 00000000 00:00 0                          [stack]
    7fffbaf36000-7fffbaf37000 r-xp 00000000 00:00 0                          [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
    Aborted

  12. #12
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 322
    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 322
    Billets dans le blog
    5
    Par défaut
    Chez moi ca à l'air de fonctionner.

    Voila ta fonction avec une présentation plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int
    affinites(Personne *a,Personne *b)
    {
      int i,j;
      int nb=0;
      for( i=0; i< a->number; i++)
          for( j=0; j<b->number; j++)
    	  if(a->amis[i]==b->amis[j])
    	      nb++;
      return nb;
    }
    En admettant que je fasse cette association :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      sont_amis(NB, AZ);
      sont_amis(NB, AB);
      sont_amis(NB, CD);
      sont_amis(CD, AZ);
     
      affiche(NB);
      printf ("affinité de %s et de %s : %d\n", NB->nom, CD->nom, affinites (NB, CD));
    J'ai le résultat suivant en console, ce qui est normal il me semble :
    nom : Bord Nelly
    age : 28
    adresse : Rue du Petit-chêne

    Nombre d'amis : 3
    ---------------
    ami avec Albert Zweinstein
    ami avec Alan Boule
    ami avec Claude During
    affinité de Bord Nelly et de Claude During : 1

  13. #13
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 322
    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 322
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par gbauby Voir le message
    *** glibc detected *** ./exo2: double free or corruption (out): 0x0000000000a9a1c0 ***
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x78a8f)[0x7ff7d20ffa8f]
    /lib/x86_64-linux-gnu/libc.so.6(cfree+0x73)[0x7ff7d21038e3]
    ./exo2[0x400de6]
    ./exo2[0x400922]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xff)[0x7ff7d20a5eff]
    ./exo2[0x400639]
    ======= Memory map: ========
    00400000-00402000 r-xp 00000000 08:01 401053 /home/gabriellebuytaert/exo2
    00601000-00602000 r--p 00001000 08:01 401053 /home/gabriellebuytaert/exo2
    00602000-00603000 rw-p 00002000 08:01 401053 /home/gabriellebuytaert/exo2
    00a9a000-00abb000 rw-p 00000000 00:00 0 [heap]
    7ff7cc000000-7ff7cc021000 rw-p 00000000 00:00 0
    7ff7cc021000-7ff7d0000000 ---p 00000000 00:00 0
    7ff7d1e71000-7ff7d1e86000 r-xp 00000000 08:01 266325 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ff7d1e86000-7ff7d2085000 ---p 00015000 08:01 266325 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ff7d2085000-7ff7d2086000 r--p 00014000 08:01 266325 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ff7d2086000-7ff7d2087000 rw-p 00015000 08:01 266325 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ff7d2087000-7ff7d2211000 r-xp 00000000 08:01 266297 /lib/x86_64-linux-gnu/libc-2.13.so
    7ff7d2211000-7ff7d2410000 ---p 0018a000 08:01 266297 /lib/x86_64-linux-gnu/libc-2.13.so
    7ff7d2410000-7ff7d2414000 r--p 00189000 08:01 266297 /lib/x86_64-linux-gnu/libc-2.13.so
    7ff7d2414000-7ff7d2415000 rw-p 0018d000 08:01 266297 /lib/x86_64-linux-gnu/libc-2.13.so
    7ff7d2415000-7ff7d241b000 rw-p 00000000 00:00 0
    7ff7d241b000-7ff7d243c000 r-xp 00000000 08:01 266284 /lib/x86_64-linux-gnu/ld-2.13.so
    7ff7d2628000-7ff7d262b000 rw-p 00000000 00:00 0
    7ff7d2638000-7ff7d263b000 rw-p 00000000 00:00 0
    7ff7d263b000-7ff7d263c000 r--p 00020000 08:01 266284 /lib/x86_64-linux-gnu/ld-2.13.so
    7ff7d263c000-7ff7d263e000 rw-p 00021000 08:01 266284 /lib/x86_64-linux-gnu/ld-2.13.so
    7fffbae1d000-7fffbae3e000 rw-p 00000000 00:00 0 [stack]
    7fffbaf36000-7fffbaf37000 r-xp 00000000 00:00 0 [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
    Aborted
    Désolé nos réponses se sont croisées. Ca c'est un problème lié à la libération mémoire. Montre-nous la fonction clear(); que tu utilises.

  14. #14
    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
    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
    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;
                    }
                    if((*quidam)->amis !=NULL){
                    int i;
      for (i = 0; i < (*quidam)->number; i++)
        {
          free((*quidam)->amis[i]);
          (*quidam)->amis[i]=NULL;
        }
                    }
            free((*quidam));
            (*quidam)=NULL;
            }
     
    }

  15. #15
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 322
    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 322
    Billets dans le blog
    5
    Par défaut
    Pense à mettre ton code entre les balises. Il te suffit de sélectionner ton code et ensuite de cliquer sur le # dans la barre d'icônes au dessus.

    Pendant ce temps je regarde ton code...

  16. #16
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 322
    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 322
    Billets dans le blog
    5
    Par défaut
    Dans ta fonction clear(); tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
          if((*quidam)->amis !=NULL)
    	{
    	  int i;
    	  for (i = 0; i < (*quidam)->number; i++)
    	    {
    	      free((*quidam)->amis[i]);
    	      (*quidam)->amis[i]=NULL;
    	    }
    	}
    Donc tu libéres les amis. Mais attention. Tu n'as pas fais une copie des amis lors de leur création. Donc en supprimant les amis tu supprimes directement les personnes visées. D'où un warning et un plantage qui te dit que tu tentes de désallouer deux fois les mêmes pointeurs.

    Il faut revoir ta façon de faire.

  17. #17
    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
    ah ok merci ! et désolée pour les balises j'ai zappé comme d'hab

  18. #18
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 322
    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 322
    Billets dans le blog
    5
    Par défaut
    La fonction clear(); doit être capable de supprimer la personne visée ainsi que tous les pointeurs des autres personnes qui seraient amis avec elle. Pour ce faire il suffit de mettre à NULL les dits pointeurs.

  19. #19
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 573
    Par défaut
    Bonsoir,

    Citation Envoyé par gbauby Voir le message
    ah ok merci ! et désolée pour les balises j'ai zappé comme d'hab
    Ok, ce n'est pas grave si tu y penses à l'avenir. :-) Sache toutefois que tu as la possibilité d'éditer ton message même après l'avoir déposé si tu constates un oubli, et ce pendant un certain temps. Il te suffit pour cela d'utiliser le bouton qui se trouve en bas de chacun de tes messages.

    N'oublie pas non plus d'appuyer sur en bas de page quand tu estimeras avoir obtenu satisfaction. Tu pourras éventuellement refaire passer ta discussion à l'état non résolu si jamais de nouveaux éléments concernant le même problème se présentent ultérieurement.

    Bon courage pour la suite.

  20. #20
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 322
    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 322
    Billets dans le blog
    5
    Par défaut
    Pendant que j'y suis une petite remarque. Le prototype de la fonction clear(); demande un double pointeur. Tu pourrais t'en passer ici. Maintenant il n'est pas inintéressant de la faire comme ca.

    Pourquoi ?

    Cela permet en retour de la fonction d'avoir le pointeur libéré à la valeur NULL. C'est une bonne idée.

+ 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