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 :

Utilisation de fichiers « .cpp » et « .h »


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Hobby
    Inscrit en
    Août 2002
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Août 2002
    Messages : 125
    Points : 82
    Points
    82
    Par défaut Utilisation de fichiers « .cpp » et « .h »
    Bonjour à tous.

    Je ne parviens pas à utiliser la variable "lcd" dans le fichier "cpp" lié au fichier "monProgramme.ino" (environnement Arduino).
    Nota : LiquidCrystal() est un constructeur disponible sur le web (lien).
    Il est normal que le main() soit caché dans l'environnement d'Arduino !

    Fichier" monProgramme.ino"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <LiquidCrystal.h>
    #include "mesFonctions.h"
    LiquidCrystal lcd(7, 6, 5, 4, 3, 2); 
     
    void setup() {
    lcd.begin(16, 2);
    afficheMessage(); // Dans le fichier « .cpp ».
    }
     
    void loop() {
    }
    Fichier "mesFonctions.cpp"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "mesFonctions.h"
    extern LiquidCrystal lcd;
     
    void afficheMessage(){ 
        lcd.setCursor(0, 0); 
        lcd.print("Message");
    }
    Fichier "mesFonctions.h"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <LiquidCrystal.h>
    void afficheMessage();

    J'obtiens les erreurs suivantes :
    1. lorsque je ne mets pas "extern LiquidCrystal lcd;" dans le fichier "mesFonctions.cpp"
    mesFonctions.cpp: In function 'void afficheMessage()':
    mesFonctions.cpp:7: error: 'lcd' was not declared in this scope

    2. lorsque je mets "extern LiquidCrystal lcd;" dans le fichier "mesFonctions.cpp"
    mesFonctions.cpp.o: In function `afficheMessage()':
    mesFonctions.cpp:7: undefined reference to `lcd'
    mesFonctions.cpp:8: undefined reference to `lcd'


    Bloqué et pas moyen de trouver la solution malgré divers essais...
    Qui peut trouver la solution à ce problème ?

    Cordialement.

  2. #2
    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 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
    Je trouve cette écriture assez bizarre en dehors d'une fonction... C'est une écriture C++ ou typique Arduino ?

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
    Je trouve cette écriture assez bizarre en dehors d'une fonction... C'est une écriture C++ ou typique Arduino ?
    C'est légal en C++ (constructeur valué). Cela dit, c'est une instanciation globale.
    Je déplace du bon côté.

  4. #4
    Membre régulier
    Homme Profil pro
    Hobby
    Inscrit en
    Août 2002
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Août 2002
    Messages : 125
    Points : 82
    Points
    82
    Par défaut
    Bonjour,

    C'est normal. Le code utilisé pour programmer un Arduino est un mélange de C et de C++.
    LiquidCrystal() est un constructeur qui crée une variable de ce type (lien).
    Les valeurs entre les parenthèses correspondent aux pins connectées au LCD.

    L'exemple standard est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <LiquidCrystal.h>
     
    LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
     
    void setup()
    {
      lcd.begin(16,1);
      lcd.print("hello, world!");
    }
     
    void loop() {}
    Le problème semble venir du fait que le compilateur ne trouve pas la référence "lcd" alors qu'elle a été déclarée "extern".

    Cordialement.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    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 074
    Points : 12 120
    Points
    12 120
    Par défaut
    C'est pas le compilateur qui crie, c'est le linker.
    Avec ton extern "machin", t'as juste truandé le compilateur, mais le linker, on ne le blouse pas aussi facilement.

    La méthode standard (je ne connais pas Arduimachin), c'est de mettre l'externe dans le .h et un static dans le cpp.

  6. #6
    Membre régulier
    Homme Profil pro
    Hobby
    Inscrit en
    Août 2002
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Août 2002
    Messages : 125
    Points : 82
    Points
    82
    Par défaut
    Merci Bacelar,

    Ca ne fonctionne pas mieux pour autant.
    Je vais donc, à regrets, regrouper le code de cette fonction dans le fichier "monProgramme.ino" en attendant de trouver la solution.
    Les autres fonctions, que supprimées pour ce post, fonctionnent sans problème à partir du fichier ".cpp".

    Cordialement.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    On peut voir la séquence de commandes (compilation et link)? Pour savoir ce qui foire au link.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    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 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Ca ne fonctionne pas mieux pour autant.
    Mais encore ?
    C'est très probablement un autre message d'erreur.
    Si c'est le même, c'est que vous avez carrément oublié de mettre le résultat de compilation du cpp dans les fichiers d'entrées du linker.

  9. #9
    Membre régulier
    Homme Profil pro
    Hobby
    Inscrit en
    Août 2002
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Août 2002
    Messages : 125
    Points : 82
    Points
    82
    Par défaut
    Voilà ce qu'affiche le résultat de la compilation :
    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
    Compiling MonProgrammeLCD...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/MonProgrammeLCD.ino.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/mesFonctions.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/malloc.c.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/realloc.c.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/CDC.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/HID.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/HardwareSerial.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/IPAddress.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/Print.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/Stream.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/Tone.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/USBCore.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/WInterrupts.c.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/WMath.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/WString.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/main.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/new.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/wiring.c.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/wiring_analog.c.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/wiring_digital.c.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/wiring_pulse.c.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/wiring_shift.c.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/LiquidCrystal.cpp.o...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/core.a...
    Creating /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/MonProgrammeLCD.elf...
    /Users/HDM/Documents/Arduino_Build/MonProgrammeLCD/mesFonctions.cpp.o: In function `afficheMessage()':
    /Users/HDM/Desktop/MonProgrammeLCD/mesFonctions.cpp:7: undefined reference to `lcd'
    /Users/HDM/Desktop/MonProgrammeLCD/mesFonctions.cpp:7: undefined reference to `lcd'
    [Stino - Error 1]
    Cordialement.

  10. #10
    Membre régulier
    Homme Profil pro
    Hobby
    Inscrit en
    Août 2002
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Août 2002
    Messages : 125
    Points : 82
    Points
    82
    Par défaut
    J'ai relancé l'IDE et bizarrement il n'y a plus de message d'erreur...
    Merci pour votre aide.
    Cordialement.

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Il est possible, dans ce cas, que ce soit dû à un défaut de gestion des dépendances. Tu as modifié ton programme source mais, pour une raison ou une autre, l'IDE, le makefile ou d'une manière générale l'instance chargée de compiler le tout ne s'en est pas rendu compte. Si un précédente version de ton unité de compilation existe toujours sous forme de fichier objet quelque part, elle va continuer à être liée aux autres et, bien sûr, le linker ne trouvera pas la variable que tu as ajoutée récemment.

  12. #12
    Membre régulier
    Homme Profil pro
    Hobby
    Inscrit en
    Août 2002
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Août 2002
    Messages : 125
    Points : 82
    Points
    82
    Par défaut
    Merci Obsidian pour le suivi.

    J'ai également pensé à un défaut de sauvegarde du ou des fichiers avant la compilation, mais je prenais bien soin de sauvegarder tous les fichiers, y compris ceux non modifiés (commande "Save all...").

    Après de nombreux essais complémentaires, je suis arrivé à la constations suivante :
    - le programme a finalement été compilé avec succès pour une raison inconnue ; aucune ligne de code n'avait été modifiée entre temps.
    - un copier-coller de ces 3 fichiers (ino, cpp et h) dans une autre session ne permet plus la compilation du programme !

    J'ai trouvé la parade, qui semble fonctionner à chaque fois, en ajoutant, dans le fichier d'extension "h", la ligne suivante :
    #include <LiquidCrystal.h>

    Merci à tous pour vous être penchés sur mon problème.

    Cordialement.

  13. #13
    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
    Il y a souvent une commande "clean", qui permet justement de supprimer les intermédiaires de compilation.
    Cela peut aider dans ce genre de cas.

    Dans certains IDE, c'est plutot "rebuild" qui est proposé, c'est à dire "clean + build"
    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

Discussions similaires

  1. utiliser le langage C dans des fichiers cpp
    Par ikuzar dans le forum Débuter
    Réponses: 5
    Dernier message: 03/02/2011, 18h24
  2. [NASM] Utiliser des fichiers ressources
    Par trax44 dans le forum Assembleur
    Réponses: 8
    Dernier message: 26/09/2004, 18h42
  3. Utilisation de fichiers batch
    Par shifty.net dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 01/08/2004, 16h31
  4. [struts] utiliser plusieurs fichiers properties
    Par jaimepasteevy dans le forum Struts 1
    Réponses: 7
    Dernier message: 03/10/2003, 17h02
  5. [Turbo Pascal] Utiliser un fichier Excel
    Par Lady dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 09/03/2003, 20h34

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