Go Down

Topic: Plusieurs fichiers (Read 1 time) previous topic - next topic

68tjs

Pour les inclusions de fichiers il y a deux syntaxes :  <...> et "....":

- si le fichier à inclure est dans le chemin de recherche de l'IDE  alors
#include <tatatata.h>

- si le fichier à inclure est dans le même répertoire que les fichiers sources alors :
#include "tatatata.h"

Touf2638

Oui c'est bien ce que j'ai fait. Dans mon Web.h j'ai mis <Ethernet.h> qui est sous le répertoire de l'IDE.
Dans mon programme principal j'ai mis "Web.h" qui est dans mon répertoire projet.
Mais de mon programme principal je n'accède pas à Ethernet.h. Ca marche par contre si je mets <Ethernet.h> direct dans mon programme principal.

Pour l'instant j'ai mis la partie Web en commentaire car je n'arrive pas à compiler du fait des fonctions qui ne sont pas trouvées dans Generation.h
Faut il mettre une syntaxe spéciale comme "extern" devant les prototypes de fonctions de mon .h ?

68tjs

Là j'ai atteint mes limites, je ne sais pas te répondre.

Touf2638

Et juste pour info, ca compile chez vous ? Où est ce un problème du à mon PC ?

skywodd

Bonjour,

Bon ... par où commencer ...
- l'ide arduino ne compile que des fichiers .cpp et .h, pas .c ou .hpp(oui c'est débile mais c'est comme ça)
- les fichiers headers ne sont pas "des poubelles à include", pas d'include dans un header sauf si c'est absolument nécessaire
- privilégie les types primitifs aux types "arduino" dans les fichiers .h , ça évite d'inclure Arduino.h (qui inclut plein d'autre trucs ...)
- les commentaires c'est bien mais l'ide arduino gère sont truc de manière assez tordu.
Pas de commentaire inutile pour séparer des fonctions, ..., garde juste les commentaires pertinents.
- si tu veut pouvoir inclure un .h avec une déclaration de structure/type/class/... ne met aucun commentaire avant, juste les includes en entête du fichier source
(si l'ide arduino voit un (ou plusieurs) include en début du .ino il met les prototypes de fonctions aprés)

Sinon globalement j'ai l'impression que tu cherches à faire un code découpé sur plusieurs fichiers, mais pas vraiment une librairie je me trompe ?
Faire un duo .h/.cpp c'est bien pour une librairie, sinon fait juste des .ino, l'ide arduino les fusionnes au .ino principal avant la compilation.
Ça t'éviterais d'avoir à faire des déclarations de variables globales "extern" ...

(j'étais parti à te corriger le code pour qu'au moins il compile, mais ça m'as lassé d'avoir à coller des extern à tour de bras ...)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Touf2638

Oulà je pensais pas que c'était si grave  :smiley-eek: :smiley-red:

Oui je voulais juste découper le code pour la lisibilité. Tu dis faire plusieurs .ino
Ca veut dire que je peux mettre des fonctions dans un autre .ino sans setup et sans loop, juste des fonctions ?
Et si je fais comme ça me conseille tu de garder les header pour les structures et les prototypes où de tout mettre dans les .ino
Sinon tu dis que les commentaires sont gérés de manière tordu donc le fait de mettre des //**********
peut provoquer des disfonctionnements ?
Merci pour toutes tes indications  :)

68tjs

#21
Feb 28, 2013, 08:39 pm Last Edit: Feb 28, 2013, 08:49 pm by 68tjs Reason: 1
Dans l'IDE tu peux ouvrir des onglets.
Pour nommer l'onglet il suffit d'indiquer un nom SANS l'extention .ino -> c'est l'IDE qui la mettra automatiquement.
L'IDE range les fichiers de la manière suivante : en premier le fichier créé au début du projet puis les onglets classés en ordre alphabétique.
A la compilation l'IDE concatène tous les onglets dans l'ordre où ils apparaissent c'est à dire dans l'ordre alphabétique.
Celà peut poser des problème si le fichier dans lequel tu as fait des déclarations de variables est concaténé à la fin.
Une astuce pour contourner ce mode de fonctionnement : préfacer les nom des onglets par une lettre :  
  A_declarations
  B_fonctions
ainsi c'est toi qui maîtrise l'ordre.

Le nom du fichier *.hex sera celui du projet.

Touf2638

Merci à tout les deux, je vais restructurer un peu tout ça alors.
Dernières questions:
Une variable globale est elle accessible de tout les onglets sans mettre extern ?
Et pour les includes si je comprends bien je les mets que dans un onglet !?

68tjs

Quote
Une variable globale est elle accessible de tout les onglets sans mettre extern ?
Et pour les includes si je comprends bien je les mets que dans un onglet !?


Oui à tout :  l'IDE concatène c'est à dire ajoute tous les fichiers des onglets les après les autres dans le fichier de base, celui que tu as créé avec le projet : -> Fichier -> nouveau -> enregistrer sous

Les onglets c'est juste une question de présentation, c'est un outil qui a pour but d'aider à la conception du programme parce que c'est plus facile de gérer 5 fichiers de 200 lignes qu'un seul de 1000 lignes.
Mais au final pour le compilateur c'est comme s'il n'existait qu'un seul et unique fichier.

Pour forcer le trait il est possible de s'organiser ainsi :
exemple.ino    -> Fichier -> nouveau -> enregistrer sous
A_Documentation   -> commentaires (Que fait le programme, sa licence , signification des variables etc  )
B_Declaration   -> les includes et les variables globales
C_setup        -> la fonction setup
D_loop          -> la fonction loop
E_autres_fonctions_1 appelées soit par setup() soit par loop()
F_autres_fonctions_2 appelées soit par setup() soit par loop()
G_autres_fonctions_2 appelées soit par setup() soit par loop()

C'est exagéré mais c'est pour bien comprendre comment fonctionne l'IDE : les fichiers sont concaténés dans l'ordre alphabétique. Il faut absolument que les includes et les variables globales soient définis avant le reste et que setup() qui ne s'exécute qu'une seule fois soit défini avant loop() qui est la boucle infinie.

Touf2638

Un grand grand merci  XD

Go Up