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 :

Union et recupperation de valeurs ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Par défaut Union et recupperation de valeurs ?
    Bonjour,
    je désire récuperer la valeur ou le type d'une valeur.
    Cette valeur est bien entendu de type mon_union.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef union mon_union
    {
    int i;
    char * str;
    bool b;
    }
    Existe il un moyen pour savoir quel est le type ou la valeur d'une variable de ce type ??

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    mon_union var;
    var.i = 9;
     
    //Maintenant comment savoir que var contient i = 9 et non pas b à true ou str à 0x0000009
     
    //En effet si je regarde au debugger:
    //var.i = 9
    //var.b = true
    //var.str = 0x0000009 (ptr incorrecte)
    Je suis bloqué... Merci pour votre aide.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Salut
    Dans les unions, il est plus pratique de mettre un enum qui définit le type de la variable, sinon comme tu le vois, on ne s'en sort pas
    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
    typedef enum {type_bool, type_int, type_str ..} montype.
    typedef union mon_union
    {
      montype type;
      int i;
      char * str;
      bool b;
    }
    ensuite
    switch(var.type)
    {
      case type_bool : // j'utilise var.b
            ................
            break;
      case type_int : // j'utilise var.i
          .........
            break;
      ...
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Par défaut
    Ok pour ton exemple....
    Mais si c'est utilisé sans... y a t'il possibilité de le faire ?

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Je ne pense pas car je ne vois pas comment on pourrait faire .
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    La solution de Trap D est bien évidemment la seule possible, puisque les membres d'une union occupent le même emplacement mémoire (celui-ci a la taille de la plus grande des variables, et il n'y a donc pas de variable 'vide' ou 'à zéro') et que le C ne dispose pas d'un opérateur typeof.

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Trap D
    Salut
    Dans les unions, il est plus pratique de mettre un enum qui définit le type de la variable, sinon comme tu le vois, on ne s'en sort pas
    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
    typedef enum {type_bool, type_int, type_str ..} montype.
    typedef union mon_union
    {
      montype type;
      int i;
      char * str;
      bool b;
    }
    ensuite
    switch(var.type)
    {
      case type_bool : // j'utilise var.b
            ................
            break;
      case type_int : // j'utilise var.i
          .........
            break;
      ...
    }
    Je suppose que tu voulais plutotdire un truc du style :

    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
    typedef enum {type_bool, type_int, type_str ..} montype;
    typedef union
    {
       int i;
       char * str;
       bool b;
    } mon_union;
     
    typedef struct
    {
       montype type;
       mon_union union;
    } ma_struct;
     
    ensuite
     
    switch(var.type)
    {
      case type_bool : // j'utilise var.union.b
            ................
            break;
      case type_int : // j'utilise var.union.i
          .........
            break;
      ...
    }
    Car sinon, lorsque tu modifies le type, tu modifies egalement la valeur et reciproquement

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    gl >> oui, bien évidemment, c'est le problème de répondre rapidement en ayant l'idée de ce qu'on veut dire mais sans approfondir plus que ça.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

Discussions similaires

  1. [AC-2003] Requête union, valeurs identiques droppées?
    Par yupyupxav dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 09/02/2011, 18h33
  2. [AC-2007] Regrouper les valeurs avec l'union
    Par christophe31 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 04/06/2010, 11h00
  3. [AC-2003] [Requête Union] : renvoyer une valeur par défaut en cas d'absence de résultat
    Par ludovicparis dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 19/04/2010, 20h25
  4. [AC-2007] Requête UNION : récuperer les valeurs sur une seule ligne
    Par tibofo dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 08/12/2009, 12h02
  5. [PHP-JS] recupperer des valeurs html
    Par zimotep dans le forum Langage
    Réponses: 4
    Dernier message: 11/09/2005, 14h19

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