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 générique


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 65
    Points : 55
    Points
    55
    Par défaut pointeur générique
    Bonjour à tous, j'aurai besoin d'une petite explication:
    est ce qu'il est possible d'utiliser un pointeur générique (void *) pour stocker une donnée? Car en fait je veux utiliser une liste chainée pour stocker des résultats de types différents (int, char et float).

    d'avance merci et bonne journée...

  2. #2
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Oui, du moment que c'est un pointeur vers des int, char, float, ... Mais en général ce genre de choses est fortement déconseillé et peut être source de plantage à la moindre erreur de programmation. A bon entendeur...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut
    Ce n'est pas toujours déconseillé. C'est même la seule façon de passer des valeurs à une fonction callback (voir différents posts de E. Delahaye sur le sujet). Il va juste falloir être extrêmement rigoureux sur les cast.

  4. #4
    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 générique
    Citation Envoyé par ghostdog
    est ce qu'il est possible d'utiliser un pointeur générique (void *) pour stocker une donnée?
    La seule donnée que sait stocker un pointeur générique est l'adresse d'un objet. Par contre, le type de l'objet pointé peut être quelquonque.
    Car en fait je veux utiliser une liste chainée pour stocker des résultats de types différents (int, char et float).
    C'est possible. Un void* peut recevoir l'adresse d'une structure complexe 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
     
    enum type {INT, CHAR, FLOAT};
     
    struct data
    {
       enum type type;
       union
       {
          int i;
          char c;
          float f;
       }
       u;
    };
    Evidemment, cette structure doit avoir une durée de vie >= à celle du noeud de la liste qui le porte.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Le Furet
    (voir différents posts de E. Delahaye sur le sujet)
    [GTK] Fonction callback avec arguments ?

  6. #6
    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 10_GOTO_10
    Oui, du moment que c'est un pointeur vers des int, char, float, ... Mais en général ce genre de choses est fortement déconseillé et peut être source de plantage à la moindre erreur de programmation. A bon entendeur...
    C'est pas déconseillé, surtout que c'est parfois la seule façon d'écrire du code générique (voir qsort() et sa fonction de comparaison), mais c'est vrai qu'il faut faire attention parce qu'on travaille sans filet. C'est pas pire que de l'assembleur...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut
    Citation Envoyé par gege2061
    Citation Envoyé par Le Furet
    (voir différents posts de E. Delahaye sur le sujet)
    [GTK] Fonction callback avec arguments ?
    C'est ce principe oui. Il me semble d'ailleurs que gpointer est un alias pour void*.

  8. #8
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Le Furet
    C'est ce principe oui. Il me semble d'ailleurs que gpointer est un alias pour void*.
    Oui : gpointer

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 65
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    enum type {INT, CHAR, FLOAT};
     
    struct data
    {
       enum type type;
       union
       {
          int i;
          char c;
          float f;
       }
       u;
    };
    j'ai regarder ce qu'était enum et union car je ne connaissait pas, et si j'ai bien compris union, il me semble que ce serai approprié à mon cas car en fait dans mon programme j'ai fait 3 fonctions qui gèrent une requête dynamique suivant le types de résultat quelle va me renvoyer. Pour etre plus clair, si j attend un entier comme résultat de ma requête j' utilise la fonction 'exec_requete_int', si c'est une chaine de caractère, ce sera la fonction 'exec_requete_char' ...etc.
    ma liste me servira donc a créer une cellule pour chaque résultat de fonction et donc union me permettrai de selectionner le type de ma data suivant suivant le type du résultat de la requete.
    j'ai compris ou j 'ai tout faux?

  10. #10
    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 ghostdog
    j'ai compris ou j 'ai tout faux?
    Ca devrait être ça...
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 65
    Points : 55
    Points
    55
    Par défaut
    je peux donc ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    union typeres
    { 
           int resentier;
           float resfloat;
           char *reschar;
    }tr; 
     
    typedef struct pile
    {
          tr res;
          struct pile *prec;
    }pile;

  12. #12
    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 ghostdog
    je peux donc ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    union typeres
    { 
           int resentier;
           float resfloat;
           char *reschar;
    }tr; 
     
    typedef struct pile
    {
          tr res;
          struct pile *prec;
    }pile;
    Euh, non. Une union toute seule, c'est pas exploitable. Il faut un 'selecteur'. C'est pourquoi j'avais mis le champ 'type'. D'autre part, tr n'est pas un type...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct typeres
    {
       int type;
       union 
       { 
           int resentier;
           float resfloat;
           char *reschar;
       }
       u;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct node
    {
          struct typeres res;
          struct node *prec;
    }
    node;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct node
    {
          struct typeres *p_res;
          struct node *prec;
    }
    node;
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 65
    Points : 55
    Points
    55
    Par défaut
    d'accord, ça semblait trop beau que je comprenne tout d'un coup! lol
    une derniere question, au sujet du selecteur, je peut mettre ce que je veux? (comme par exemple m en servir de flag) ou il faut quelquechose de spécifique?

  14. #14
    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 ghostdog
    d'accord, ça semblait trop beau que je comprenne tout d'un coup! lol
    une derniere question, au sujet du selecteur, je peut mettre ce que je veux? (comme par exemple m en servir de flag) ou il faut quelquechose de spécifique?
    Le selecteur est une variable qui contient une valeur qui indique quel est le champ de l'union concerné. On peut mettre ce qu'on veut du moment que les valeurs sont de type int (car souvent utilisées dans un switch-case) et toutes différentes. enum est parfait pour créer ce genre de valeurs constantes. J'ai déjà donné un exemple dans ce sens.
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 65
    Points : 55
    Points
    55
    Par défaut
    ok, parfait.
    merci beaucoup pour ttes ces explications.

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

Discussions similaires

  1. Pointeur générique (void *)
    Par c-candide dans le forum C
    Réponses: 22
    Dernier message: 25/02/2007, 02h52
  2. pointeur générique en C++
    Par gnto dans le forum C++
    Réponses: 6
    Dernier message: 20/02/2007, 13h52
  3. Pointeur générique vers d'autres types d'objets
    Par LapinGarou dans le forum MFC
    Réponses: 11
    Dernier message: 15/09/2006, 16h48
  4. déréférencer un pointeur générique ?
    Par tintin72 dans le forum C
    Réponses: 6
    Dernier message: 23/07/2006, 12h40
  5. Question sur les pointeurs génériques
    Par mikedavem dans le forum C
    Réponses: 16
    Dernier message: 24/05/2006, 11h56

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