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 pointeur de structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Par défaut pointeur de pointeur de structure
    bonsoir

    j'ai une structure de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct Coord Coord;
    struct Coord
    {
        int fd;
        int y;
        int x;
        int compt;
        Coord *suivant;
            Coord *precedent;
    };
    et une fonction "maitre" de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int fonct(int fd, char *buf)
    {
        static Coord *coord = NULL;
        Coord *element;
        int ret = 0;
        element = NULL;
     
        control(fd, &coord, &element); //envoi de l'adresse des pointeurs pour malloc
        ret = getread(fd, line, element);
     
     return 0;
    }
    seulement voila, je voudrais malloc mes 2 pointeurs de structure dans une sous fonction...
    je lui envoie donc l'adresse de mes pointeurs de structure afin d'en modifier l'adresse pointer par le pointeur (et non recevoir un pointeur sur l'adresse).

    seulement bah voila les pointeurs de pointeur de structure je ne m'y suis encore jamais essayer et google ne m'est pas d'une grande aide...
    j'ai tenter *coord->...
    puis ->coord->... (sans grand espoir)
    et rien ne marche...

    voici le proto de control :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1er test      : void control (int fd, Coord **coord, Coord **element);
    2eme test  : void control (int fd, Coord *coord, Coord *element);
    n'ayant eu aucune réponse dans la faq je me tourne désormais vers vous ami codeur ^^

  2. #2
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    787
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 787
    Par défaut
    Hello,

    Pour ce que l'on voit de ton code, il a l'air correct. Mais il est évident que sorti de ta fonction fonct(), element n'existe plus. Et j'ai un (gros) doute sur le static Coord *coord = NULL; Et que fait control()?

    Edgar.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Par défaut
    control sert a vérifier que le file descriptor existe, que ce n'est pas le premier appel a la fonction et malloc les structure requise au déroulement du programme

    sinon problème résolut par moi même ^^

    pour déréferencer l'adresse d'un pointeur de structure il suffit de cast
    (*coord)->...

    merci beaucoup de ta tentative d'aide et du temps prit a comprendre mon problème ^^

  4. #4
    Membre averti
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Par défaut
    code de control pour les (éventuel) interesser ^^

    ou pour d'éventuel conseil ^^
    je tien a préciser que cette fonction est un prototype

    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
    static void control (int fd, Coord **coord, Coord **element)
    {//verif de passage
        int compt = -1;
        Bool boll = 0;
     
        if ((*coord) == NULL)
        {
            (*coord) = (Coord *)malloc (sizeof (Coord ));
            (*coord)->compt = 0;
            (*coord)->y = 0;
            (*coord)->suivant = NULL;
            (*coord)->precedent = NULL;
            printf ("tete de liste initialiser\n");
        }
     
    //verif fd ou creation de structure sup
        while (++compt < (*coord)->compt && !boll)
        {
         	if ((*coord)->fd == fd)
            {
                boll = 1;
                printf("file descriptor trouver\n");
            }
            (*coord) = (*coord)->suivant; //!\\ coord est a la fin de la chaine
        }
    //si le fd est nouveau
        if (!boll)
        {
          printf ("enregistrement du nouveau file descriptor\n");
          (*element) = (Coord *)malloc (sizeof(Coord));
          (*element)->y = 0;
          (*element)->x = 0;
          (*element)->fd = fd;
          (*element)->suivant = (*coord)->suivant;
          (*coord)->suivant = (*element);
          if ((*element)->suivant != NULL)
    	{
                (*element) = (*element)->suivant;
                (*element)->precedent = (*coord)->suivant;
                (*element) = (*coord)->suivant;
            }
          (*coord)->compt++;
        }
    }

  5. #5
    Membre averti
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Hello,

    Pour ce que l'on voit de ton code, il a l'air correct. Mais il est évident que sorti de ta fonction fonct(), element n'existe plus. Et j'ai un (gros) doute sur le static Coord *coord = NULL; Et que fait control()?

    Edgar.
    Edgar:
    pourrais tu me faire part de ton gros doute sur static Coord *coord ?^^
    quand a element le pointeur n'existe plus en sorti de fonct effectivement mais vue que element ne me sert qu'a malloc des structure a les chainer son free m'est totalement égale ^^

  6. #6
    Expert confirmé
    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
    Par défaut
    Si on regarde la fonction control(), le rôle du paramètre element est double : il est utilisé pour réaliser le chainage dans la liste et également renvoyé à la fonction fonct() pour être utilisé dans getread().
    Dans ce cas, le code logique de fonct() serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int fonct(int fd, char *buf)  
    {
        static Coord *coord = NULL;
        int ret;
        Coord *element = control(fd, &coord); //envoi de l'adresse des pointeurs pour malloc
        ret = getread(fd, line, element);     // line ou buf ?????
    ...
    Avec pour control() quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Coord * control (int fd, Coord **coord)
    {
         Coord * element = NULL;  
    ....
        if (!boll)
        {      
           printf ("enregistrement du nouveau file descriptor\n");
           element = malloc (sizeof(Coord));
           element->y = 0;
           ...
          (*coord)->compt++;
        }
        return element;
    }
    Maintenant, il y a des choses bizarres dans control()
    coord semble être la tête de la liste à l'entrée dans la fonction. Elle est initialisée (partiellement puisque fd ne l'est pas) si *coord == NULL. Par contre, elle sera détruite par le (*coord) = (*coord)->suivant; Comment sera récupéré ensuite le début de la liste ?

    Le code est très obscur notamment par la confusion entre le type décrivant la liste et celui décrivant les maillons de la liste. Du coup, on ne sait jamais clairement à quoi on a affaire.
    Tout serait beaucoup plus clair si ils étaient clairement identifiés. Par exemple, en gardant la même organisation du programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    typedef struct Coord
    {
        int fd;
        int y;
        int x;
        struct Coord *suivant;
        struct Coord *precedent;
    }Coord; 
    typedef struct
    {
       Coord * tete;
       Coord * queue;  // utile si on insère en queue de liste
       int compt;        // si utile
    }ListeCoord;
    avec
    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
    int fonct(int fd, char *buf)
    {
        static ListeCoord *liste = NULL;
        int ret;
        Coord *element = control(fd, &liste);
        ret = getread(fd, line, element);     // line ou buf ?????
    ...
    Coord * control (int fd, ListeCoord **liste)
    {
         Coord * element;
         if ((*liste) == NULL)
         {
            (*liste) = malloc (sizeof (ListeCoord ));
            (*liste)->compt = 0;
            (*liste)->tete = NULL;
            (*liste)->queue = NULL;
            printf ("Liste initialisee\n");
         }
         // recherche de fd
         element = (*liste)->tete;
         while (element != NULL  && element->fd != fd) element = element->suivant;
         if(element != NULL)
         {
             printf("file descriptor trouve\n");
             return element;
         }
        // insérer un nouveau  en queue grace à (*liste)->queue
          printf ("enregistrement du nouveau file descriptor\n");
          element = malloc (sizeof(Coord));
          // initialisation de element
          element->y = 0;
          element->x = 0;
          element->fd = fd;
          // chainage des elements dans la liste
          element->suivant = NULL;
          element->precedent = (*liste)->queue;
          if((*liste)->queue != NULL)(*liste)->queue->suivant = element;
          // mise à jour de la liste
          (*liste)->queue = element;
          if((*liste)->tete == NULL) (*liste)->tete = element;
          (*liste)->compt++;
          return element;
    }

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. Réponses: 1
    Dernier message: 09/02/2006, 11h03
  5. Pointeur de fonction et structure
    Par Trunks dans le forum C
    Réponses: 6
    Dernier message: 07/10/2005, 00h32

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