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 :

Petit problème sur pointeurs de structures


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Petit problème sur pointeurs de structures
    Bonjour à tous, je veux créer un répertoir en C de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    typedef struct Personne Personne;
    struct Personne{
      char* nom;
      char* tel;
      Personne * suiv;
    } repertoire; /* le répertoire étant global */
    Puis je veux créer une fonction inser de prototype :
    int inser(char* nom, char* tel); qui insère une nouvelle personne au répertoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int inser(char* nom, char* tel){
      Personne * p;
      for(p=&repertoire;p->suiv!=NULL;p=p->suiv){
         if(!strcmp(nom,p->nom)) return 0;
         //déjà existant dans le répertoire donc pas d'insertion
      }
      p->suiv=(Personne*)malloc(sizeof(Personne));
      p->suiv->nom=nom;
      p->suiv->tel=tel;
      p->suiv->suiv=NULL;
      return 1;
    }
    Mon problème est que si mon répertoire ne contient encore aucune personne au sens où repertoir.nom, repertoier.tel et repertoire.suiv n'ont pas été modifiés, je ne vois pas comment insérer la première personne grâce à cette fonction inser.

    Suis-je obliger d'ajouter la première personne dans le main, en faisait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void main(void){
      char nom[]="Ben";
      char tel[]="0140404040";
      repertoire.nom=nom;
      repertoire.tel=tel;
      repertoire.suiv=NULL;
    }
    Puis seulement à partir du deuxième ajout, utiliser la fonction inser ?



    Merci de me répondre et désolé si erreur il y a.

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Le mieux est sans doute que ton répertoire ne soit pas un struct Personne mais un pointeur sur struct Personne. Au départ, le pointeur est à NULL, puique le répertoire est vide.
    La fonction inser crée une personne et si le répertoire est NULL, elle met son adresse à la place. Sinon, elle l'ajoute à la queue de la liste comme tu l'as écrit.

    Ce pointeur répertoire ne doit pas être une variable globale (c'est inutile et les variables globales sont une mauvaise habitude et sont à éviter) et son adresse (puisqu'il peut être modifié par la fonction) doit être passé en argument.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour cette réponse rapide et perspicace.
    Le vice de ta méthode c'est que je dois utiliser un pointeur sur un pointeur de Personne quand je passe mon répertoire comme argument de ma fonction. Me trompé-je ?

    J'ai une autre question :
    Est-t-il possible de créer une sorte de variable globale à ma structure. Au sens où je veux par exemple le nombre de Personne de mon répertoire. Dans ma structure je crée un int que j'incrémente à chaque insertion et ce int est accessible par toute variable de type Personne et à la même valeur pour chaque variable.
    C'est possible en C ?
    (tu dois surement voir une idée de Java (bouhhh) de créer des variable static pour une classe)

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    benjaminb :
    Le vice de ta méthode c'est que je dois utiliser un pointeur sur un pointeur de Personne quand je passe mon répertoire comme argument de ma fonction. Me trompé-je
    C'est pas si terrible :
    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
    int main(void)
    {
    Personne * Repertoire = NULL;
    ...
    inser(&Repertoire, nom,  tel);
    ...
    }
     
    Personne * inser(Personne ** repertoire,char* nom, char* tel)
    {
      Personne * p = malloc(sizeof(Personne));
      if(p!= NULL)
      {
        ...  // mettre les champs ATTENTION, copier les chaînes (strcpy), pas les pointeurs. 
             //Modifier en conséquence la structure Personne pour des TABLEAUX de caractères 
        if(* repertoire == NULL) *repertoire = p;
        else
        {
            ....
        }
      }
     return p;
    }
    ..de créer des variable static pour une classe
    On n'est ni en Java ni en C++
    Si tu veux garder le compte des éléments de ton répertoire, remplace la définition du répertoire d'un simple Personne * en une structure qui contient le Personne * et un entier pour compter.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  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
    Citation Envoyé par benjaminb Voir le message
    Merci pour cette réponse rapide et perspicace.
    Le vice de ta méthode c'est que je dois utiliser un pointeur sur un pointeur de Personne quand je passe mon répertoire comme argument de ma fonction. Me trompé-je ?

    J'ai une autre question :
    Est-t-il possible de créer une sorte de variable globale à ma structure. Au sens où je veux par exemple le nombre de Personne de mon répertoire. Dans ma structure je crée un int que j'incrémente à chaque insertion et ce int est accessible par toute variable de type Personne et à la même valeur pour chaque variable.
    C'est possible en C ?
    L'usage est de créer une structure 'liste' qui contient au moins le pointeur de tête, parfois le pointeur de queue (accès direct au dernier élément), voire d'autres informations...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct list
    {
       struct elem *p_head;
       struct elem *p_tail;
    };
    C'est l'adresse de cette structure que l'on passe aux fonctions de gestion de la liste, et qui permet de gérer les pointeurs de façon naturelle (pas de **).

    http://emmanuel-delahaye.developpez....s_chainees.htm
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Voilà mon code final. Peux-tu me dire si c'est bon ?

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    typedef struct Personne Personne;
    struct Personne{
      char* nom;
      char* tel;
      Personne* suiv;
    };
    int inser(Personne** rep, char* nom, char* tel){
      Personne* p =*rep;
      Personne nouv={nom,tel,NULL};
      if(p==NULL){ //répertoire vide
        p=&nouv;
        return 1;
      }
      for(p=*rep;p->suiv!=NULL;p=p->suiv){
         if(!strcmp(p->nom,nom)) return 0; //existant
      }
      p->suiv=&nouv;
      return 1;
    }
    void main(void){
      Personne* repertoire=NULL;
      char nom[]="Ben", tel[]="0140404040";
      inser(&repertoire,nom,tel);
      inser(&repertoire,"Tom","0140404041");
    }

Discussions similaires

  1. Réponses: 22
    Dernier message: 14/04/2014, 00h02
  2. Petit problème sur les pointeurs :
    Par bertry dans le forum Débuter
    Réponses: 9
    Dernier message: 15/03/2011, 10h18
  3. [débutant]petit problème sur formulaire avec onglets
    Par Christophe93250 dans le forum Access
    Réponses: 2
    Dernier message: 06/01/2006, 10h46
  4. petit problème avec pointeurs
    Par Kerod dans le forum C
    Réponses: 12
    Dernier message: 09/12/2005, 15h48
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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