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

MFC Discussion :

__int64 : macro hi et lo


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2004
    Messages : 25
    Par défaut __int64 : macro hi et lo
    Bonjour,

    Je dois créer une fonction qui renvoie un couple de int. Pour encapsuler ces 2 int , mon chef de projet m'a dit de les renvoyer sous la forme d'un __int64 afin d'éviter de déclarer une classe dans la DLL que je crée.

    Le problème est que j'ai n'ai trouvé nulle part une explication pour les mettre dans ce fichu __int64, ni pour les récuperer après coup.

    Il (mon chef de pojet) m'a parlé de macros hi et lo pour récupérer mes deux int mais je n'ai pas trouvé quoi que ce soit là desus non plus.

    Bref, je suis paumé avec tout ça...

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Pourquoi ne pas utiliser directement un union LARGE_INTEGER ou ULARGE_INTEGER ?
    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.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2004
    Messages : 25
    Par défaut
    Tout bêtement parce que je fais ce qu'on me ditde faire, et qu'ils ont besoin que je les mette dans un __int64...

    ça ne me réjouit pas plus que ça de le faire de cette façon, mais en gros, il m'a fait comprendre que je n'avais aps el choix...

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    tu peux faire un truc du genre (a tester, parce que j'ai pas réfléchi plus que ca aux décalages )
    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
     
    __int64 constructI64(int a, int b)
    {
    	return (__int64)b << 32 | (__int64)a;
    }
     
    int getLO(__int64 i)
    {
    	return (int)(i & 0xFFFFFFFF);
    }
     
    int getHI(__int64 i)
    {
    	return getLO(i >> 32);
    }
     
     
    int a = 125;
    int b = 952;
    __int64 i64 = constructI64(a,b);
     
    int a1 = getLO(i64);
    int b1 = getHI(i64);

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Citation Envoyé par mat_monroe
    Tout bêtement parce que je fais ce qu'on me ditde faire, et qu'ils ont besoin que je les mette dans un __int64...

    ça ne me réjouit pas plus que ça de le faire de cette façon, mais en gros, il m'a fait comprendre que je n'avais aps el choix...
    Euh... Mais le LARGE_INTEGER contient un __int64...
    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.

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    tu peux utiliser memmove.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int a = 125;
    int b = 952;
    __int64 i64 = constructI64(a,b);
    Split64( i64,a,b);
    ASSERT(a==125);
    ASSERT(b==952);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    __int64 constructI64(int a,int b)
    {
       __int64 i64;
       memmove(&i64,&a,sizeof(a));
       memmove(((char *)&i64)+sizeof(b),&b,sizeof(b));
      return i64;
    }
    void Split64( __int64 i64,int &a,int &b)
    {
       memmove(&a,&i64,sizeof(a));
       memmove(&b,((char *)&i64)+sizeof(b),sizeof(b));
    }

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    pourquoi un cast en char* ? memmove prend un void* en paramètre, non?
    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.

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    oui tu as raison, pour le premier memmove c'est inutile.

  9. #9
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    ca vous plait pas les opérations sur les bits ?
    avec memove j'aurai l'impression de deployer la grosse artillerie

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Citation Envoyé par nico-pyright(c)
    ca vous plait pas les opérations sur les bits ?
    avec memove j'aurai l'impression de deployer la grosse artillerie
    moi c'est l'inverse lol.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2004
    Messages : 25
    Par défaut
    Merci pour vos réponses...

    J'ai été coupé du net pendant le week-end et j'ai donc du trouver une solution tout seul...
    J'avais d'abord pensé au décalage de bits avec un masque (comme niconico-pyright(c)) mais j'ai du merdé quelque part parce que ça plantait.

    J'ai donc multiplié mon premier nombre par 2^32 puis ajouté le second dans un __int64:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    __int64 x=(a*(0x100000000))+b;
    Pour récuperer les deux chiffres, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    b2=(x%(0x100000000));
    a2=((x-b2)/(0x100000000));
    C'est pas des plus jolis mais ça marche et ça reste rapide. Je pense que je vais prendre la solution de nico-pyright(c) qui correspondait à ce que j'vais en tête.

  12. #12
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Citation Envoyé par mat_monroe
    Je pense que je vais prendre la solution de nico-pyright(c) qui correspondait à ce que j'vais en tête.
    gnarf gnarf

    vérifie quand meme que ca marche bien pour les nombres à la limite de la capacité d'un entier

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2004
    Messages : 25
    Par défaut
    ça devrait aller... mes deux nombres sont les coordonées d'un point sur une image 400 x 256 pixels...

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

Discussions similaires

  1. [VB6] Exécuter une macro Access
    Par Nektanebos dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 22/02/2006, 16h32
  2. [VBA-E] Macro ouverture fichier déja ouvert
    Par bhaal76 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/12/2002, 14h30
  3. [VBA-E] [Excel] Lancer une macro à une heure donnée
    Par Lysis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/10/2002, 12h15
  4. Qu'est-ce qu'une macro ?
    Par karli dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/09/2002, 03h38
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

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