Inclure fichier cpp ?

Bonjour

La question peut paraître naïve, étant donné que le principe du C est de compiler séparément les fichiers, et d'utiliser des inclusions de .h pour résoudre la compilation avant édition de lien.

Néanmoins je me pose quand même la question : j'ai un programme arduino dont une partie du code source est générée par un autre programme. Ce dernier tourne sur mon PC et produit un fichier cpp qui n'est pas compilable seul.

Et bien sûr, le fichier ino sans la partie source générée en automatique ne peut pas compiler seul.

Actuellement, je procède manuellement par copier/coller pour inclure le source généré dans mon fichier .ino J'aimerais gérer cela de manière plus élégante.

Pour l'instant je n'ai que deux idées, mais je cherche mieux 1) faire en sorte que ma moulinette génère une vraie bibliothèque, avec .h et .cpp que le programme arduino puisse appeler de manière standard. Pas génial car la bibliothèque est à usage unique pour un seul programme, et ne peut être mutualisée de par son contenu. Et puis je risque d'être obligé d'y coller des déclarations extern pour accéder aux objets / fonctions du programme principal.

2) faire en sorte que la moulinette aille mettre à jour directement le fichier .ino

Une autre idée ?

L'idéal serait de pouvoir inclure des portions de code en précompil, à partir de fichiers externes, comme on peut le faire simplement dans d'autres langages de programmation. S'il y a un moyen simple de faire ça en C, je suis preneur !

Bonjour,

La solution 1 me parait être la bonne solution. Tu copies ton .h et ton .cpp dans le répertoire du fichier ino. Bien sur comme tu le dis ça peut demander d'inclure des déclarations extern pour accéder aux objets de l'autre source. C'est un peu contraignant, mais ça permet aussi d'améliorer le structuration et modularité de ses programmes et d'éviter de créer inutilement des variables globales.

3) tu peux aussi renommer ton .cpp en .h et faire un #include dans ton fichier .ino (il ne faut pas laisser l'extension .cpp car du moment qu'il est dans le répertoire du .ino, l'ide va essayer de le compiler).

Salut et merci, mais.... une AUTRE idée ? :D

Pour info : il s'agit d'un serveur web pour arduino sans carte SD.

Je développe les pages en dehors de l'arduino. Les fichiers html, css et images sont pris en entrée de ma moulinette, qui produit un source cpp où ces ressources sont chargées en flash via progmem, incluant également les fonctions d'analyse des demandes HTTP et assemblage des réponses.

Les images sont chargées en binaire.

Les css aussi, avec une étape préalable de compression où je supprime l'info inutile (commentaires dans le css, indentation, espaces, ...). Ce qui me permet de garder un source css propre tout en minimisant la flash occupée.

Les html sont compressés, et aussi segmentés : dans le source html, les parties variables (=données) sont mises avec une valeur d'exemple pour le dev, et repérées par des commentaires HTML spécifiques. La moulinette repère ces commentaires, segmente la page en plusieurs tableaux progmem, et produit une fonction d'envoi de la page dans laquelle les parties variables sont remplacées par un exit = appel à une fonction du programme principal, qui retourne la chaîne de caractères à insérer.

Dans le programme principal, il ne reste alors plus qu'à remplir les trous, c'est-à-dire coder les exits à partir des valeurs de variables globales.

Toute la partie générée a assez peu d'adhérence avec le hardware ethernet. Elle est par exemple facilement transposable entre un w5100 et un enc28j60, quelle que soit la lib utilisée pour gérer le hardware.

bricoleau: Salut et merci, mais.... une AUTRE idée ? :D

Et l'idée 3) c'est pas une autre idée?

Effectivement, si je peux implémenter entièrement des fonctions dans un .h, c’est peut-être la bonne solution.
Mais je ne pensais pas cela possible.

Si c'est possible, le préprocesseur se contente simplement de réintégrer tous les #include dans le fichier sans se préoccuper de ce qu'il y a dedans.

Hello,

Et si tu prenais ton option 1 à l'envers ? Au lieu de générer une librairie avec la partie variable, tu génères une librairie avec la partie commune. Lors de la génération du code, il "suffit" (tout est relatif) d'ajouter les bon appels à la librairie.

Tu te retrouves alors avec une générateur de programmes .ino qui font appel à des fonctions de librairie standardisées. Les principes du C sont respectés et tu ne nages plus à contre-courant... :)

C'est juste une idée...

Coyotte

Le problème c'est que ma partie variable est justement le contenu de mes fichiers .html et .css C'est là que je passe du temps en développement. Je teste le résultat en local avec un navigateur sur mon pc, et quand c'est ok c'est là que je dois envoyer le tout dans mon source arduino, "d'un simple clic".

kamill: Si c'est possible, le préprocesseur se contente simplement de réintégrer tous les #include dans le fichier sans se préoccuper de ce qu'il y a dedans.

Dans ce cas c'est parfait, j'ai ma solution. Merci