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 :

problème de format de variable


Sujet :

C

  1. #1
    Membre confirmé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Points : 604
    Points
    604
    Par défaut problème de format de variable
    Bonjour a toutes et tous, je sollicite votre aide car j'ai un souci incompréhensible pour moi:

    Je travaille sur un programme de communication série RS485 avec protocole MODBUS. J'écris mon programme en C et je travaille avec eclipse sous Linux.
    Dans mon programme, j'envoie une demande de lecture avec un write et je reçoit la réponse avec le read. La réponse que je reçoit est sous la forme décimal et ce que je veux lire à une taille de 4 octets. Voici la réponse que je lis en héxadécimal: 01 04 09 FF FF FF FF CRC16 CRC16 (que je stocke dans une variable que j'appelle buffer) (ici les données qui nous intéresse pour le traitement sont FF FF FF FF).

    Pour connaître la valeur en décimal je fais un traitement comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    unsigned long MaValeur;
     
    MaValeur = buffer[3]*(256^3) + buffer[4]*(256^2) + buffer[5]*256 + buffer[6];
     
    printf("%lu\n", MaValeur);
    Avec ma calculatrice, je devrais obtenir le résultat 4294967295, or lorsque je regarde ce qu'affiche mon prinft j'obtiens 18446744073709551615 avec un warning me disant "integer overflow in exepression". Cela sous-entendrait donc qu'il y a un dépassement de ce que peut contenir mon long. Je dis okay, pourquoi pas mais lorsque je rentre en dur mon résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaValeur = 4294967295;
    Mon prinft affiche le bon résultat. Donc je ne comprend pas pourquoi j'ai ce problème, pouvez-vous m'aider ?

    Cordialement,
    Si vous voulez suivre les différents championnats de football américain en France, en Europe et dans le Monde (en tout 32 pays différents), c'est sur www.fandefootus.fr

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tu sais que 256^3 n'est absolument pas 256 * 256 * 256 mais le "bitwise xor" de 256 et 3, soit 259?

    Par ailleurs, suffixes les constantes par UL (256UL) pour en faire des unsigned long, plutot que des (signed) int.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre confirmé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Points : 604
    Points
    604
    Par défaut
    Citation Envoyé par leternel Voir le message
    Tu sais que 256^3 n'est absolument pas 256 * 256 * 256 mais le "bitwise xor" de 256 et 3, soit 259?

    Par ailleurs, suffixes les constantes par UL (256UL) pour en faire des unsigned long, plutot que des (signed) int.
    J'ai mis 256^3 ici parce que je ne sais pas écrire le cube mais dans mon programme je tape directement 16777216, si j'ai mis cela et pas 16777216 c'est pour expliquer le raisonnement
    Si vous voulez suivre les différents championnats de football américain en France, en Europe et dans le Monde (en tout 32 pays différents), c'est sur www.fandefootus.fr

  4. #4
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Voir opérateur arithmétique. Si buffer est de type unsigned char, alors on a une opération (uchar * int), suivant les règles de conversion du lien que j'ai mis ci-avant, on obtient (int * int) -> int, par conséquent rien n'est réalisé avec des unsigned long. leternel t'as donné la solution ;-)

  5. #5
    Membre confirmé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Points : 604
    Points
    604
    Par défaut
    Merci pour vos réponses et pour la solution, cela marche maintenant. Encore merci et sujet résolu
    Si vous voulez suivre les différents championnats de football américain en France, en Europe et dans le Monde (en tout 32 pays différents), c'est sur www.fandefootus.fr

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

Discussions similaires

  1. Problème de format de variable
    Par Mario Rousson dans le forum VB.NET
    Réponses: 2
    Dernier message: 23/02/2012, 21h21
  2. Problème Importation - Format variable
    Par mpompompo dans le forum SAS Base
    Réponses: 5
    Dernier message: 03/10/2009, 19h41
  3. Problème format de variable
    Par cchampion2fr dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 09/10/2008, 18h36
  4. [BO 6.5.1][Deski]Problème de format de variable
    Par CélineM dans le forum Deski
    Réponses: 7
    Dernier message: 14/05/2008, 10h43
  5. problème format des variables
    Par PC81 dans le forum VBA Access
    Réponses: 4
    Dernier message: 16/04/2008, 09h51

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