Reprise de 'problème création librairie'

Bonjour à tous,

je reviens sur ce forum après avoir eu des problèmes avec la déclaration de variables dans des .h qui donnait des erreurs 'déjà déclaré'.

J'ai beaucoup testé différentes solutions parce que ce que faisait l'IDE et les erreurs qu'il donnait bousculait plus de 40 ans de certitudes !
A mon humble avis (et il faudrait le vérifier), les clause #ifndef ne fonctionnent pas parce que l'IDE copie les fichiers .h (et .cpp ?) dans d'autres répertoires pour lui faciliter les compilations (par exemple il n'y a pas d'édition de liens 'officielle' quand vous compilez, l'IDE la fait automatiquement et il faut qu'il trouve les bons fichiers quelque soit le type d'arduino utilisé). Une declaration #define dans un fichier n'est pas la même que la même déclaration #define dans un autre fichier.

J'ai trouvé que l'utilisation de librairies et l'utilisation de classes (programmation orientée objet) facilitait beaucoup les choses.

Dans le fichier gvc_constantes_globales.h (et le .cpp 'vide' associé), il n'y a que des déclarations de variables constantes globales et des déclarations de types. La petite classe en fin de fichier peut être supprimée (elle me sert juste pour les tests) mais notez que dans cette classe on peut mettre des propriétés public accessibles de partout dans le programme. Le fait que ces 2 fichiers soient dans un répertoire arduino_2024\carnet_croquis\libraries\gvc_constantes globales\ fait que le #include <gvc_constantes_globales.h> fonctionne parfaitement (euh du moins chez moi ... si vous pouviez me le confirmer !) sans création de doublons de déclaration.

Dans le fichier gvc_classe_eeprom.h il y a deux choses à noter :

  • J'essaie de voir si def_gvc_constantes_globales est défini (cad si le fichier gvc_constantes_globales.h est bien pris en compte) mais il n'y a pas de directive #message dans l'IDE !
    • J'y déclare et définit une classe qui contient des propriétés publiques accessibles de partout, des propriétés privées (j'aurai pu ajouter des propriétés protected : voir plus loin) et des méthodes (fonctions) publiques et privées. J'ai déclaré ces fonctions à l'intérieur de la classe : cela a normalement une conséquence importante : elles sont 'inline' et donc si on instancie plusieurs fois la classe, elles seront plusieurs fois en mémoire. Mais comme dans ma future application la classe ne sera instanciée qu'une seule fois, cela n'a pas d'importance et simplifie un peu la lisibilité. Normalement donc les méthoes sont déclarées à l'extérieur de la classe et ne sont de ce fait qu'une seul fois en mémoire même si on instancie plusieurs fois la classe.

La librairie gvc_communications est en cours d'écriture et ne mérite pas beaucoup d'attention pour l'instant.

La librairie gvc_2meres est interessante ! la classe gvc_2meres a deux mères (c'est un bienfait du C++ !): gvc_constantes_cst et classe_signal_eeprom. Le fait de mettre public dans la déclaration indique que la classe fille a accès aux propriétés private et protected des classes mères sans limitation supplémentaire.

Texte préformatéclass gvc_2meres : public gvc_constantes_cst, public classe_signal_eeprom

dans le .ino j'utilise une propriété propre à la classe gvc_2meres, une propriété de la classe gvc_constantes_cst et une de la classe classe_signal_eeprom. Donc mon application globale va être une classe avec plusieurs mères ce qui devrait faciliter la programmation !!

Après ces intenses réflexions (que je voudrais bien que vous vérifiez), je vais me reposer un peu ! :smiling_face_with_halo:
Bonne soirée à tous.
Jean

PS les fichiers joints sont à mettre dans des sous-répertoire du repertoire carnet_croquis\libraries\ :
carnet_croquis\libraries\gvc_constantes globales
carnet_croquis\libraries\gvc_classe_eeprom
carnet_croquis\libraries\gvc_2meres
test_librairie.ino (2,0 Ko)
gvc_classe_eeprom.cpp (706 Octets)
gvc_classe_eeprom.h (9,8 Ko)
gvc_constantes_globales.cpp (1,1 Ko)
gvc_constantes_globales.h (11,6 Ko)
gvc_communications.cpp (32,3 Ko)
gvc_communications.h (6,1 Ko)
gvc_2meres.cpp (348 Octets)
gvc_2meres.h (413 Octets)

Bonjour,

Les mêmes structures sont définies dans plusieurs fichiers .h
st_details_trame_commande_recue
st_details_trame_envoi_heure
...

Règle simple: en C ou C++ on declare les variables dans le .h (avec le mot clé extern) et on les définit dans le .cpp.

Un define a toujours comme portée le fichier qui le comporte. La compilation est séparée et il y a une édition de liens normale. Tout cela c’est du C++

Ce qu’il n’y a pas dans l’IDE cest un makefile. Sinon tous les .ino sont fusionnnés avant d’être compilés (et l’IDE essayé aussi de générer les prototypes des fonctions et copie tout dans un répertoire intermédiaire pour compiler (ce qui peut poser souci avec les chemins absolus des include).

Merci Kamill ! je ne m'en était même pas rendu compte !

Bonne soirée
Jean

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.