Go Down

Topic: Impossible de créer une librairie (Read 4163 times) previous topic - next topic

stephanedetahiti

Bonjour,
Alors je suis désolé de poser cette question plus que basique mais je ne comprends pas la façon de créer une bibliotheque. Quand je récupère des .cpp et .h que je fais des copier coller dans l'IDE OK. Quand j'essaie de créer une structure plus que simple ça bug à la compilation. Je voudrais juste comprendre pourquoi la définition d'une classe d'une fonction qui ne fait rien échoue.

mon fichier TestClasse.h
Code: [Select]
#ifndef TestClasse
#define TestClasse     //Evite les inclusions multiples
#include "arduino.h"           //OBLIGATOIRE

class TestClasse
{
   private:
    //Méthodes et variables privées

   public:
     //nom de la fonction
     Test();         
   
};
#endif


Mon fichier TestClasse.cpp
Code: [Select]
#include "TestClasse.h"

TestClasse::Test()
{
    void Test()
    {};//Constructeur
}


Mon .ino
Code: [Select]
#include "TestClasse.h"

void setup()
{
    //Setup
}
void loop()
{
    //Loop
}


Code erreure:
In file included from sketch_jan29a.ino:1:
TestClasse.h:13: error: ISO C++ forbids declaration of 'Test' with no type
TestClasse.h:7: error: an anonymous struct cannot have function members
TestClasse.h:16: error: abstract declarator '<anonymous class>' used as declaration

Merci à celui qui aura la patience de se pencher sur mon cas désespéré.
Stéphane

B@tto

Tu dois explicitement déclarer les fonctions :

Code: [Select]
public:
    //nom de la fonction
    void Test();


et pour le .cpp :

Code: [Select]
#include "TestClasse.h"

TestClasse::Test()
{
 
}
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

stephanedetahiti

Alors je viens d'essayer. de rajouter le type void comme tu me l'as proposé au niveau déclaration public... Et ça ne fonctionne pas. Toujours erreure de compilation :
sketch_jan29a:4: error: new types may not be defined in a return type
sketch_jan29a.ino:4: note: (perhaps a semicolon is missing after the definition of '<anonymous class>')
sketch_jan29a:4: error: two or more data types in declaration of 'setup'



PS : la bibliotheque que j'essaye de créer et dans la racine du script (j'ai 3 onglets ouvert : .ino  .cpp et .h)

haifger

Y'a plusieurs soucis avec ton code, mais le principal c'est que tu utilises les mêmes identificateurs un peu partout pour des choses différentes...

Première chose, comme l'a noté B@tto, la méthode Test doit être typée, donc :
TestClasse.h :
Code: [Select]

   public:
     //nom de la fonction
     void Test();

et TestClasse.cpp :
Code: [Select]

#include "TestClasse.h"

void TestClasse::Test()
{
}


Le deuxième problème (le plus pervers) est là :
Code: [Select]

#ifndef TestClasse
#define TestClasse     //Evite les inclusions multiples

C'est certes une bonne idée d'éviter les inclusions multiples, mais là tu utilises le même identificateur que celui de la classe que tu va déclarer plus loin. Du coup TestClasse se trouve défini et vide, et le préprocesseur va le remplacer par "rien" dans tout ton code, ce qui va donner des trucs du genre :
Code: [Select]

class {
   private:
    //Méthodes et variables privées
   public:
     //nom de la fonction
     void Test();         
};

À partir de là, le compilateur ne comprends plus trop et t'envoie une bordée d'insultes à base de structures anonymes et déclarateurs abstraits.

En général pour ce genre de choses on utilise plutôt des trucs du genre :
Code: [Select]

#ifndef _TESTCLASS_H_
#define _TESTCLASS_H_

stephanedetahiti

Je suis pas à pas donc :
Mon onglet TestClasse.h  (qui défini le nom de mes différentes fonctions et variables). J'ai donc modifié le nom du "test de déclaration".

Code: [Select]

#ifndef _TESTCLASS_H_
#define _TESTCLASS_H_     //Evite les inclusions multiples

#include "Arduino.h"           

