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 :

error : 'nomVariable' cannot appear in a constant-expression


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut error : 'nomVariable' cannot appear in a constant-expression
    Bonjour à tous.

    (Grâce à certains du forum) J'ai un code qui me permet de lire N octets pour les copier dans une variable de taille N :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template <class T>
    void read(T& val, const unsigned char* data, bool big_endian=true) {
    	const size_t size = sizeof(T);
    	unsigned char *ptr = reinterpret_cast<unsigned char*>(&val);
    	for(size_t i=0; i<size; ++i) {
    		ptr[big_endian ? size - i - 1 : i] = data[i];
    	}
    }
    Le truc c'est que si val a pour taille 2 octets, je lis 2 octets mais dans mon programme ce n'est pas forcement le cas ! (val a pour taille 8octets mais je veux juste lire et copier 2 octets) Donc j'ai décidé de modifier un peu le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <class T>
    void EndianTools::readnData(T& val, const size_t size, const unsigned char* data, int msb, int lsb, bool big_endian=true)
    {
        typedef typename unsigned_<size>::type type;
        type *ptr = reinterpret_cast<unsigned char*>(&val);
        for(size_t i=0; i<size; ++i)
            ptr[big_endian ? size - i - 1 : i] = data[i];
     
    }
    Je pensais pas trop prendre de risque en faisant ça mais le compilo me hurle dessus en disant : error : 'size' cannot appear in a constant-expression
    Si quelqu'un pouvait m'expliquer ce qu'il se passe (oui j'ai envie de comprendre) et aurait une idée.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Je crois que l'erreur est assez explicite ; tu ne peux pas construire le type 'type' avec des infos qui ne sont connues qu'à l'exécution. 'size' devrait être un argument template plutôt qu'un argument de fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <class T, size_t SIZE>
    void EndianTools::readnData(T& val, const unsigned char* data, int msb, int lsb, bool big_endian=true)
    {
        typedef typename unsigned_<SIZE>::type type;
        type *ptr = reinterpret_cast<unsigned char*>(&val);
        for(size_t i=0; i<SIZE; ++i)
            ptr[big_endian ? SIZE - i - 1 : i] = data[i];
     
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Merci mais j'ai quand même un problème :
    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
     
    int main()
    {
        unsigned char data[1];
        data[0] = 0;
        int8_t i2 = -55;
     
        writenData(i2, data, 7, 0, false);
        int8_t k = (uint8_t)data[0];
        std::cout << "memoire d'origine :" << std::endl;
        printf("%d\n", k);
        binary(k); //fonction qui écrit en binaire le paramètre k
     
        int16_t i3 = 0;
        readnData<int16_t, 1>(i3, data, 7, 0, false);
        std::cout << "memoire finale :" << std::endl;
        printf("%d\n", i3);
        binary(i3);
     
        return (0);
    }
    Sortie :
    memoire d'origine :
    -55
    11001001
    memoire finale :
    -14080
    1100100100000000
    Appuyez sur <ENTR╔E> pour fermer cette fenÛtre...

    J'aimerai avoir mon -55
    EDIT : Et quand je swap les bits, j'obtiens 201..

Discussions similaires

  1. Réponses: 10
    Dernier message: 29/01/2009, 01h55
  2. case expressions must be constant expressions
    Par semaj_james dans le forum Langage
    Réponses: 9
    Dernier message: 17/07/2007, 17h28
  3. Réponses: 3
    Dernier message: 01/05/2007, 18h57
  4. Réponses: 3
    Dernier message: 26/10/2006, 18h21
  5. [Stored Procedure]Only constants, expressions, or variables
    Par nmerydem dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 20/10/2004, 18h29

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