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 :

Conversion void* et double


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par défaut Conversion void* et double
    Bonjour,

    pourquoi en C on ne peut pas convertir un void* en double je croyais que le type void etait le type générique ?

    merci d'avance.

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    void * est le type de pointeur générique, pas le type générique. Tu peux caster un "void *" en "double *" mais pas en "double".
    Le type void tout court n'a pas de sens, à part dans les signatures de fonction.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    void* est un pointeur générique, mais reste un pointeur.
    double, c'est un nombre.

    Edit: Non seulement je me fais griller, mais en plus je dis des conneries...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Médinoc
    void* est un pointeur générique, mais reste un pointeur.
    double, c'est un entier.
    Tu a voulu dire nombre à virgule flottante...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par défaut
    ah ok merci et pourquoi ca ca marche :

    tabgen[i]= (long *)(atol(tabE[i]));

    et pas ca :

    tabgen[i]= (double *)(atof(tabE[i]));

    avec tabgen[i] de type void **

  6. #6
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Si on veut se la jouer chacal, on peut se permettre de caster un int/long en void *, car il s'avere qu'un pointeur (de n'importe quel type) prend la meme place qu'un entier long sur pas mal de plateformes.
    Mais faire ça c'est casser l'abstraction du sizeof

    double prend plus de place qu'un int et donc ça ne rentre pas dans un void *

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par défaut
    merci,

    encore un question alors pourquoi le type float qui est sur 4octets interdis aussi cela ?

  8. #8
    Membre expérimenté Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Par défaut
    Il faut utiliser les bonnes fonctions

    atol() Convert string to long (function)
    atoi() Convert string to integer (function)
    atof() Convert string to double (function)

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par EnigmuS
    ah ok merci et pourquoi ca ca marche :

    tabgen[i]= (long *)(atol(tabE[i]));

    et pas ca :

    tabgen[i]= (double *)(atof(tabE[i]));

    avec tabgen[i] de type void **
    Tu as vu une adresse quelque part ?

    Arrête de faire n'importe quoi et réfléchi...

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par défaut
    Le problème n'est pas qu'il y ai une adresse quelque part mais de caster le type void en int/long/double en filoutant (cast de void * et long * etc...) je sais que c'est trés moche Emmanuel pas besoin d'enfoncer le clous lool

    alors si tu sais contourner ce type d'écriture en C je t'en prie mais j'ai vraiment besoin d'avoir le type réel dans ce tableau car sinon dans mon asm il considére ca comme un pointeur et me fait un General Protection fault alors qu'avec tabgen[i]= (long *)(atol(tabE[i])); il m'affiche le bon résultat.

    J'aimerais contourner ca et apparemment c'est possible en C99 mais y aurait-il moyen d'avoir plus d'explication sur intptr_t, j'ai cherché d'autre example mais j'avoue ne pas bien comprendre. intptr_t est un entier signé pouvant stocker un pointeur mais j'arrive pas a voir ou ca empeche de faire ce qui a plus haut arf

    Merci d'avance.

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par EnigmuS
    alors si tu sais contourner ce type d'écriture en C je t'en prie mais j'ai vraiment besoin d'avoir le type réel dans ce tableau
    Un type void* est un pointeur sur n'importe quel objet. Ce n'est pas un objet qui peut contenir n'importe quoi.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       void *p = malloc (sizeof (double));
       double *pd = p;
     
       *pd = 12.34;
     
        ...
     
        free (p), p = NULL, pd = NULL;
    est correct mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       void *p = (void*) 12.34;
    est non seulement faux (comportement indéfini), mais totalement illogique.

Discussions similaires

  1. [Conversion]int to double
    Par frouge dans le forum Général Java
    Réponses: 6
    Dernier message: 03/02/2012, 09h34
  2. Conversion de type double en texte
    Par CoachMac dans le forum C
    Réponses: 17
    Dernier message: 14/10/2006, 19h29
  3. [VB.NET]Comment obtenir conversion exacte Single>Double?
    Par Misterburma dans le forum VB.NET
    Réponses: 9
    Dernier message: 09/02/2006, 22h24
  4. Problème conversion float vers double
    Par jhenaff dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 27/01/2006, 10h39
  5. conversion string en double
    Par zmatz dans le forum SL & STL
    Réponses: 2
    Dernier message: 14/10/2005, 22h46

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