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 :

Comportement différent de sprintf en fonction de la plateforme


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut Comportement différent de sprintf en fonction de la plateforme
    Bonjour

    le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       long long int code;
      char strCode[17];
      sprintf(strCode, "%016llX", code);
    ne renvoie pas la mm chose en 7 64 bits et en xp 32 ?
    Une idée ?

    Merci
    Julien

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    Bonjour

    Je poursuis mes investigations : la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      sprintf(strCode, "%016lX", code);
    renvoie la même chose sur les deux plateformes. C'est donc un pb
    de conversion d'entier 64 bits.
    Comment puis-je corriger cela ?

    Julien

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    J'ai corrigé en faisant la conversion en deux fois : 32 bits par 32 bits.

    Si pour ma culture qq un peut me dire pourquoi cette différence, cela m'intéresse.

    a+
    Julien

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Dans le code que tu donnes tu n'initialise pas code, donc il contient n'importe quoi.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    arf, dans mon code, c'est correctement initialisé. J'ai mis juste la ligne
    qui se comporte différemment puis j'ai rajouté les variables pour que
    vous puissiez en connaitre les types.

    Julien

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    A vrai dire je m'en doutais un peu, mais si tu ne postes pas ton code exact, et si tu ne décris pas le problème plus précisément, il y a toutes les chances qu'on ne puisse pas t'aider. Le problème est sans doute dans ce que tu ne montres pas.

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 123
    Par défaut long long
    Bonjour,
    Le long long n'est pas supporté par toutes les versions de sprintf().
    Sur le site msdn de Microsoft, le format long long (ll) n'est pas indiqué.

    Je vais essayer de vous expliquer:

    Votre entier vaut en hexa : 11F71FB04CB.
    Votre format : 0x016 => 16 caractères au maximum paddés avec des 0.
    16^16, c'est 16 F de suite.
    -----11F71FB04CB
    FFFFFFFFFFFFFFFF
    le plus grand unsigned int, c'est FFFF (65535), le plus grand unsigned long c'est FFFFFFFF. Et le plus grand long long c'est 16 F de suite.

    Je noterai au passage qu'avec mon Vista 32b, si je convertis 16^16 en hexa, cela me donne 0. Mais si j'écris dans la calculatrice 16^16 - 1 en hexa cela me donne bien FFFFFFFFFFFFFFFF soit 16 F de suite.

  8. #8
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    avec le runtime C de microsoft, il ne faut pas utiliser le type long long mais le type __int64 et le format "%I64d" pour être que que cela soit compatible avec toutes les version de la CRT (par exemple, long long int n'est supporté que depuis VS 2010 par MS)

    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    Bonjour

    Merci de votre aide.

    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%016I64X\n", code);
    Cela fonctionne. Néanmoins, j'entends beaucoup parler de microsoft
    (forcemment puisque je parle d'os microsoft !...) mais ce code va être
    utilisé sous linux, dois-je m'attendre à des dysfonctionnement sous linux.

    Pour info, je compile avec gcc.

    merci
    Julien

  10. #10
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Sous Linux (et sous toutes les plateformes qui respectent les standards), ce code va afficher "%016I64X".

    Si tu veux être standard il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%016llX\n", code);

  11. #11
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    sous gcc, long long est supporté depuis longtemps et de ce point de vue la , gcc respecte très bien le C99.

    Par contre le type __int64 et le flag "I64" sont spécifique au runtime C de microsoft.

    Fais comme tout le monde, crée toi des macros pour avoir du code portable
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  12. #12
    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
    Apparemment, le préfixe "ll" a été introduit par Microsoft seulement à partir de VS2005. -> MSDN

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/01/2012, 15h48
  2. Comportement différent des listes [] et des tuples () ??
    Par JujuKéblo dans le forum Général Python
    Réponses: 2
    Dernier message: 12/10/2005, 09h08
  3. [C#] bouton avec 2 comportements différents ?
    Par st0j dans le forum ASP.NET
    Réponses: 8
    Dernier message: 31/05/2005, 09h50
  4. Réponses: 3
    Dernier message: 16/03/2005, 11h31

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