Plusieurs fichiers pour un projet (.h .cpp)

bonjour,
la question a été posé 100 fois, mais je galère:
J'ai un fichier principal, pleusieurs .h et plusieurs .cpp. Entre autre:
-fonction.cpp et fonction.h, avec les prototypes (ça c'est ok je crois)
-variables.cpp avec les variables: type var = x ;
-globales.h avec les defs des variables globales: extern type var ; (sinon fonction.cpp ne les trouve pas)
-et finalement je galère à faire reconnaitre mes #define dans un fichier define.h: soit il ne trouve pas les définitions, soit il me dit qu'elle sont déclarée deux fois (tous mes fichiers ont des #ifndef)

Je voulais simplifier la lecture et le travail sur mon code mais on peut légitimement se demander si c'est la meilleure solution?! Qu'en pensez-vous?

Bonjour
Que dire sans voir le code ?

Je ne pense pas qu'un découpage sous forme de fonction, variables, globales, define, soit une solution apte à simplifier.
Généralement on découpe de manière plus thématique.
Par exemple, mon projet d'arrosage automatique :
https://bitbucket.org/henri_bachetti/sprinkle-timer/src/master/arduino/sprinkle-timer/
Le découpage est fonctionnel :

  • configuration
  • RTC
  • capteur de débit
  • GUI
  • capteur d'humidité
  • vannes

Merci hbachetti,
je n'ai pas mis le code car c'est plus une question de principe.
Concernant le découpage thématique, effectivement ça semble plus logique: du coup chaque thème a ses variables et ses #define.
Toujours est-il que certaines variables/def doivent être accessibles dans plusieurs module...

Lesquelles ?

c'est un projet de timer évolué. J'ai par exemple une variable "temps", qui correspond au temps à afficher, en seconde. Elle doit être accessible par la partie qui gère les encodeurs qui règlent le temps, l'ISR du timer qui compte les seconde et y ajoute/soustrait les secondes écoulées, etc... De même que quelques #define, comme ceux qui lancent et arrêtent le compteur en fonction de plusieurs cause:

#define COMPTEUR_START   RTC.PITCTRLA = RTC_PERIOD_CYC32768_gc | RTC_PITEN_bm ; marche = 1  //initialiser le cycle à 1 seconde et activer le PIT
#define COMPTEUR_STOP    RTC.PITCTRLA = RTC_PERIOD_OFF_gc &~ RTC_PITEN_bm ; marche = 0     //désactiver le PIT et le cycle

Je ne vois pas où est la difficulté.
Il suffit d'inclure le .h où sont définies ces constantes dans les différents .cpp

Remarque : ces macros auraient avantage à être définies comme suit :

#define COMPTEUR_START()    RTC.PITCTRLA = RTC_PERIOD_CYC32768_gc | RTC_PITEN_bm; marche = 1;
#define COMPTEUR_STOP()    RTC.PITCTRLA = RTC_PERIOD_OFF_gc &~ RTC_PITEN_bm; marche = 0;
// et utilisées comme ceci
  COMPTEUR_START();

effectivement, après plusieurs tests ça fonctionne pour les #define, mais plus pour les variables, j'ai systématiquement l'erreur "multiple definition" ou "not declared in this scope", où que je les mette. Le seul moyen semble de les déclarer en extern dans variables.h puis de les définir dans variables.cpp, et ça c'est la partie un peu laborieuse...

Je pense que mon code n'est simplement pas pensé "bibliothèque" (je suis novice en C), par exemple les variables qui sont directement modifiées par des fonctions et les #define qui sont utilisés à la fois par des fonctions et par le programme principal.
Je réfléchirai mon code nativement au prochain projet, et je continue à parcourir mes >300 lignes pour celui-ci (vu ce qu'il me reste à faire je pense au moins doubler la taille du code).

[pourquoi les ()? puisque justement ce sont des macros?]

Effectivement, mais encore mieux

inline void compteur_start()    {RTC.PITCTRLA = RTC_PERIOD_CYC32768_gc | RTC_PITEN_bm; marche = 1;}
inline void compteur_stop()     {RTC.PITCTRLA = RTC_PERIOD_OFF_gc &~ RTC_PITEN_bm; marche = 0;}

Forcément. extern est fait pour cela.
Et le fichier variables.cpp doit inclure variables.h, pour que le compilateur puisse vérifier que les types correspondent.

Ces macros ne sont pas de simples valeurs, c'est du code. L'ajout de () les fait ressembler à un appel de fonction, ce qui est plus parlant.

Et comme dit kamill, ne pas oublier inline.

Ok merci!!!

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