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 :

Déclarer et initialiser un tableau const statique dans une classe


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Déclarer et initialiser un tableau const statique dans une classe
    Salut,

    Je veux initialiser le tableau _red qui est un static const unsigned short par des valeurs que je charge à partir d'un data-set (getValue) et ceci dans une classe pour être utilisé par d'autre classes par la suite.
    Grosso modo c'est une lut de couleur.

    Alors voici le header de ma classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef LUTTABLE_H
    #define LUTTABLE_H
    #include <dataset.h>
    class LUTTable
    {    
    public:
      LUTTable();
      void setLUT (DataSet &lut);
      static const unsigned short* _red;
    };
    #endif // LUTTABLE_H
    Et le cpp
    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
     
    LUTTable::LUTTable()
    {}
    void LUTTable::setLUT (DataSet &lut)
     
    {
       const unsigned short size = lut.size()[0];
       unsigned short  dataR[size];
     
       //unsigned short *ptrR = new unsigned short [size];
       unsigned short *ptrR;
       ptrR = dataR;
     
        for ( int i = 0; i < size; ++i )
          ptrR[i] = lut.getValue<int>("Red", i);
     
     
       _red = dataR;
    }
    Le compilateur n'aime pas et il me sort l'erreur Undefined refrence to 'LUTTable::_red' des idées les gars ?
    merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 107
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par akles Voir le message
    Le compilateur n'aime pas et il me sort l'erreur Undefined refrence to 'LUTTable::_red' des idées les gars ?
    merci
    Si le code que tu présente est complet et, avec le message d'erreur, je te dirais que tu n'as pas définis ta variable _red.

    Fais quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned short *LUTTable::_red = nullptr;
    Mais le problème que tu as par ailleurs est l'utilisation du mot clef const : tu n'a le droit qu'à une seule init or la ligne ci-dessus va déjà effectuer une initialisation.
    Il faudrait plutôt quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned short *LUTTable::_red = [];
    Mais cela ne correspond pas à ce que tu veux faire : tu veux repousser à plus tard l'initialisation.

    Donc pour résumer : problème à venir avec le const, et il faut penser à définir ta variable.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par lemmel Voir le message
    Mais le problème que tu as par ailleurs est l'utilisation du mot clef const : tu n'a le droit qu'à une seule init or la ligne ci-dessus va déjà effectuer une initialisation.
    Le const s'applique aux données pointées et non au pointeur. Il pourra toujours changer le pointeur (la valeur de _red).
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    C'est exacte je veux initialiser à l'exécution de mon programme.
    car si je fais à la manu comme suit ça passe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    static const unsigned short red_Fire_data [256]=
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,98,101,104,107,110,113,116,119,122,125,128,131,134,137,140
    ,143,146,148,150,152,154,156,158,160,162,163,164,166,167,168,170,171,173,174,175,177,178,179,181,182,184,185,186,188,189,190,192,193,195,196,198,199,201,202,204,205,207,208,209,210,212
    ,213,214,215,217,218,220,221,223,224,226,227,229,230,231,233,234,235,237,238,240,241,243,244,246,247,249,250,252,252,252,253,253,253,254,254,255,255,255,255,255,255,255,255,255,255,255
    ,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
    ,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
    ,255,255,255,255,255,255,255,255,255};
    const unsigned short* LUTTable::_red = red_Fire_data;
    Mais je suis preneur d'une idée, je tiens à préciser que je suis un novice en c++

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 107
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par akles Voir le message
    Mais je suis preneur d'une idée, je tiens à préciser que je suis un novice en c++
    Dans ta fonction de chargement tu fais tous tes traitements avec une autre variable de même type (unsigned short* maVariableTemporaire) puis quand tu as tout fini tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _red = maVariableTemporaire;

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Du genre comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        static const unsigned short *red_data = dataR;
        const unsigned short* LUTTable::_red = red_data;
    Car ça aussi il n'aime pas il me sort l'erreur : qualified-id in declaration before '=' token const unsigned short* LUTTable::_red = red_data;

    Et pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    static const unsigned short *red_data = dataR;
    _red = red_data;
    C'est toujours la même erreur de undefined reference to `LUTTable::_red'

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 107
    Points : 122
    Points
    122
    Par défaut
    plutôt comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifndef LUTTABLE_H
    #define LUTTABLE_H
    class LUTTable
    {
    public:
      LUTTable();
      void setLUT ();
      static const unsigned short* _red;
    };
    #endif // LUTTABLE_H
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "luttable.h"
    const unsigned short* LUTTable::_red = nullptr;
    LUTTable::LUTTable()
    {}
    void LUTTable::setLUT ()
     
    {
       unsigned short *yo = new unsigned short[100];
       /*...*/
       /*tu initialise yo*/
       /*...*/
       _red = yo;/*puis tu place la valeur*/
    }

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    ça marche nickel merci

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

Discussions similaires

  1. [1.x] déclarer variables statiques dans une classe controller
    Par flora806 dans le forum Symfony
    Réponses: 8
    Dernier message: 15/10/2012, 17h26
  2. Réponses: 2
    Dernier message: 17/04/2008, 18h23
  3. Tableau de constantes dans une classe statique
    Par Nico_stras dans le forum C#
    Réponses: 4
    Dernier message: 05/03/2007, 20h18
  4. Réponses: 2
    Dernier message: 17/01/2006, 13h18
  5. membre statique dans une classe
    Par motrin dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 30/12/2005, 15h15

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