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 :

cast pointeur void **


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Par défaut cast pointeur void **
    Bonjour a tous,

    tout d'abord je precise que je suis un debutant total en C. (Bon j'ai regarde des tutos, mais c'est pas encore ca...)

    Bref je suis en train de regarder un bout de code la et vraiment je ne comprend pas ce que ca veut dire...

    Une fonction prend en argument un parametre Value de type void*
    Il s'agit donc d'un pointeur de type non defini.

    Dans le corps de ma fonction il y a une ligne etrange :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maVariable = * (void **) Value;
    Avec maVariable qui est de type void*

    donc en gros rien de bien complique appriori, on veut refiler une reference de Value a une autre classe. Mais il y a un drole de truc au milieu de tout ca

    Ca ressemble a un cast, mais le type void** je connais pas... Et en plus je ne vois pas l'interet de cet ajout.

    Pouvez vous m'expliquer s'il vous plait?
    Merci beaucoup.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    void **, c'est un pointeur de pointeur sur void.

    C'est marrant, mais j'ai l'impression que le bout de code que tu présentes s'écrit plus simplement coimme cela (ou alors j'ai tout faux ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maVariable = (void *) Value;
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Si on tape ce code :
    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
    #include <stdio.h>
     
    void fonction ( void * Value )
    {
    	void * maVariable ;
     
    	maVariable = * (void **) Value ;
     
    	printf ( "valeur 'Value' : %p\n" , Value ) ;
    	printf ( "valeur 'maVariable' : %p\n" , maVariable ) ;
    }
     
    int main(void)
    {
    	int i = 257 ;
     
    	fonction ( &i ) ;
     
    	system ( "pause" ) ;
    	return 0;
    }
    on remarque que 'maVariable' (pointeur sur void) prend comme valeur la valeur (de type int) située à l'adresse pointée par 'Value'.
    Dans mon exemple, on passe à la fonction l'adresse de l'entier 'i' valant 257, et au final le pointeur 'maVariable' se retrouve avec la même valeur que cet entier (0x00000101 = 257). Par contre, si on pointe à cette adresse 257, cela a toutes les chances de planter. Donc, personnellement, je ne vois pas l'intérêt d'un tel code. Qu'est censé faire ce code que tu as trouvé ? Après, ça dépend du contexte. C'est de l'embarqué ?

    Sinon,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maVariable = * (void **) Value ;
    est en principe équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maVariable = (void*) * (int*) Value ;
    (si on considère qu'un int a la même taille qu'un pointeur, ce qui -je crois- est toujours vrai. A vérifier quand même dans la norme...).

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par jeroman Voir le message
    (si on considère qu'un int a la même taille qu'un pointeur, ce qui -je crois- est toujours vrai. A vérifier quand même dans la norme...).
    Sur une architecture 32 bits ou 64 bits, c'est vrai mais sur une archi 8 ou 16 bits, c'est faux.

    Il me semble me rappeler que la taille d'un int est liée à la taille du bus de données sur la CPU.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    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
    1- Une adresse A de type void* est l'adresse d'un objet dont le type n'est pas spécifié. La conséquence est qu'on ne peut déréférencer cette adresse pour obtenir l'objet, donc écrire *A, qui serait un objet de type inconnu donc de taille et de propriétés inconnus. Avant de pouvoir déréférencer A, il faut rétablir le type correct de l'objet dont A est l'adresse, en d'autres termes caster A (et ne pas se tromper de type).

    2- Une adresse A du type void** est quelque chose de beaucoup plus banal que void* : c'est l'adresse d'un pointeur sur void*. Le type de l'objet référencé par cette adresse est donc parfaitement connu : c'est un pointeur sur void. Il est possible d'écrire sans problème *A (c'est une adresse de type void*). Par contre, *A doit être casté avant de pouvoir être déréférencé comme évoqué en (1) et on ne peut écrire **A.

    3- En appliquant ceci, Value est du type void* et est casté en void** pour pouvoir être déréférencé :
    (void**) Value
    puis déréférencé
    *(void**) Value
    et le résultat est une adresse de type void* qui est stocké dans maVariable . Comme dans le cas présent maVariable est de type void*, plus tard, pour le déférérencer, il faudra au préalable caster sa valeur.

    ram-0000 :
    C'est marrant, mais j'ai l'impression que le bout de code que tu présentes s'écrit plus simplement coimme cela (ou alors j'ai tout faux ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maVariable = (void *) Value;
    Non, ce n'est pas la même chose : La valeur de maVariable ne sera pas la même.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    C'est marrant, mais j'ai l'impression que le bout de code que tu présentes s'écrit plus simplement coimme cela (ou alors j'ai tout faux ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maVariable = (void *) Value;
    Citation Envoyé par diogene Voir le message
    Non, ce n'est pas la même chose : La valeur de maVariable ne sera pas la même.
    Tu as raison, ce n'est pas pareil.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Par défaut
    merci beaucoup pour ses ecplications!

  8. #8
    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
    jeroman :

    Ton exemple est typique d'un cast abusif, donc donnant un résultat qui parait incohérent :
    Le cast (void **) Value est faux : Value n'est pas l'adresse d'un void * (d'une adresse) mais l'adresse d'un int. Si le cast est faux, le résultat est faux.
    L'expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maVariable = (void*) * (int*) Value ;
    n'a aucun rapport avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maVariable = * (void **) Value ;
    si on considère qu'un int a la même taille qu'un pointeur, ce qui -je crois- est toujours vrai. A vérifier quand même dans la norme...).
    Il n'y a aucun rapport entre entier et pointeur : ce sont deux concepts radicalement différents. La taille d'un int est liée à l'unité de calcul de la machine (donc aux données), celle d'un pointeur à l'espace mémoire adressable. D'ailleurs, même leur arithmétique est différente. La confusion ou l'assimilation pointeurs/entiers ne peut qu'engendrer des problèmes

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

Discussions similaires

  1. Pointeur void *
    Par coberle dans le forum C++
    Réponses: 7
    Dernier message: 12/12/2008, 20h11
  2. Paramètres de PostMessage et pointeur void ?
    Par tintin72 dans le forum Windows
    Réponses: 8
    Dernier message: 17/06/2008, 13h36
  3. cast : pointeur , entier
    Par gipfel11 dans le forum C
    Réponses: 2
    Dernier message: 13/03/2008, 14h20
  4. tableau de pointeurs void
    Par CerbeRGD dans le forum Débuter
    Réponses: 10
    Dernier message: 15/02/2008, 18h38
  5. Pointeur void *
    Par Atharendil dans le forum C
    Réponses: 6
    Dernier message: 04/05/2006, 09h53

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