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

Arduino Discussion :

Probleme librairie c++ pour arduino


Sujet :

Arduino

  1. #1
    Membre du Club

    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 40
    Points
    40
    Par défaut Probleme librairie c++ pour arduino
    Bonjour et bonne année à tous.

    j'ai écrit un petite bibliothèque pour mon Arduino. lorsque je mets, les fichiers .cpp et .h dans le répertoire de mon sketch, tout va bien. Mais lorsque je les installe en tant que librairie, j'ai une erreur de compilation, dont voici le texte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    C:\Users\pasca\AppData\Local\arduino\sketches\F72C5994B7661A9E78E69ECE879FBFB2\sketch\Tools.cpp.o (symbol from plugin):(.text+0x0): first defined here
    C:\Users\pasca\AppData\Local\arduino\sketches\F72C5994B7661A9E78E69ECE879FBFB2\libraries\Tools\Tools.cpp.o (symbol from plugin): In function `lcd':
    (.text+0x0): multiple definition of `Tools::spaces(int)'
    C:\Users\pasca\AppData\Local\arduino\sketches\F72C5994B7661A9E78E69ECE879FBFB2\sketch\Tools.cpp.o (symbol from plugin):(.text+0x0): first defined here
    C:\Users\pasca\AppData\Local\arduino\sketches\F72C5994B7661A9E78E69ECE879FBFB2\libraries\Tools\Tools.cpp.o (symbol from plugin): In function `lcd':
    (.text+0x0): multiple definition of `Tools::cls()'
    C:\Users\pasca\AppData\Local\arduino\sketches\F72C5994B7661A9E78E69ECE879FBFB2\sketch\Tools.cpp.o (symbol from plugin):(.text+0x0): first defined here
    C:\Users\pasca\AppData\Local\arduino\sketches\F72C5994B7661A9E78E69ECE879FBFB2\libraries\Tools\Tools.cpp.o (symbol from plugin): In function `lcd':
    (.text+0x0): multiple definition of `Tools::erase()'
    C:\Users\pasca\AppData\Local\arduino\sketches\F72C5994B7661A9E78E69ECE879FBFB2\sketch\Tools.cpp.o (symbol from plugin):(.text+0x0): first defined here
    collect2.exe: error: ld returned 1 exit status
     
    exit status 1
    je ne comprends pas pourquoi...

    Voici une partie de ma déclaration dans le fichier .h

    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
    class Tools
    {
     
    public:
     
      void setup();
      void cls();
      void erase();
      String spaces(int nombreEspaces);
      void writeln(String nouvelleLigne);
      void write(String ajouterALaDerniereLigne);
    //  void write(bool booleen);
      void write(byte octet);
      void write(char caractere);
      void write(double flottantDoublePrecision);
    //  void write(float Flottant);
      void write(int entier);
      void write(long entierLong);
    private:
       bool   flagWrite;   
       String ligne[nombreLignes];
       String tamponLigne;
    };
    Si vous pouviez m'éclairer, ce serait vraiment sympa. Je ne suis pas un pro du c++, je débute alors soyez indulgents.

    Merci

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 849
    Points : 5 763
    Points
    5 763
    Par défaut
    Peut être vous avez un souci de déclaration double. Le .h devrait ressembler à cela avec une garde contre la double importation

    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 TOOLS_H
    #define TOOLS_H
     
    class Tools {
      public:
        // Constructeur
        Tools();
     
        // Méthodes ...
        void xxx();
    };
     
    #endif
    et le .cpp serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include "Tools.h"
    #include "Arduino.h"
     
    // Constructeur
    Tools::Tools() {
      // ...
    }
     
    // Méthodes
    void Tools::xxx() {
      // ...
    }

    votre .ino serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include "Tools.h"
     
    void setup() {}
    void loop() {}

  3. #3
    Membre du Club

    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 40
    Points
    40
    Par défaut Problème de surcharge
    Bonsoir à tous,

    finalement, j'ai hérité de l'objet que j'utilisais : LiquidCrystal_I2C. Mais je me trouve face à un gros problème, j'utilise deux méthodes 'write' ou 'writeln' où j'écris des chaines de caractères. Mais impossible de définir plusieurs méthodes portant le même nom avec un paramètre diffèrent plutôt qu'une chaine, un entier, un booléen, un flottant, mais rien n'y fait. Comme je débute en c++, la partie du code permettant d'afficher une chaine fonctionne très bien et fais ce que je lui demande mais j'ai été obligé de mettre en commentaire mes autres méthodes.
    Pouvez vous m'aider à résoudre mon problème ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 527
    Points : 737
    Points
    737
    Par défaut
    Bonjour,
    Citation Envoyé par herrflick13 Voir le message
    Mais impossible de définir plusieurs méthodes portant le même nom avec un paramètre diffèrent plutôt qu'une chaine, un entier, un booléen, un flottant, mais rien n'y fait.
    Ce n'est pas normal, car le C++ l'autorise.
    Il faudrait voir le code complet de la classe ainsi que les messages d'erreur.

  5. #5
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 849
    Points : 5 763
    Points
    5 763
    Par défaut
    oui il faut poster le code là - vous avez dû rater une étape.

  6. #6
    Membre du Club

    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 40
    Points
    40
    Par défaut probleme d'initialisation de mon tableau
    j'ai un problème d'initialisation de mon tableau, voici la partie du code :

    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
     
    class Tools : public LiquidCrystal_I2C {
    private:
     
      bool   flagWrite;   
      // String ligne[nombreLignes];
      char** ligne;
      String tamponLigne;
      void _write(String value);      
      uint8_t nombreLignes;
      uint8_t nombreColonnes;    
     
    public:
      // Constructeur     
      Tools(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows) : LiquidCrystal_I2C(lcd_Addr,lcd_cols,lcd_rows) {
        ligne = new char*[lcd_rows];
        for (int i = 0; i < lcd_rows; i++)  ligne[i] = new char*[lcd_cols];
        nombreLignes = lcd_cols;
        nombreColonnes = lcd_rows;    
      };
    le but est de créer un tableau de chaine de caractères fixe dépendant des paramètres du constructor.

    Si vous pouviez m'éclairer, ce serait vraiment sympa. Je débute en C++, alors un peu d'indulgence s'il vous plait. Merci.

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 849
    Points : 5 763
    Points
    5 763
    Par défaut
    on pourrait faire un truc comme cela sans doute (ne pas oublier le destructeur pour ne pas avoir de fuite mémoire)

    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
     
    class Tools : public LiquidCrystal_I2C {
    private:
        uint8_t nombreLignes;
        uint8_t nombreColonnes;
        char** lignes;  // Tableau dynamique de chaînes de caractères
     
    public:
        Tools(uint8_t lcd_Addr, uint8_t lcd_cols, uint8_t lcd_rows) 
            : LiquidCrystal_I2C(lcd_Addr, lcd_cols, lcd_rows), nombreLignes(lcd_rows), nombreColonnes(lcd_cols) {
            lignes = new char*[nombreLignes];
            for (uint8_t i = 0; i < nombreLignes; ++i) {
                lignes[i] = new char[nombreColonnes + 1]; // +1 pour le caractère nul de fin de chaîne
            }
        }
     
        // Destructeur pour libérer la mémoire allouée
        ~Tools() {
            for (uint8_t i = 0; i < nombreLignes; ++i) {
                delete[] lignes[i];
            }
            delete[] lignes;
        }
    };

    mais on pourrait aussi utiliser un template C++ ou la classe est paramètrée par les dimension du LCD ce qui permet de créer un tableau en 2D avec ces valeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    template <uint8_t nombreLignes, uint8_t nombreColonnes>
    class Tools : public LiquidCrystal_I2C {
      private:
        char lignes[nombreLignes][nombreColonnes + 1];  // Tableau 2D statique de chaînes de caractères
     
      public:
        Tools(uint8_t lcd_Addr)
          : LiquidCrystal_I2C(lcd_Addr, nombreColonnes, nombreLignes) {}
    };
    c'est quand même plus simple

  8. #8
    Membre du Club

    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 40
    Points
    40
    Par défaut
    Merci pour ton aide, ça passe maintenant à la compilation, mais je ne sais pas comment affecter une valeur a l'une des lignes du tableau :

    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
     
    class Tools : public LiquidCrystal_I2C {
    private:
     
      bool   flagWrite;   
      // String ligne[nombreLignes];
      char** ligne;
      String tamponLigne;
      void _write(String value);      
      uint8_t nombreLignes;
      uint8_t nombreColonnes;    
     
    public:
      // Constructeur     
      Tools(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows) : LiquidCrystal_I2C(lcd_Addr,lcd_cols,lcd_rows) {
        ligne = new char*[lcd_rows];
        for (uint8_t i = 0; i < lcd_rows; i++)  ligne[i] = new char[lcd_cols  + 1];
        nombreLignes = lcd_cols;
        nombreColonnes = lcd_rows;    
      };
    voici la méthode d'initialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void Tools::cls() {
      //flagWrite = true;  
     
      for (int i = 0;i < nombreLignes; i++) ligne[i] = "\0";
     
      setCursor(0,0);
     
      print(spaces(nombreLignes * nombreColonnes));
     
      setCursor(0,nombreLignes);
    }
    et l'erreur :

    C:\Users\pasca\Documents\Arduino\Writeln_LCD\Tools.cpp: In member function 'void Tools::cls()':
    C:\Users\pasca\Documents\Arduino\Writeln_LCD\Tools.cpp:16:51: error: expected primary-expression before '=' token
    for (int i = 0;i < nombreLignes; i++) ligne[i]* = "\0";

  9. #9
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 527
    Points : 737
    Points
    737
    Par défaut
    Citation Envoyé par herrflick13 Voir le message
    j'ai un problème d'initialisation de mon tableau, voici la partie du code :
    Quel problème?
    A la compilation?
    A l'exécution?

  10. #10
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 527
    Points : 737
    Points
    737
    Par défaut
    A mince, je n'avais pas rafraichi la page et vu ton dernier message.

    Le problème est qu'on ne peut pas affecter une "C string" dans une autre:
    est donc impossible.

    Pour copier une chaine, il faut utiliser la fonction "strncpy"

  11. #11
    Membre du Club

    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 40
    Points
    40
    Par défaut Probleme de parametre d'une fonction
    Bonsoir,

    j'ai un nouveau problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void Tools::writeln(char* nouvelleLigne)
    avec le message d'erreur :

    C:\Users\pasca\Documents\Arduino\Writeln_LCD\Tools.h:48:37: warning: ISO C++ forbids declaration of 'writeln' with no type [-fpermissive]
    Tools::writeln(char* nouvelleLigne);


    pouvez vous m'éclairer, s'il vous plait ?

    Merci

  12. #12
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 527
    Points : 737
    Points
    737
    Par défaut
    Tu nous montres l'entête de la définition de la fonction alors que le compilateur parle d'un problème dans la déclarationde writeln, qui se trouve à priori dans le fichier d'entête (.h).
    Tu n'aurais pas oublié le "void" dans la déclaration de writeln?

  13. #13
    Membre du Club

    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 40
    Points
    40
    Par défaut Bien vue mais j'ai encore un warning
    Merci pour ton aide

    le void ajouté il me donne un warning :

    In file included from C:\Users\pasca\Documents\Arduino\Writeln_LCD\Tools.cpp:11:0:
    C:\Users\pasca\Documents\Arduino\Writeln_LCD\Tools.h:48:8: warning: extra qualification 'Tools::' on member 'writeln' [-fpermissive]
    void Tools::writeln(char* nouvelleLigne);


    une idée ? Merci

  14. #14
    Membre du Club

    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2024
    Messages : 20
    Points : 40
    Points
    40
    Par défaut ce probleme est résolu
    j'avais laisser Tools:: dans le fichier .h, je continue et je vous tiens au courant,

    Merci de tout cœur à tous, ça ne fait que quelques jours que je programme en C,

    j'ai une fonction write qui est surchargée et la fonction principale s'appelle _write, on m'a dit que je ne respectais pas les recommandations pour le c++. Comment devrais-je nommer cette méthode ?

  15. #15
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 527
    Points : 737
    Points
    737
    Par défaut
    Citation Envoyé par herrflick13 Voir le message
    j'avais laisser Tools:: dans le fichier .h, je continue et je vous tiens au courant
    C'est bon du coup?
    j'ai une fonction write qui est surchargée et la fonction principale s'appelle _write, on m'a dit que je ne respectais pas les recommandations pour le c++. Comment devrais-je nommer cette méthode ?
    Je ne comprends pas trop: qu'appelles-tu une fonction principale?
    Le problème avec write, c'est qu'elle appartient déjà aux bibliothèques classiques du C/C++. Mais si cette fonction write appartient à une classe que tu as créée, aucun problème de te créer une fonction membre qui s'appelle write et de la surcharger.

Discussions similaires

  1. Visual Studio Code pour Arduino - Librairies non lues
    Par mormic dans le forum Visual Studio
    Réponses: 0
    Dernier message: 27/09/2022, 16h43
  2. [Python 3.X] Probleme encodage pour arduino
    Par fennec62 dans le forum Général Python
    Réponses: 0
    Dernier message: 12/02/2019, 20h37
  3. Probleme de compilation : librairie OT pour thread absente?
    Par Valkirion dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 18/04/2007, 12h07
  4. Problème unit CRT pour Faire du Pascal avec Delphi
    Par alexmorel dans le forum Débuter
    Réponses: 4
    Dernier message: 01/06/2004, 18h13
  5. Réponses: 5
    Dernier message: 27/08/2003, 12h45

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