class TestClasse
{
  public:
    void Test();
  private:
    //Méthodes et variables privées
};
#endif


J'ai ensuite modifié l'onglet TestClass.cpp qui sert à indiqué ce que fait la fonction. La fonction Test en l'occurence qui ne fait rien donc type void. J'aurais pu mettre par ex: {pinMode (12,OUTPUT);}. J'ai toujours bon?
Code: [Select]

#include "TestClasse.h"

void TestClasse::Test()   // je cree la fonction Test de la classe TestClasse qui ne renvoie rien
{
}


Reste donc mon sketch_29jana.ino qui contient le programme avec ses 2 fonction setup et  loop. Je souhaite donc appeler la fonction test dans setup donc:
Code: [Select]

#include "TestClasse.h"
void setup()
{  TestClasse.test();   //j'appelle la fonction test
}
void loop()
{
}


Et là je dijoncte :
sketch_jan29a.ino: In function 'void setup()':
sketch_jan29a:5: error: expected unqualified-id before '.' token


B@tto

Essaye plutôt :

Code: [Select]
void setup()

TestClasse.Test();   
}
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

haifger

En supposant que n'essaie pas de créer une méthode static (ce dont je doute), tu dois d'abord créer une instance de la classe pour accéder à ses membres :
Code: [Select]

#include "TestClasse.h"
void setup()

  TestClass tc; 
  tc.test();
}
void loop()
{
}

stephanedetahiti

#7
Jan 30, 2014, 05:57 pm Last Edit: Jan 30, 2014, 06:23 pm by stephanedetahiti Reason: 1
Je viens de tester les 2 denières solution et ça ne fonctionne toujours pas. Est ce que la recopie du code chez vous fonctionne? C'est là que je vois que je n'ai pas pris le virage de la programmation objet il y a quelques années. :(

B@tto

Y'a une erreur dans le code de Haifger :

Code: [Select]
#include "TestClasse.h"

 TestClass tc;

void setup()
{  

 tc.Test();
}
void loop()
{
}
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

haifger


Y'a une erreur dans le code de Haifger :


Oulà, oui, y'en a même 2 en fait :~
Code: [Select]

#include "TestClasse.h"
void setup()

  TestClasse tc; 
  tc.Test();
}
void loop()
{
}

il manquait un e à la fin de TestClasse et tc.Test() avec un T majuscule...

@stephanedetahiti : « ça ne fonctionne toujours pas » n'est pas une bonne façon de décrire un problème, il faut au moins nous indiquer les messages d'erreur que tu obtiens si tu veux avoir des réponses précises.


stephanedetahiti

Ca marche enfin grace à vos conseils précieux. :)  Je commence à comprendre la philosophie des biblithèques Arduino.
Existe il une façon de créer une fonction qui serait hors du script.ino , mais qui pourrait y etre utilser sans etre ratachée à une instance de classe. C'est à dire être appelée comme lorsqu'elle est défini directement dans le script.

"MaFonction()" et non pas  "instancedeclasse.MaFonction()"


XavierMiller

Oui, bien évidemment !

Il suffit de définir ta fonction hors d'une classe. C'est le principe même du C.

stephanedetahiti

Donc par exemple je peux sortir toute mes fonctions crées dans un sketch.ino, les écrire/définir ailleurs et  les utiliser quand même; donc il est possible de creer des bibliotheque sans classe qui pourrait être réutilisr dans d'autre programme. C'est bien ça?
Concrétement je formalise ça comment?



XavierMiller

Tu déclares la "signature" de tes fonctions dans un .h, et tu définis le code de tes fonctions dans un .cpp

Vu tes questions et ton intérêt à la chose, je te conseille vivement de lire quelques tutos sur le C/C++

stephanedetahiti

Merci, pour toute ces réponses. J'y arrive :)
Allez une petite dernière :
Est ce qu'il est possible de déclarer une variable dans .h, et l'utiliser dans une méthode du .cpp et qu'elle soit accessible dans le sketch?

(Après effectivement je vais me pencher sur le c++. Il faut dire que j'ai découvert la programation il y a très très longtemps. Basic, assembleur et Turbo Pascal.)

Go Up