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 :

En C, est-il possible de connaitre le type d'une variable


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Septembre 2018
    Messages : 138
    Par défaut En C, est-il possible de connaitre le type d'une variable
    Bonjour à tous,

    je voulais savoir, en C, s'il est possible de connaitre le type d'une variable ?
    C'est à dire que j'ai créé une variable "toto", et par une fonction ou autre, d'avoir un retour qui me dise, cette variable est un "unsigned long" par exemple.
    Pour info, il n'y aura pas de pointeur.

    J'ai vu qu'il existe la fonction "typeof", mais impossible de la mettre en marche ou de comprendre réellement comment elle fonctionne.

    D'avance, merci

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

    Le C est un langage fortement typé. Par défaut, en dehors d'un paramètre de fonction de type void*, tu es contraint de spécifier le type de variable que tu attends. En regardant la fonction TypeOf() les exemples donnés n'utilisent que les macros, ce qui me parait tout à fait cohérent ici. Je dirai donc en résumé que connaître le type d'un paramètre d'une fonction est contradictoire puis que tu le connais par défaut. Si par contre tu veux faire une fonction qui soit "surchargeable" comme en C++ alors il te faut passer par les macros.

    Exemple de la documentation officielle de typeof ():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define max(a,b) \
      ({ typeof (a) _a = (a); \
          typeof (b) _b = (b); \
        _a > _b ? _a : _b; })

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Il faudrait peut-être reformuler ton besoin. En C, si on a une variable ou un paramètre on a forcément son type, la variable et son type son indissociables!
    Le seul cas de type erasure, comme l'a écrit @gerald3d, c'est void* où on pointe sur de l'inconnu, la type pointé est alors perdu et n'est pas retrouvable.
    Et typeof(x) est un type, le type de x. Mais un type est l'unité nécessaire à la construction du code, par exemple au moment où le code s'exécute, les types n'existent plus et il ne reste que des zones mémoires que le code généré utilise.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Septembre 2018
    Messages : 138
    Par défaut
    Merci pour la réponse, mais ce n'est pas vraiment ce que j'attendais. Là, d'après l'exemple que tu donnes, tu compares deux types pour savoir qui utilisent le plus d'octet.
    Moi je veux vraiment savoir quel type c'est, unsigned char, signed char, unsigned short, signed short, ...., signed long, float, ....

    Pour expliquer rapidement ce que je veux faire, je veux créer des structures avec plein de variables dedans, de tout type et je veux envoyer ces structures pour UART, sachant que de l'autre côté, il ne sait pas ce qu'il doit recevoir. Donc le but est d'envoyer les infos : premier donnée, c'est un flotant, deuxième donnée, c'est un char, etc...

    J'espère avoir avec été clair ?

    Merci

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    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 487
    Par défaut
    Salut à tous,

    Il n'y a pas, à ma connaissance, de mot-clé ou fonction typeof en C standard, pas même en C++ qui dispose pourtant de typeid. En tout cas pas dans les versions éprouvées jusqu'ici. Les exemples cités ci-dessus sont des extensions de GNU. On peut les utiliser à condition d'être OK pour ne pas produire de C standard.

    Une brève recherche montre que typeof n'a fini par être intégré au standard qu'avec C23, donc l'an dernier seulement.

    Citation Envoyé par Amfrey95 Voir le message
    Merci pour la réponse, mais ce n'est pas vraiment ce que j'attendais. Là, d'après l'exemple que tu donnes, tu compares deux types pour savoir qui utilisent le plus d'octet.
    Moi je veux vraiment savoir quel type c'est, unsigned char, signed char, unsigned short, signed short, ...., signed long, float, ....

    Pour expliquer rapidement ce que je veux faire, je veux créer des structures avec plein de variables dedans, de tout type et je veux envoyer ces structures pour UART, sachant que de l'autre côté, il ne sait pas ce qu'il doit recevoir. Donc le but est d'envoyer les infos : premier donnée, c'est un flotant, deuxième donnée, c'est un char, etc...
    C'est le problème qui touche la plupart des langages populaire purement compilés à typage statique : la sérialisation et l'introspection. C'est là même les deux propriétés les plus attendues des versions des standards des langages orientés objet et ce sont celles qui manquent encore le plus à C++ (alors qu'il est déjà nettement plus simple de les implémenter dans un langage interprété ou semi-interprété).

    En théorie, tu ne devrais pas en avoir besoin du tout dans un contexte C parce que la chaîne de traitement est censée être déterministe d'un bout à l'autre. Comment, dans ce cas, concilier ce fait avec ce que l'on vient d'exposer ? Malheureusement en exhibant le fait que ce que tu veux — légitimement — faire à la base n'est pas possible de façon simple : en effet, tu ne peux, à la base, énumérer facilement les membres d'une structure sans connaître le type de celle-ci et tu ne peux pas passer des structures de types différents à une même fonction sans recourir à void * ou en utilisant la surcharge de fonction, qui n'existe pas non plus en C (sauf si cela a été rétroporté avec des versions récentes de la norme, mais je n'ai pas vérifié).

    En revanche, il existe désormais _Generic, depuis C11, qui permet en gros de faire une sorte de select sur des types connus : https://en.cppreference.com/w/c/language/generic

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Les variables sont typées, donc quand tu écris int var; ben var est un... int
    Maintenant si ton problème est de la sérialisation, alors tu dois créer un protocol que chaque partie saura interpréter. Et là tu fais un peu ce que tu veux.
    Pour un cas basique comme ça, je verrais un simple enum qui définit les types supportés, suivi des données brutes.
    Ou alors utiliser quelque chose comme protocol buffer.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Septembre 2018
    Messages : 138
    Par défaut
    Obisian merci pour ton retour, ceci dit, je ne comprends pas trop l'exemple avec le _Generic
    Bousk, j'avais pensé à un truc comme ça, mais je voulais juste lire n'importe quelle structure sans avoir à la modifier pour pouvoir envoyer les types de ses variables

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/07/2017, 11h03
  2. Réponses: 3
    Dernier message: 02/08/2015, 14h00
  3. Réponses: 11
    Dernier message: 08/04/2009, 13h29
  4. [Dates] Connaitre le type d'une variable
    Par Sytchev3 dans le forum Langage
    Réponses: 4
    Dernier message: 03/10/2007, 15h36
  5. Connaitre le type d'une variable
    Par mic79 dans le forum Langage
    Réponses: 2
    Dernier message: 04/01/2006, 15h42

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