Partager son programme en plusiers fichiers

Bonjour,

Je suis confronté à faire un programme qui fait 2km de lignes de code.

J'aimerai séparer tout cela en 4 fichiers. J'aimerai avoir un fichier .h qui contient toutes mes variables et

mes prototypes et 3 fichiers qui contiennent chacun l'implémentation d'une fonction qui manipulent les

variables contenues dans le fichier .h.

Est-ce possible ?

Je vous remercie.

Bonjour,

akuma8:
Est-ce possible ?

Oui :wink:

icare:
Bonjour,Oui :wink:

Comment ?

Re,
Programme principal

#include "toto.h"

void setup(){
  parExemple();
}
void loop(){
}

Fichier toto.h

void parExemple(){
  //ton code
}

icare:
Fichier toto.h

void parExemple(){

//ton code
}

On peut implémenter ses fonctions dans le .h ?

Je ne savais pas, je vais essayer pour voir ce que ça donne.

Si ton problème c’est que ton programme est trop long et dur a suivre dans l’IDE Arduino, je suggère de changer d’IDE… Par exemple, Visual Micro.

Les .h ne contiennent que les déclarations de fonctions et de variable. Le code même et la définition des variables doivent être dans un .cpp.

Effectivement tu peux changer d'IDE mais heureusement il n'existe pas que du windows propriétaire (visual studio).
Il existe entre autre Netbeans, Code::Blocks et Eclipse qui sont multi plateforme et OpenSource.
Ces IDE généralistes utilisent un plugin pour supporter AVR-GCC ( un par IDE sinon ce serait trop simple).

A noter que leur utilisation n'est pas "strictement" nécessaire : l'IDE Arduino supporte lui aussi les fichiers *.c, *.h et *.cpp. Il lui faut obligatoirement un fichier *.ino mais pour le reste tu fait comme tu veux soit utiliser des fichiers *.c, *.cpp et *.h, soit utiliser d'autres fichiers *.ino.
Attention dans le cas de multiples fichiers *.ino, en fait ils sont mis bout à bout dans l'ordre alphabétique à la suite du fichier principal pour constituer 1 seul fichier pour la compilation -> si tu mets setup() dans le fichier "setup.ino" et loop() dans le fichier "loop.ino" "loop.ino" sera concaténé avant "setup.ino" et cela ne fonctionnera pas à la compilation.
Par contre si tu ruses et que tu choisis d'appeller le fichier contenant la fonction setup "A_setup " et celui contenant la fonction loop "B_loop.ino" tu force l'ordre de concaténation et cela ira bien.

Un point de vue très personnel et qui n'engage que moi : Eclipse est mon préféré . Cela parait plus compliqué à première vue que l'IDE arduino et il faut faire un effort personnel mais pour des gens qui comme moi ne maîtrisent pas bien le langage C/C++ les messages d'erreurs sont bien plus compréhenssibles et bien des erreurs sont détectées au moment même de la frappe, au final je gagne du temps.
Le lien que j'ai trouvé le plus clair : John Arrizza wiki
Ce n'est pas pour autant que je crache sur l'IDE arduino mal grès tout ses défauts pour faire un essais vite fait il n'y a pas mieux.

Pour ce qui est de la meilleure façon de procéder pour découper en fichiers *.h, *.c ou *.cpp ce n'est pas dans l'IDE que cela se passe mais dans ta tête. Un site comme Openclassrom a rendu de grands services à la mienne.

XavierMiller:
Les .h ne contiennent que les déclarations de fonctions et de variable. Le code même et la définition des variables doivent être dans un .cpp.

Je sais, mais j'aimerai éviter de créer 3 fichiers .h différents pour 3 .cpp ou .c .

Je veux juste créer un .h pour 3 .cpp et partager ses variables et ses prototypes.

En gros mon .h serait une ressource dans laquelle viendraient puiser mes 3 programmes, tout en changeant les

variables qui y sont contenues.

Mon problème n'est pas tant un problème d'IDE même si je viens de passer sous VIsual Micro qui m'a l'air très pratique.

Je testerai les autres IDE par la suite pour voir la différence.

Mon problème c'est faire un .h commun à plusieurs .cpp.

Dans un forum j'ai trouvé que c'était faisable mais juste entre plusieurs .ino

Dommage

akuma8:
Je sais, mais j'aimerai éviter de créer 3 fichiers .h différents pour 3 .cpp ou .c .
Je veux juste créer un .h pour 3 .cpp et partager ses variables et ses prototypes.

Remarque 1 : créer un fichier *.h par fichier *.c rendra la réutilisation des fichiers *.cpp plus simple.

Remarque 2 : réfléchis au sens des mots : #include "machin.h" cela veut dire que tu inclu dans ton fichier actuel le contenu du fichier machin.h. Pour le compilateur il n'y aura qu'un seul fichier : à la place de #include "machin.h" il y aura la liste des variables que tu aura déclaré.
Donc rien ne t'empèche de n'utiliser qu'un seul fichier *.h où tu aura déclaré l'ensemble des variables que l'ensemble des fichiers *.c nécessite.
Par contre en faisant ainsi tu peux te retrouver à déclarer dans un fichier *.c des variables que tu n'utilisera pas. Cela n'empèchera pas la compilation mais ce n'est pas sain. Et ce qui n'est pas sain est une source potentielle d'erreurs.

Je pense que les avantages de déclarer un fichier *.h par fichier *.c l'emportent largement sur les inconvénients.

Et si vraiment déclarer trop souvent plusieurs fichiers *.h te perturbe tu peux toujours écrire un fichier "super.h" qui comportera
#include "machin1.h"
#include "machin2.h"
#include "machin3.h"
etc
Mais encore une fois ce qui n'est pas sain est une source potentielle d'erreurs.

Remarque 3 :variables globales et multi-fichiers : il faut utiliser le mot clé "extern" -> plus de précision voir tuto C ou C++.

Bonjour,

68tjs:
Remarque 2 : réfléchis au sens des mots : #include "machin.h" cela veut dire que tu inclu dans ton fichier actuel le contenu du fichier machin.h. Pour le compilateur il n'y aura qu'un seul fichier : à la place de #include "machin.h" il y aura la liste des variables que tu aura déclaré.

C'était ça qui me manquait.

Je sais que l'idéal est d'avoir un .h pour un .cpp mais pour mon cas tous les programmes se partagent les mêmes variables ou presque.

Le principe est quand un programme a terminé, il autorise l'autre à pouvoir s'exécuter.

Voilà pourquoi certains voire beaucoup de mes variables sont globales.

Merci pour le détail de ta réponse :slight_smile: