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
#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
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 '' used as declaration
Merci à celui qui aura la patience de se pencher sur mon cas désespéré.
Stéphane
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 '')
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)
#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 :
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 :
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".
#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?
#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:
#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
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 :
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.
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.
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()"
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?
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.)