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

Langage C++ Discussion :

Pourquoi ce code génère un warning ?


Sujet :

Langage C++

  1. #1
    Membre éprouvé Avatar de pcdwarf
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    February 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : February 2010
    Messages : 267
    Points : 964
    Points
    964
    Par défaut Pourquoi ce code génère un warning ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    volatile uint8_t * hardwarePort;
    volatile uint8_t * hardwareDDR;
    volatile uint8_t * hardwarePin;
    uint8_t hardwareMask;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        *hardwareDDR &= ~hardwareMask;

    erreur: conversion to «uint8_t {aka unsigned char}» from «int» may alter its value [-Werror=conversion]
    *hardwareDDR &= ~hardwareMask;
    ^
    J'ai bien déclaré tout en unsigned. Là, j'avoue que je ne comprends pas

    Pour info :
    gcc version 5.4.0 (GCC)
    Target: avr

  2. #2
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    March 2002
    Messages
    1 003
    Détails du profil
    Informations forums :
    Inscription : March 2002
    Messages : 1 003
    Points : 8 122
    Points
    8 122
    Par défaut
    Je penses que l'origine du warning provient d'une partie du code que vous ne montrez pas.
    postez un code à minima qui reproduit votre problème.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  3. #3
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    June 2011
    Messages
    737
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : June 2011
    Messages : 737
    Points : 3 616
    Points
    3 616
    Par défaut
    C'est un problème de promotion des entiers. Toute opération arithmétique sur les types inférieurs au rang d'un int donnera un int (ou un unsigned si ça ne rentre pas dans un int). Du coup ~uint8_t -> int et il faut sortir les static_cast...

  4. #4
    Membre éprouvé Avatar de pcdwarf
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    February 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : February 2010
    Messages : 267
    Points : 964
    Points
    964
    Par défaut
    En effet c'est la promotion des entiers.

    Ce qui est étonnant car sur cette architecture 8 bits, sizeof (int) = 1

    Il est étonnant que ~ uint8_t donne un int8_t
    je ne trouve pas ça très logique Mais OK. donc En avant pour le static cast.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    September 2005
    Messages
    27 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : September 2005
    Messages : 27 359
    Points : 41 468
    Points
    41 468
    Par défaut
    Ce qui m'étonne, c'est qu'on ait ces warnings sur des &=. Je croyais que tous les += etc. étouffaient ce genre de warning, mais c'est peut-être mon expérience du C# qui colore mes propos.

    En règle générale le choix que les opérateurs bitwise forcent la promotion en int me parait toujours une erreur des concepteurs du langage. Mais dans des edge cases comme valeur32 &= ~valeur8 on se dit que c'est peut-être une bonne chose (la perte silencieuse des 24 bits supérieurs pourrait être considérée comme violant le principe de moindre surprise).
    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
    Membre éprouvé Avatar de pcdwarf
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    February 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : February 2010
    Messages : 267
    Points : 964
    Points
    964
    Par défaut
    Pour ma part la moindre surprise serait que le type résultant d'un opérateur unaire, soit identique (en taille et en signe) au type de objet sur lequel on l'applique.

    Changer le signe et la taille sur du bitwise me semble piégeux.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <stdio.h>
    #include <stdint.h>
    int main()
    {
        printf("Hello World\n");
     
        uint8_t mask = 0x80;
        uint16_t a = 0x2000;
     
        printf("0x2000 | (   0x80 ) =  0x%08X\n", a | ( mask)  );
        printf("0x2000 | ( ~ 0x80 ) =  0x%08X\n", a | (~mask)  );
     
        printf("Goodbye\n");
        return 0;
    }



    Hello World
    0x2000 | ( 0x80 ) = 0x00002080
    0x2000 | ( ~ 0x80 ) = 0xFFFFFF7F
    Goodbye


    ...Program finished with exit code 0

    Pour ma part question "moindre surprise" tout étant déclaré unsigned j'attendais 0x0000207F au second calcul.

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

Discussions similaires

  1. modification de code générée automatiquement
    Par kimcharlene dans le forum NetBeans
    Réponses: 7
    Dernier message: 08/03/2007, 22h55
  2. Réponses: 4
    Dernier message: 01/03/2007, 22h52
  3. Pourquoi mon code est plus lent que Arrays.sort
    Par alexis779 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/12/2006, 13h44
  4. Réponses: 2
    Dernier message: 31/07/2006, 09h48
  5. Pourquoi ce code marche pas sous FF?
    Par Death83 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/09/2005, 11h04

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