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 :

Que signifie Void* ?


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Que signifie Void* ?
    Salut j'utilise CEGUI

    et je dois utiliser une fonction qui renvoit void* (j'avais jamais vu ça avant)

    voila la fonction:
    void* CEGUI::Window::getUserData ( void ) const [inline]

    Return the user data set for this Window.

    Each Window can have some client assigned data attached to it, this data is not used by the GUI system in any way. Interpretation of the data is entirely application specific.

    Returns:
    pointer to the user data that is currently set for this window.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    VOID signifie "vide" ce qui signifie que la fonction ne renvoie rien.

  3. #3
    Invité
    Invité(e)
    Par défaut
    non je parle de Void* pas de Void

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Points : 2 502
    Points
    2 502
    Par défaut
    Bonjour,

    void * est un pointeur sur un type non définit.
    Ce type de pointeur est utilisé, lorsque le type de pointeur qui lui affecté change suivant les situations.
    On pourra réutiliser les données se trouvant à l'adresse pointée par ce type de pointeur, en faisant un casting.
    (suivant le cas à l'aide de dynamic_cast (reinterpret_cast) ou bien int * pInt = (int *)getUserData ()


    Le tout étant de se rappeler le type de donnée qu'on a passé à cet élément graphique setUserDate( void *)

    Pour aller plus loin voir >>ici<<

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    void* est, effectivement un pointeur sur le type void...

    Bien que le type void signifie, effectivement, vide, et qu'une fonction ayant un prototype proche de void foo() ne renvoie effectivement rien, une fonction renvoyant un pointeur sur void (ayant donc un prototype proche de void* foo() ) sera considérée, en C, comme une fonction renvoyant un pointeur sur un type non connu

    C'est une technique régulièrement utilisée en C, que ce soit pour la valeur de retour de fonction ou pour les arguments à fournir à une fonction, pour remplacer certains concepts inexistants en C tels que:
    • la généricité ( dont on dispose en C++ sous la forme de template-
    • le concept d'héritage (dont on dispose en C++ sous la forme de la programmation OO)
    • la surcharge de fonction (qui est autorisée et amplement utilisée en C++)
    Il va sans dire que si cette technique est indispensable en C, il est fortement recommander de la fuir comme la peste en C++, tant il existe de solutions pour l'éviter (en plus, il y a toujours le problème de savoir quel est le type réellement utilisé ou renvoyé par une fonction prenant un pointeur sur void comme argument ou renvoyant un tel pointeur )

    Sauf erreur de ma part, le static_cast et le dynamic_cast ne fonctionneront pas, simplement parce que ce sont des transtypages (et oui, voilà la traduction officielle de "cast" ) utilisés dans des contextes d'héritage, et que rien ne dérive de void (qui n'est d'ailleurs pas une structure ni une classe, et qui ne peut donc pas être utilisé comme "classe de base" )

    Le transtypage qu'il faut utiliser est le reinterpret_cast, de préférence au transtypage "C style" (proche de (unType*) variable) essentiellement pour des raisons de lisibilité du code et pour permettre une recherche plus facile dans un projet

    Ce transtypage (reinterpret_cast) indique au compilateur "cette variable que tu connait comme étant ( de type pointeur sur void, vu que c'est ce qui nous intéresse ) est en réalité (un pointeur sur le type indiqué), et a donc exactement le meme effet qu'un transtypage "C style", la lisibilité en plus
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Si dynamic_cast ne fonctionnera pas, car effectivement il ne dispose pas des informations nécessaires pour effectuer ses vérifications, static_cast marchera lui, à condition que le type que l'on demande soit le même type que le type que l'on a mis initialement (ça peut aussi marcher si on demande un type qui est un type de base, mais rien n'est assuré, surtout en cas d'héritage multiple).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Les casts vers et depuis void* doivent être des static_cast ... en C++98/03 (http://www.open-std.org/jtc1/sc22/wg...ects.html#1120)
    Un exemple : http://www2.research.att.com/~bs/bs_faq2.html#void-ptr
    Le pourquoi ? Je soupçonne que c'est du à la non garantie que sizeof(void*) == sizeof(T*), ou à un mauvais phrasé du standard de 98, je ne sais pas.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Que signifie "Error : Data truncation" ??
    Par BouB dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/05/2005, 16h20
  2. [SQL6]Que signifie ce LEFT ?
    Par guy2004 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/01/2005, 19h18
  3. Que signifie Pagesize ?
    Par anthony70 dans le forum Débuter
    Réponses: 3
    Dernier message: 31/08/2004, 13h31
  4. Que signifier $0 et $@
    Par jaabouc dans le forum Linux
    Réponses: 6
    Dernier message: 01/06/2004, 15h17

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