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 :

probleme avec typedef


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Par défaut probleme avec typedef
    salut les gas
    une petite question a propos du typedef
    voila le 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
     
    typedef unsigned __int32 uint32;
    typedef unsigned __int64 uint64;
     
    double uint64_to_double (const uint64 x)
    {
     
      // Petit hack pour convertir du 64 bits en double
      // Ce hack dépend de l'endian (ici ça marche sur Intel x86)
      typedef uint32 uint64_32[2];
      uint64_32 *hack = (uint64_32 *)&x;
      double dbl;
     
      dbl  = (*hack)[1];
      dbl *= 4294967296;
      dbl += (*hack)[0];
     
      return dbl;
    }
    comme il est indiqué c'est une fonction qui permet de convertir un unint64 en Double
    mais ce que je n'arrive pas à comprendre c'est les deux ligne suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef uint32 uint64_32[2];
      uint64_32 *hack = (uint64_32 *)&x;
    j'ai essayé de chercher sur internet mais j'ai pas trouver une écriture simulaire à si quelqu'un peut juste m'indiquer un lien d'un cours ou le fonctionnement de ce typedef
    merci encore une fois les gas

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nR.mEcs0ft Voir le message
    mais ce que je n'arrive pas à comprendre c'est les deux ligne suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef uint32 uint64_32[2];
      uint64_32 *hack = (uint64_32 *)&x;
    Salut

    Ces lignes récupèrent l'adresse de x dans un pointeur uint64_32. Par la suite, chaque fois que tu utiliseras le pointé, le compilo considèrera l'élément pointé comme un uint64_32

    Citation Envoyé par nR.mEcs0ft Voir le message
    j'ai essayé de chercher sur internet mais j'ai pas trouver une écriture similaire à
    Bah, c'est comme déclarer un FILE *hack. Un pointeur quoi.

    Citation Envoyé par nR.mEcs0ft Voir le message
    si quelqu'un peut juste m'indiquer un lien d'un cours ou le fonctionnement de ce typedef
    Celui-ci comme les autres définit un alias sur un nouveau type à partir d'un type existant

    Citation Envoyé par nR.mEcs0ft Voir le message
    merci encore une fois les gars
    Pfff, quelle orthographe !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Par défaut
    Salut
    merci Sve@r pour la réponse
    désoler pour l'orthographe j'ai pas fait attention
    bon

    Ces lignes récupèrent l'adresse de x dans un pointeur uint64_32. Par la suite, chaque fois que tu utiliseras le pointé, le compilo considèrera l'élément pointé comme un uint64_32
    oui ça je le sais déjà mais pour moi avec la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef uint32 uint64_32[2];
    un uint64_32 u1;
    est équivalant à uint64_32 u1[2]
    n'est ce pas ????
    si c'est vrai . que veut dire :
    un pointeur sur un vecteur de deux éléments de type uint64_32 ??
    car le compilateur me déclare qui est de type
    et les hack[0] ,hack[1] de type uint64_32 (unsigned int) ???
    si c'est vrai encore une petite question (bête) pourquoi dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uint64_32 *hack = (uint64_32 *)&x;
    il y a un '&' + un cast en uint64_32 * ??

    une autre chose
    quand je vérifie le contenu du hack[0] oui il a comme valeur celle de x mais hack[1] il a 0
    quand je remplace le x par un i par exemple de type int le hack[0] a la valeur de i,mais le hack[1] a une valeur aléatoire breff je crois que j'ai pas bien compris le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uint64_32 *hack = (uint64_32 *)&x;
    est ce qu'il a un effet sur hack[0] et hack[1]
    un unsigned int [2] * qui pointe sur un unsigned int ???
    merciii encore les gars

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nR.mEcs0ft Voir le message
    oui ça je le sais déjà mais pour moi avec la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef uint32 uint64_32[2];
    un uint64_32 u1;
    est équivalant à uint64_32 u1[2]
    n'est ce pas ????
    Exact

    Citation Envoyé par nR.mEcs0ft Voir le message
    si c'est vrai . que veut dire :
    un pointeur sur un vecteur de deux éléments de type uint64_32 ??
    car le compilateur me déclare qui est de type
    Encore exact

    Citation Envoyé par nR.mEcs0ft Voir le message
    et les hack[0] ,hack[1] de type uint64_32 (unsigned int) ???
    Encore exact. Et en plus chacun d'eux contient la moitié d'un uint64_32

    Citation Envoyé par nR.mEcs0ft Voir le message
    si c'est vrai encore une petite question (bête) pourquoi dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uint64_32 *hack = (uint64_32 *)&x;
    il y a un '&' + un cast en uint64_32 * ??
    &x => l'adresse de x (qui est de type "pointeur sur uint64")
    (uint64_32*)&x => cette adresse est convertie en adresse de type "pointeur sur uint64_32"

    Citation Envoyé par nR.mEcs0ft Voir le message
    une autre chose
    quand je vérifie le contenu du hack[0] oui il a comme valeur celle de x mais hack[1] il a 0
    Probablement parce que x est trop petit pour remplir les 64 bits. Essaye de mettre x=(0xffffffff * 4)

    Citation Envoyé par nR.mEcs0ft Voir le message
    quand je remplace le x par un i par exemple de type int le hack[0] a la valeur de i,mais le hack[1] a une valeur aléatoire
    Là aussi c'est normal. Un int ne remplit que 32 bits mais il se trouve quelque part dans la mémoire (mémoire qui englobe toutes les variables). Donc avant lui il y a quelque chose (peut-être une variable "toto") et après lui il y a autre chose (une variable "titi").
    Ensuite, tu écris *hack=(uint64_32 *)&i ce qui signifie "considère maintenant l'adresse de i (copiée dans hack) comme l'adresse d'une zone de 64 bits". Partant de là, quand tu affiches hack[0] tu affiches les 32 bits de i et quand tu affiches hack[1] tu affiches les 32 bits de la zone qui suit i (les bits de titi).

    Citation Envoyé par nR.mEcs0ft Voir le message
    merciii encore les gars
    Pas de pb.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  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
    un uint64_32 u1 est équivalent à uint64_32 u1[2]
    non, à uint32 u1[2]
    si c'est vrai . que veut dire :
    uint64_32 *hack;
    un pointeur sur un vecteur de deux éléments de type uint64_32 ??
    Non, un pointeur sur un tableau de 2 uint32. Autrement dit, c'est équivalent à uint32 (*hack)[2]
    le compilateur me déclare qui est de type uint64_32[2] *
    ?? Il est du type uint32[2] *

    et les hack[0] ,hack[1] de type uint64_32 (unsigned int) ???
    oui hack[0] ,hack[1] sont des uint64_32 (comme *hack ) et (*hack)[0] et (*hack)[1] sont des uint32

    je crois que j'ai pas bien compris le uint64_32 *hack = (uint64_32 *)&x;
    C'est un cast sauvage : &x n'est pas un uint64_32 * mais un const uint64 *. Le but de ce cast est de permettre d'utiliser x non pas comme un uint64 (qu'il est) mais comme un tableau de 2 uint32 (un uint64_32)

    Ce code revient à (cet uint64_32 ne fait qu'obscurcir les choses)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    double uint64_to_double (const uint64 x)
    {
      uint32 (*hack)[2] = (uint32 (*)[2])&x;
      double dbl;
      dbl  = (*hack)[1];
      dbl *= 4294967296;
      dbl += (*hack)[0];
      return dbl;
    }
    ou, puisqu'on est avec des cast sauvages, autant en profiter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    double uint64_to_double (const uint64 x)
    {
      uint32 *hack = (uint32 *)&x;
      double dbl;
      dbl  = hack[1];
      dbl *= 4294967296;
      dbl += hack[0];
      return dbl;
    }
    Remarque : pourquoi ne pas avoir simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        uint64 a = 1234567890123456;
    //    double x = uint64_to_double(a);
        double x = a;

  6. #6
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Par défaut
    Remarque : pourquoi ne pas avoir simplement
    oui moi aussi je ne sais pas pourquoi , mais d'aprés le code il y a un
    donc visual studio ne cast pas de uint64 en double
    voila le lien du code
    http://haypo.developpez.com/article/...requence_cpu.c

    le code sert a calculer le fréquence du Processeur et du Conteur windows .
    désoler pour les uint64_32 ;
    oui tu a raisons il sont des uint32 ,j'ai mélangé les choses un peu

Discussions similaires

  1. probleme avec les typedef structure
    Par claire_cartier dans le forum Débuter
    Réponses: 7
    Dernier message: 21/11/2008, 09h38
  2. Probleme avec Typedef
    Par robin.pariset dans le forum C
    Réponses: 2
    Dernier message: 30/11/2007, 12h26
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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