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 :

Rendre visible une variable qui est dans un fichier *.cpp


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Rendre visible une variable qui est dans un fichier *.cpp
    Bonjour à toutes et à tous,

    J'utilise une bibliothèque dont le fichier bibli.cpp possède une variable telle que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    static uint8_t buffer[1024] = {
    // toutes les valeurs d'initialisation
    };
    Cette bibliothèque représente une classe dont je veux dériver une classe enfant et qui utilisera cette variable.

    Cette variable statique est apparemment hors de la classe.

    Bien entendu, quand je compile ma classe enfant, le compilateur me dit que cette variable n'est pas visible.

    Comment la rendre visible pour ma classe enfant ?

    Merci de votre aide.

    Pierre

  2. #2
    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
    Une variable static dans un cpp est limité à l'unité de compilation en cours.
    Il s'agit d'un détail d'implémentation spécifique à ce fichier/cette classe, pourquoi en aurais-tu besoin et ferais-tu un héritage d'une telle classe ?
    Tu peux certes la passer en const static de classe, mais c'est surement fait ainsi pour une bonne raison.
    Du coup au mieux tu as un problème de conception, ou tu veux utiliser quelque chose sans que ce soit prévu pour, ce qui est généralement une mauvaise idée.
    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.

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Ce tableau représente l'espace des données d'un afficheur de 128 x 64 pixels. Au travers de fonctions, on utilise les points qui vont bien pour afficher ce que l'on veut, par exemple du texte ou des images noir et blanc.

    Les valeurs d'initialisation représentent une image propre au concepteur de la bibliothèque.

    Mon dessein est de placer une autre image à l'initialisation, donc de remplir ce tableau avec d'autres valeurs.

    Le problème est que je suis dans le monde Arduino et que l'espace mémoire RAM est très limité. Je dois placer au départ mon image dans l'espace de mémoire FLASH (l'espace où réside le programme) pour la transférer dans le tableau "buffer" qui lui est en RAM. La bibliothèque ne possède pas de fonction pour ce faire. Voilà pourquoi, ne voulant pas modifier la bibliothèque, j'en dérive un enfant pour ce faire.

    Peut-être (sûrement) que je m'y prend mal. Comment accéder ce tableau à partir d'une classe enfant ?

    Voilà ce que j'ai fait : fichier .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef ChP_SSD1306_h
    #define ChP_SSD1306_h
     
    #include "Adafruit_SSD1306.h"
     
    class ChP_SSD1306 : public Adafruit_SSD1306 {
    	public:
    		ChP_SSD1306(int8_t RST = -1, byte *img = 0);
    };
     
    #endif
    et fichier.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "Adafruit_SSD1306.h"
    #include "ChP_SSD1306.h"
    
    ChP_SSD1306::ChP_SSD1306(int8_t RST, byte *img) : Adafruit_SSD1306(RST) {
    	for (int i = 0; i < 1024; i++)
    		buffer[i] = pgm_read_byte(&img[i]);
    }
    Cordialement.

    Pierre

  4. #4
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Bon, en fait, je me casse les pieds pour rien ; dans une classe supérieure, il y a une fonction qui permet d'afficher un bitmap. Je ne l'avait pas vue.

    Désolé pour le dérangement.

    Cordialement.

    Pierre

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Voilà pourquoi, ne voulant pas modifier la bibliothèque, j'en dérive un enfant pour ce faire.
    Heu, l'héritage, c'est pas un ouvre-boite à code logiciel.

    Le problème est que je suis dans le monde Arduino et que l'espace mémoire RAM est très limité.
    Alors, la solution la plus simple, c'est de modifier la définition du buffer directement dans le .cpp.
    Un .h + .cpp n'a jamais fait une bibliothèque.
    C'est juste du code à utiliser et à modifier si nécessaire.

    Si vous voulez conserver le comportement original et utiliser l'héritage, il faut utiliser les modes d’extension de la classe qui sont ici réduit à 2 méthodes virtuelles :
    virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
    virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
    C'est pas super sympa comme point d’extension. (conçu avec les pieds ? )

    Si vous ne voulez changer que la chose qui s'affiche, faite un copier-coller de ces méthodes et changez la partie qui fait appel aux versions "Internal" de ces méthodes pour appeler les vôtres.
    Vos version "Internal" seront aussi un copier-coller des siennes mais le code qui initialise le pointeur de travail sur le buffer static, comme en ligne 646, sera remplacer pour utiliser le vôtre.

  6. #6
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Comme je l'ai dit dans ma réponse #4, mon problème est un faux problème.

    Toutefois, je vous remercie pour vos suggestions que je garde sous le coude.

    Cordialement.

    Pierre

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

Discussions similaires

  1. Transmettre variable qui est dans une fonction dans une autre
    Par band22 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/08/2011, 08h06
  2. Réponses: 1
    Dernier message: 05/11/2009, 15h19
  3. acceder à une variable qui est dans une condition
    Par Snipy dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2009, 12h39
  4. Accéder à une variable qui est dans une string
    Par ploxien dans le forum Langage
    Réponses: 4
    Dernier message: 13/04/2007, 14h48
  5. voir comment est alimentée une vue qui est dans dba_objects
    Par meufeu dans le forum Administration
    Réponses: 15
    Dernier message: 06/10/2004, 17h27

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