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 d'acces aux attributs d'un objet [arduino].


Sujet :

C++

  1. #1
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut problème d'acces aux attributs d'un objet [arduino].
    Salut les cpp,
    Je ne connais absolument rien au langage cpp mais j'ai une petite expérience du langage C et arduino.

    Dans le bouquin que je suis en train de lire, j'ai découvert que les librairies arduino sont écrite en cpp et un exemple y est donner comment en fabriquer une.
    J'ai bien sur foncer tête baisser a me fabriquer une librairie qui peut faire luire maximum 7 LED dans toutes les possibilités: pow(2,7) codé dans un tableau de bit, chaque bit représentant l'état d'une LED.

    Voici le fichier *.h de la librairie:
    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
     
    #include "Arduino.h"
     
    class Blinker {
      public:
        Blinker(byte pins[],byte pins_number) ;
        void blinking(unsigned int duree,boolean reversed) ;
      private:
        byte _c ;
        byte _cc ;
        byte _number_of_LED  ;
        byte _pins[] ;
        byte _total_possibilities ;
        byte _table[][255] ;
     
    } ;
    Et voici le fichier *.cpp:
    Ne vous inquiétez pas si des méthodes vous sont inconnues c'est de l'arduino.
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    #include "Arduino.h"
    #include "Blinker.h"
     
    Blinker::Blinker(byte pins[],byte pins_number) {
      byte _c ;
      byte _number_of_LED = pins_number ;
     
      byte _pins[pins_number]  ;
      for (_c=0 ; _c < _number_of_LED ; _c++) {
        _pins[_c] = pins[_c] ;
      }
     
      for( _c=0 ; _c < _number_of_LED ; _c++) {
        pinMode(pins[_c],OUTPUT) ;
      }
     
      byte _total_possibilities ;
     
      _total_possibilities = byte(pow(2,_number_of_LED)) ; // pow(2,7) return 127 instead of 128 another mystery of arduino...
      _total_possibilities++ ;
     
      // [DEBUG : Serial.print(_total_possibilities) ; 
      // [DEBUG : Serial.println() ;
     
      byte _table[_total_possibilities][_number_of_LED] ;
      for (_c=0 ; _c < _total_possibilities ; _c++) {
        byte _cc ;
        byte _value_to_bin=_c ;
        for (_cc=0 ; _cc < _number_of_LED ; _cc++) {
          _table[_c][_cc]=_value_to_bin % 2 ;
          _value_to_bin /= 2 ;
          // [DEBUG : Serial.print(_table[c][cc]) ;
        }
        // [DEBUG : Serial.println() ;
      }
     
    }
     
    void Blinker::blinking(unsigned int duree,boolean reversed) {
     
      // [DEBUG : Serial.print(total_possibilities) ;
      //          Here i get the value 0 instead of the pow() computed value from the constructor
      // [DEBUG : Serial.println() ;
     
      if ( ! reversed) {
        for (byte _c = 0 ; _c < _total_possibilities ; _c++) {
          for(byte _cc=0 ; _cc < _number_of_LED ; _cc++ ) {
     
    	if ( _table[_c][_cc] == 1 ) {
    	  //digitalWrite(_pins[_cc],HIGH) ;
    	  ;
    	}
    	Serial.print(_table[_c][_cc]) ;
          }
          Serial.println() ;
          delay(duree) ;
          //_init_LED() ;
        }
      }
      else {
        for (byte _c = _total_possibilities-1 ; _c >=0  ; _c++) {
          for(byte _cc=0 ; _cc < _number_of_LED ; _cc++ ) {
     
    	if ( _table[_c][_cc] == 1 ) {
    	  //digitalWrite(_pins[_cc],HIGH) ;
    	  ;
    	}
    	Serial.print(_table[_c][_cc]) ;
          }
          Serial.println() ;
          delay(duree) ;
          //_init_LED() ;
        }
      }
    }
    Le problème étant que quand j'instancie, de part le constructeur, l'objet de la librairie les attributs ne sont pas enregistrer quand j'appelle une autre méthode.

    Le plus embêtant étant que j'ai copier l'exemple du bouquin, suite a ce problème afin d'en avoir le cœur net et j'ai le même problème et donc ça ne fonctionne pas non plus...

    Le problème ne vient pas des attributs privées ou publique, j'ai déjà chercher dans cette direction.

    Si le code vous semble correcte il est possible que le problème vienne de mon code arduino que je vous copie de tête:
    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
     
    #include "Blinker.h"
     
    byte LEDS[3]={1,2,4} ;
    Blinker blinks(LEDS, 3) ;
     
    void setup() {
      Serial.begin(9600) ;
    }
     
    void loop() {
      if (Serial.available() > 0) {
      blinks.blinking(500,false) ;
      }
    }
    Merci pour vos réponses éclairés, dans le but de connaître la cause, de la non accessibilité d'une variable initialiser dans le constructeur ( _total_possibilities et _number_of_LED en particulier ) depuis une autre méthode de l'objet.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Coucou !

    Un post court pour dire : cpp c'est "plutôt" associé au préprocesseur ! (celui qui réagit aux #define, etc...)
    Essaye de garder "cpp" pour préproc, et "c++"... bah pour le C++ !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Que fait l'appel commenté à digitalWrite() ?

    Aussi, j'ai des doutes quant à ton appel à available().
    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.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Je déplace sur le forum C++ s'il s'agit de C++.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    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 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    j'ai des doutes quant à tes syntaxes du types var[]. Surtout pour des membres.
    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.

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    bonsoir,

    et si dans ton constructeur tu remplaces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     byte _number_of_LED = pins_number ;
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _number_of_LED = pins_number ;
    Tu es sûr que _c et _cc sont des données membres de la classe ? Ce sont de simples compteurs,non?

  7. #7
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Je ne connais pas du tout le c++,
    J'ai un doute aussi sur le tableau passer en paramètre, c'est une piste.
    Effectivement _c et _cc sont de simple compteur je peut donc les définir comme ??? pas comme membre, a revoir de ma part.
    Les fonctions commenter (comme par exemple Digitalwrite(port,état) qui permet d'allumer ou d'éteindre un port digital du board arduino) sont des fonctions de base ou personnel privée a la librairie que j'ai écrit dont je ne voulais vous imposer la présence.

    Avec ce mélange de C arduino et de cpp tous le monde a l'air perdu, je vais donc reformuler ma question:
    -Le code est correctement compiler, pas de message d'erreur lors de l'inclusion, mais aurai je fait une erreur de programmation ?
    -Est-ce normal de ne pouvoir accéder a un attribut définis (ici en fonction des paramètres passer au constructeur) dans une méthode du même objet ?

    Un mini briefing sur les objets en cpp serai la bienvenue.

    PS: la librairie est en période de test et donc je me sert des méthodes d'affichage fournis par l'objet Serial (comme print() ou println() afin de vérifier si les données sont correctes) qui sert a établir une liaison série avec le board arduino.
    et je suis bloquer la et vos réponses sont la bienvenue afin de m'extirquer de cette impasse.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  8. #8
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    Pour moi le problème vient que dans l'implémentation de ton constructeur tu déclares des variables locales à ton constructeur et qui porte le même nom que les membres de ta classe.
    Ces variables locales masquent donc les membres de ta classe, et ces derniers ne sont pas renseignés.
    Tu devrait compiler en mettant au minimum l'option -WAll pour voir les warnings, car ce problème serait alors indiqué par le compilateur.

  9. #9
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par Luke spywoker Voir le message
    Je ne connais pas du tout le c++
    ça peut s'arranger, ce cours-là sur les classes me semble pas mal. Pour se faire les dents sur Arduino voir également ici avec un exemple simple.

    Citation Envoyé par Luke spywoker Voir le message
    Avec ce mélange de C arduino et de cpp tous le monde a l'air perdu
    la langage Arduino est comme un wrapper du langage C++, il y a un compilateur GCC derrière.
    A part le serial.print (affichage sur le moniteur série) et le digitalWrite pour allumer ta led, c'est du C++...

    Citation Envoyé par Luke spywoker Voir le message
    -Est-ce normal de ne pouvoir accéder a un attribut définis (ici en fonction des paramètres passer au constructeur) dans une méthode du même objet ?
    non ce n'est pas normal mais comme l'a signalé également AF_2.8 :
    Citation Envoyé par AF_2.8 Voir le message
    Pour moi le problème vient que dans l'implémentation de ton constructeur tu déclares des variables locales à ton constructeur et qui porte le même nom que les membres de ta classe...
    donc comme je l'ai dit à mon message précédent :
    dans ton constructeur tu remplaces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     byte _number_of_LED = pins_number ;
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _number_of_LED = pins_number ;

  10. #10
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Merci pour vos réponses éclairées,
    je vais lire le court afin que je comprenne un peu mieux le c++, toujours utile avec arduino.
    Je n'ai pas bien compris le pourquoi du comment concernant:
    dans ton constructeur tu remplaces :
    Code :

    byte _number_of_LED = pins_number ;

    par :

    _number_of_LED = pins_number ;
    Le problème est que dans cette réponse le type n'est pas renseigner, bon en C ne pas déclarer de type est une faute en C++ je ne sais pas, mais le problème va au-delà car le type byte est important dans mon code (le type byte correspond a un octet non signer) car on ne peut utiliser que le peu de mémoire disponible avec arduino, celui-ci n'ayant pas la capacité d'un PC. mais peut-être que la déclaration dans le fichier *.h est suffisante ?

    Concernant le nom des membres:
    1) Pour moi le problème vient que dans l'implémentation de ton constructeur tu déclares des variables locales à ton constructeur et qui porte le même nom que les membres de ta classe.

    2) Ces variables locales masquent donc les membres de ta classe, et ces derniers ne sont pas renseignés.

    3) Tu devrait compiler en mettant au minimum l'option -WAll pour voir les warnings, car ce problème serait alors indiqué par le compilateur.
    1) La seule info que j'ai concernant les objets est que la déclaration de la classe se fait dans le fichier *.h et que dans la ligne dans le fichier *.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Blinker::Blinker(byte pins[],byte pins_number) { ; }
    cette analogie est obligatoire... C'est ce qui est écrit dans le bouquin.
    2) Je ne comprend pas l'espace de nom du C++.
    3) Je vais peut-être essayer de compiler avec GCC il faut juste que j'arrive a inclure les librairies d'arduino.

    Je vous pris de m'excuser si je suis un peu confus mais il n'est pas facile pour moi d'écrire un objet dans un langage que je ne connait pas, j'ai juste essayer avec ce qui était écrit dans le bouquin et je vais donc m'empresser de lire le tutoriel afin d'en apprendre plus...

    Merci pour vos réponses éclairées.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  11. #11
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par Luke spywoker Voir le message
    Le problème est que dans cette réponse le type n'est pas renseigner, bon en C ne pas déclarer de type est une faute en C++ je ne sais pas, mais le problème va au-delà car le type byte est important dans mon code (le type byte correspond a un octet non signer) car on ne peut utiliser que le peu de mémoire disponible avec arduino, celui-ci n'ayant pas la capacité d'un PC. mais peut-être que la déclaration dans le fichier *.h est suffisante ?
    Oui, dans la déclaration de ta classe (généralement c'est dans le .h) tu déclares des membres. C'est à ce moment que tu vas déclarer de quels type ils sont.
    C'est membres sont ensuite directement accessibles dans toutes les méthodes appartenant à la classe. C'est pour ça que tu n'as par à redonner le type. Car si tu redonnes le type cela revient à créer une variable locale qui va masquer les variables membres de ta classe.

    Citation Envoyé par Luke spywoker Voir le message
    Concernant le nom des membres:

    1) La seule info que j'ai concernant les objets est que la déclaration de la classe se fait dans le fichier *.h et que dans la ligne dans le fichier *.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Blinker::Blinker(byte pins[],byte pins_number) { ; }
    cette analogie est obligatoire... C'est ce qui est écrit dans le bouquin.
    Oui c'est exacte.

    Citation Envoyé par Luke spywoker Voir le message
    2) Je ne comprend pas l'espace de nom du C++.
    Le compilateur C++ vient une librairie, la librairie standard, ou STL. La notion d'espace de nommage permet de résoudre les problèmes de fonction portant le même nom. L'espace de nommage de la STL est std
    te permet d'accéder la fonction d'écriture sur le flux de sortie standard.

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    @Luke spywoker : tu viens du Python me semble t-il ? Si oui, pense à quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import module
    module.f()
    #
    from lib import g
    g()
    Ca te donne un peu une idée de std::cout; et using namespace std; cout;

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/06/2009, 16h56
  2. Accès aux attributs d'un objet
    Par JeanMi66 dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 09/07/2008, 15h17
  3. Problème d'accés aux attributs de ma classe
    Par Invité dans le forum Débuter
    Réponses: 3
    Dernier message: 08/07/2008, 23h49
  4. Problème d'acces aux attributs
    Par parano dans le forum C++
    Réponses: 3
    Dernier message: 16/03/2007, 17h29
  5. [POO] Acces aux attributs d'un objet depuis une methode evenement :s
    Par NikoGJ dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/07/2006, 20h01

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