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 :

Passage avec classe


Sujet :

C++

  1. #1
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut Passage avec classe
    Bonjour,

    Après "le salaire de la peur", "la famille Adams", voici un nouvel épisode de "Maman j'ai rétréci le code !"... (Private joke)

    Bon, plus sérieusement, je suis en train de perdre les quelques poils que j'ai sur le haut du cailloux et pourtant mon code est... VIDE ! *:smiley-sad-blue:

    J'essaie de faire une classe, histoire de gagner en lisibilité. Plusieurs problèmes m'oblige à revenir vous voir pour éclaircir ce qui ne va pas et du coup gagner aussi en lisibilité dans mon code. Le réduire, le synthétiser et pourquoi pas l'améliorer. Donc cette série de post, dans cete section me servira à ça dans tout mon projet de télécommande. J'ai pris un peu de recul et je me dis que je ne fais pas tant de mise à jour que ça. Tout bonnement par ce que c'est un joyeux B***** sans nom de près de 800 lignes de code ! peut-être qu'en découpant en classe, ça serais moins lourd à maintenir. Faut-il encore réussir à compiler.

    Je développe principalement sous 2 type de carte. Pour mon projet (tant que j'ai les mains dans le cambouis, j'utilise des arduino 2560. Sinon la fameuse Uno et peut-être un jour, au niveau de la réception une nano... A voir pour cette dernière.

    J'ai donc commencer par le plus simple et aussi le plus logique. La gestion de mon afficheur LCD par liaison I2C.
    Avant, j'avais des fonctions qui travaille remarquablement bien. et qui resemble à ceci:
    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
     
    /* FONCTION initLCD */
    void initLcd() {
     
    	//Initialisation de l'écran par I2C
    	Wire.begin(); *//Amorce la connection sur SDA et SCL
    	Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
    	Wire.write((byte)0x00); *//Assigne un null
    	Wire.write((byte)0x0C); *//Effacer l'écran
    	Wire.write((byte)0x13); *//Allume le rétro-éclairage
    	Wire.write((byte)0x04); *//Ne pas afficher le curseur
    	Wire.endTransmission(); *//Ferme la connexion sur SDA et SCL
    }
     
    /* FONCTION ecrireLcd */
    void ecrireLcd(String texte, int positionEcran) {
     
    	//Initialisation de l'écran par I2C
    	Wire.begin(); *//Amorce la connection sur SDA et SCL
    	Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
    	Wire.write((byte)0x00); *//Assigne un null
    	Wire.write((byte)0x02); *//Placer le curseur
    	Wire.write(positionEcran); *//Sur l'écran
    	Wire.print(texte); *//Ecrire un texte
    	Wire.endTransmission(); *//Ferme la connexion sur SDA et SCL
    }
     
    /* FONCTION ecrireLcdChar */
    void ecrireLcdChar(char texte[32], int positionEcran) {
     
    	//Initialisation de l'écran par I2C
    	Wire.begin(); *//Amorce la connection sur SDA et SCL
    	Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
    	Wire.write((byte)0x00); *//Assigne un null
    	Wire.write((byte)0x02); *//Placer le curseur
    	Wire.write(positionEcran); *//Sur l'écran
    	Wire.write(texte); *//Ecrire un texte
    	Wire.endTransmission(); *//Ferme la connexion sur SDA et SCL
    }
     
    /* FONCTION clearLcd() */
    void clearLcd() {
     
    	//Initialisation de l'écran par I2C
    	Wire.begin(); *//Amorce la connection sur SDA et SCL
    	Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
    	Wire.write((byte)0x00); *//Assigne un null
    	Wire.write((byte)0x0C); *//Effacer l'écran
    	Wire.endTransmission(); *//Ferme la connexion sur SDA et SCL
    }
     
    /* FONCTION clearCol() */
    void clearCol(int col) {
    	//Effacer la colonne
    	Wire.begin(); *//Amorce la connection sur SDA et SCL
    	Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
    	Wire.write((byte)0x00); *//Assigne un null
    	Wire.write((byte)0x02); *//Placer le curseur
    	Wire.write(col); *//Sur l'écran
    	Wire.write((byte)0x11); *//Effacer l'écran
    	Wire.endTransmission(); *//Ferme la connexion sur SDA et SCL
    }
    J'aimerais bien en faire une classe. Pour ce faire, j'ai créer un répertoire dans les librairies. J'y ai collé deux fichiers, un LcdI2C.h et un LcdI2C.cpp. Mon .h ressemble à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef LcdI2C_h
    #define LcdI2C_h
     
    #include <Arduino.h>
    #include <Wire.h>
     
    class LcdI2C {
    	public:
    		LcdI2C();
     
    		void initLcd();
    };
     
    #endif
    Et mon .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
    20
    21
    22
     
    /*
     
    */
     
    #include "LcdI2C.h"
     
    //Constructeur
    LcdI2C::LcdI2C() {
    	//addrComponent = adresseLCD;
    }
     
    /* initLcd */
    void LcdI2C::initLcd() {
    	Wire.begin();	//Start bit
    	Wire.beginTransmission((byte)0x63); //Appel carte
    	Wire.write((byte)0x00);	//Null
    	Wire.write((byte)0x0C);	//Effacer l'écran
    	Wire.write((byte)0x13);	//Allumer le rétro éclairage
    	Wire.write((byte)0x04);	//Ne pas afficher le curseur
    	Wire.endTransmission();	//Fin de communication I2C
    }
    Enfin mon programme principal (vide pour le moment) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "LcdI2C.h"
     
    void setup() {
     
    }
     
    void loop() {
     
    }
    Vous allez me dire que jusque là, c'est très vide et pourtant; quand je compile, j'obtiens ce message d'erreur *:smiley-sweat:
    /home/alexandre/Install/arduino-1.0.3/libraries/LcdI2C/LcdI2C.cpp: In member function ‘void LcdI2C::initLcd()’:
    /home/alexandre/Install/arduino-1.0.3/libraries/LcdI2C/LcdI2C.cpp:14: error: ‘Wire’ was not declared in this scope
    Si je comprends bien, le chemin vers Wire.h n'est pas trouvé. J'ai pas vraiment trouver de solution à ce problème et pourtant, il faudra bien car sans ça impossible de mettre en classe !

    Voila, je m'en remet à vos commentaire, je vais d'abord résoudre ce problème avant de continuer mon code.
    Merci pour vos indications.

  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 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    vérifie tes include_path.
    Avec plus d'informations sur l'IDE utilisé par exemple, on pourrait être plus précis.
    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 régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Alors, les include_path sont correct. En effet dans les autres classes développés par Arduino, elles sont déclarés comme les miennes.

    Pour l'edi, j'utilise la version 1.0.3 nommé Arduino.

    En général je code sous geany, je réimporte dans l'edi Arduino avec lequel je compile.

    Par contre, phénomène intéressant, si je rajoute #include <Wire.h> à mon source, donc en dehors de mon .h et de mon .cpp, ça compile. Si je garde #include <Wire.h> dans mon source et que je le retire de mon .h ça compile plus !

    Donc, y a un truc qui me chipote un peu !!

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    essaye en compilant à la main: g++ -I/chemin/vers/arduino/include/ -L/chemin/vers/arduino/lib/ -l<ce qui va bien> LcdI2C.cpp -c en supposant que le .h soit à côté du .cpp
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    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 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Caxton Voir le message
    Par contre, phénomène intéressant, si je rajoute #include <Wire.h> à mon source, donc en dehors de mon .h et de mon .cpp, ça compile. Si je garde #include <Wire.h> dans mon source et que je le retire de mon .h ça compile plus !
    Ce qui me chipote c'est que je ne comprends absolument pas ce que tu apelles "ton source", puisque tu précises .h et .cpp à côté...

    Tu n'as à priori pas besoin d'inclure Wire.h dans le header mais uniquement dans l'implémentation. Tu n'utilises (dans le code que tu montres) aucune déclaration contenue dans Wire.h dans ton header.

    les include_path sont correct. En effet dans les autres classes développés par Arduino, elles sont déclarés comme les miennes.
    Des include_path déclarés dans des classes ?!? Parle-t-on de la même chose ?
    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.

Discussions similaires

  1. operator>> avec class
    Par maminova77 dans le forum C++
    Réponses: 4
    Dernier message: 25/04/2006, 18h47
  2. Boucle sur chaque div avec class= ....
    Par zevince dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/04/2006, 12h12
  3. [Upload] Problème pour gestion d'erreur avec class
    Par allserv dans le forum Langage
    Réponses: 2
    Dernier message: 27/12/2005, 13h00
  4. [debutant] affichage ds un JtextArea avec classes independan
    Par tony_big_guy dans le forum Composants
    Réponses: 3
    Dernier message: 27/11/2005, 23h04
  5. Heritage de classe avec classes internes
    Par Regis.C dans le forum Langage
    Réponses: 11
    Dernier message: 27/04/2005, 12h19

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