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 int vers void et retour de void vers int


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut pointeur int vers void et retour de void vers int
    Bonjoutr à tous,


    Je ne comprends 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
    20
    21
    22
    23
    #include <stdio.h>
    #include <stdlib.h>
     
    void B(void* in2);
    void A(void* in);
     
     
    void A(void* in){
    B(  &in );
    }
     
    void B(void* in2){
    printf("%d\n", (int) ((*in2) + 2) );
    }
     
    int main(void)
    {
    int c = 2;
     
    A(&c); 
     
    return EXIT_SUCCESS;
    }
    ---------- GCC ----------
    testons5.c:
    testons5.c:13: warning: dereferencing `void *' pointer
    testons5.c:13: error: void value not ignored as it ought to be

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    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
    #include <stdio.h>
     
    static void B(void * in2)
    {
       int c = *(int*) in2;
       printf("%d\n", c + 2);
    }
     
     
    static void A(void * in)
    {
       B(in);
    }
     
     
    int main(void)
    {
       int c = 2;
     
       A(&c); 
     
       return 0;
    }

  3. #3
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Ça se lit comme

    pointeur sur cast de pointeur d'integer?

  4. #4
    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
    in2 est un pointeur sur void : void*
    (int *) in2 transtype (cast) la valeur de ce pointeur en un pointeur sur int : int *
    *(int*) in2 est la valeur à l'adresse (int *) in2. Cette adresse étant une adresse de int, le résultat est une valeur de type int.

  5. #5
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut
    Qui décide que c'est un int? Le fait qu'à l'origine le pointeur était un int et que la mémoire réservée est sizet = 4?

    Peut-on dire de int vers char:

    *(char*) in2; donne 4 Aha! oui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int c = *(char*) in2;
    ...
    int c = 2;
    A(&c);
    parce que size_t char est un et size_t int est 4 (réduction)?

    ou de char vers int:

    *(int*) in2; donne 671053828 non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int c = *(int*) in2;
    ...
    char c = 2;
    A(&c);
    Pourquoi si int>char, size_t char est un et size_t int est 4 (dilatation)?

    ou de int vers float
    *(float*) in2; donne 2 hum.... non
    ou de int vers double
    *(double*) in2; donne 2 hum.... non

    Bien vôtre et moins confusément,

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par J4e8a16n Voir le message
    Pourquoi si int>char, size_t char est un et size_t int est 4 (dilatation)?
    Je n'arrive pas à comprendre comment on peut parler de "dilatation" sur un forum pour le langage C...

    Bref le type "void*" est le type pointeur générique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    static void useless(void * param)
    {
       int number = *(long*) param;
    }
     
    int main(void)
    {
       int number = 6;
       useless(&number);
     
       return 0;
    }
    si demain tu souhaites changer le type de number, tu conserves la même interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    static void useless(void * param) /* <= ne change pas */
    {
       long number = *(int*) param;
    }
     
    int main(void)
    {
       long number = 6;
       useless(&number);
     
       return 0;
    }

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/04/2008, 16h07
  2. [XSLT]retour charriot xml vers html
    Par toma22 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 29/10/2007, 19h07
  3. Retour ou non vers le répertoire d'origine.
    Par troumad dans le forum C
    Réponses: 2
    Dernier message: 18/04/2007, 17h48
  4. [Conception] Export de BDD vers Excel - Le retour
    Par Camille.CWS dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/02/2007, 10h20

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