un fichier cpp, 2 compilateurs (g++ et avr-g++) [résolu] - C++ - Programmation
Marsh Posté le 09-05-2013 à 13:42:52
natha31 a écrit : Bonjour.
|
Bonjour !
Pour faire propre, je vous propose deux possibilités, qui correspondent à ce que l'on rencontre le plus souvent :
* Des directives de précompilation
Code :
|
Et vous compilez la partie g++ avec l'option -DSIMULATEUR
* Des fichiers séparés pour les codes spécifiques (ce que fait Qt, par exemple) :
Fichier gestionled.cpp
Code :
|
Fichier gestionled_hard.cpp
Code :
|
Fichier gestionled_simu.cpp
Code :
|
A titre personnel, je préfère la deuxième solution, qui est aussi plus lisible si vous utilisez plusieurs plates-formes en plus du code de simulation, mais c'est une affaire de goût.
Bonne continuation !
Marsh Posté le 09-05-2013 à 16:31:35
ouah super ! !
Merci merci beaucoup !
Pour une solution ou l'autre, je verrais à l'usage.
La 2ème solution me parait en effet plus lisible, mais dans les cas ou la fonction ne fait qu'une ligne par exemple, je préférais la 1ere solution pour éviter d'avoir des fichiers en pagaille.
Du coup pour la 2ème solution, je suppose qu'il suffit d'ajouter les fichiers hard ou simu à la compil ?
genre (en simplifiant la commande de compilation) :
Code :
|
Natha
Marsh Posté le 09-05-2013 à 16:44:49
Tout à fait ! Je ne l'ai pas précisé dans mon message précédent, mais c'est bien le cas, la liste des fichiers à compiler dépend alors de la plate-forme.
Bon courage !
Edit : après réflexion, la deuxième solution me paraît plus intéressante aussi car elle permet de mieux séparer les couches "métier" des couches "drivers", qui attaquent le matériel (ou l'interface du simulateur).
Marsh Posté le 09-05-2013 à 23:27:23
Ok, par conte du coup je ne comprends pas trop comment faire mon #include dans mon gestionled.cpp, vu que le nom change...
Est-ce que je peux faire ça ?
Code :
|
Marsh Posté le 10-05-2013 à 00:27:29
Tout à fait !
En revanche, les fonctions et structures d'interface devraient être les mêmes, non ? (Ou alors j'ai raté quelque chose ).
Les fonctions et structures spécifiques peuvent être déclarées dans des fichiers inclus uniquement par les .cpp spécifiques, cela permet de n'avoir que du commun dans la partie "métier".
Marsh Posté le 10-05-2013 à 10:47:44
Citation : En revanche, les fonctions et structures d'interface devraient être les mêmes, non ? |
Pas compris, tu peux détailler ou donner un exemple?
Citation : Les fonctions et structures spécifiques peuvent être déclarées dans des fichiers inclus uniquement par les .cpp spécifiques |
Pas compris non plus...
Marsh Posté le 10-05-2013 à 11:23:37
Dans l'exemple que vous avez donnée, les fonctions d'interface entre la couche métier et la couche driver sont les mêmes : led_on() et led_off().
De la même façon, on pourrait imaginer que les structures (par exemple des paramètres) soient les mêmes aussi, que le programme utilise les drivers matériels ou le simulateur.
Pour moi, dans le code commun (métier), on ne doit jamais se poser la question de savoir si on appelle une fonction driver du matériel cible ou celle du simulateur, on appelle simplement une fonction driver dont la signature est la même quel que soit le "matériel" derrière.
Donc, partant de là, au niveau du code commun, on n'a pas à avoir de #ifdef SIMULATEUR ou autres choses du genre.
En revanche, dans le code spécifique du matériel cible, par exemple, on peut avoir besoin de définir un type de structure partagé entre plusieurs fichiers .cpp du matériel. Ce type de structure serait alors décrit dans un fichier .h spécifique au matériel considéré et inclus uniquement par les .cpp de gestion de ce matériel (marche aussi pour la définition des IHM pour la partie "simulateur", par exemple).
J'espère avoir été clair, sinon, ce n'est pas bien grave non plus, cela ne remet pas en cause le principe
Bonne continuation !
Marsh Posté le 10-05-2013 à 18:53:09
Citation : Pour moi, dans le code commun (métier), on ne doit jamais se poser la question de savoir si on appelle une fonction driver du matériel cible ou celle du simulateur, on appelle simplement une fonction driver dont la signature est la même quel que soit le "matériel" derrière. |
Oui tout à fait, sauf pour le #include comme je disais.
Citation : En revanche, dans le code spécifique du matériel cible, par exemple, on peut avoir besoin de définir un type de structure partagé entre plusieurs fichiers .cpp du matériel. Ce type de structure serait alors décrit dans un fichier .h spécifique au matériel considéré et inclus uniquement par les .cpp de gestion de ce matériel (marche aussi pour la définition des IHM pour la partie "simulateur", par exemple). |
Ok j'ai compris. Le fichier gestionled_hard.cpp peut appeler par exemple un fichier io.h qui gère les entrées/sorties de la puce, lequel peut éventuelleemnt être appelé par d'autres fichiers (gestioncapteur_hard.cpp, gestionmoteur_hard.cpp, ...)
J'aime bien parler par exemples .
Marsh Posté le 10-05-2013 à 21:57:52
C'est exactement ça pour le deuxième point, le fichier "io.h", qui est spécifique au matériel n'est appelé que par des fichiers *_hard.cpp, mais que les codes communs ou du simulateur n'ont pas à utiliser.
En revanche, pour le premier, je ne vois pas quelles pourraient être les différences entre gestionled_simu.h et gestionled_hard.h, en tous cas les différences que gestionled.cpp a besoin de connaitre.
Mais c'est du pinaillage / de l'intégrisme, je vous l'accorde
Marsh Posté le 12-05-2013 à 04:29:35
Citation : En revanche, pour le premier, je ne vois pas quelles pourraient être les différences entre gestionled_simu.h et gestionled_hard.h, en tous cas les différences que gestionled.cpp a besoin de connaitre. |
En effet, excellente remarque !
gestionled_simu.h et gestionled_hard.h sont identiques ce sont les .cpp qui changent.
Du coup pas besoin du #ifdef SIMULATEUR, ce ne sera que le nom du fichier que l'on va changer à la compilation.
Citation : Mais c'est du pinaillage / de l'intégrisme, je vous l'accorde |
Comme quoi ça peut parfois être utile, ça m'a permis d'avancer dans mon raisonnement.
Merci beaucoup Farian en tout cas !
Marsh Posté le 12-05-2013 à 04:31:59
Cela me parait plus cohérent comme ça
Bonne continuation à vous et amusez-vous bien !
Marsh Posté le 13-05-2013 à 20:48:21
Juste pour compléter, si tu fais de l'objet tu peux aussi faire ça avec l'héritage :
Code :
|
Et tu instancie tes classes avec une Factory. Ca peut être intéressant si ton code est déjà object avec beaucoup de code commun.. Après chacun choisi ce qui est le mieux adapté ^^
Après je sais pas comment tu compiles, mais passer par un générateur de Makefile type CMake ou SCons peut te faciliter la tâche pour créer plusieurs targets directement en fonction du compilateur, etc, etc
Marsh Posté le 09-05-2013 à 13:14:11
Bonjour.
À mes heures perdues je programme des microprocesseurs AVR en C++ pour des applications robotiques.
Pour mon dernier projet j'aimerais faire un petit simulateur sur PC en C++ également.
Comme ces 2 programmes sont écrits en C++, il y a beaucoup de code qui est un commun pour la puce est pour le simulateur.
Je voudrais donc compiler le programme destiné au microprocesseur 2 fois, avec 2 compilateurs différents :
- une fois pour la puce avec avr-g++
- une fois pour le simulateur avec g++
Il y aurait donc une partie du code qui est commune, qui appelle des fonctions destinées soit à g++ soit à avr-g++.
Exemple de 'code' qui permet de faire clignoter une led (pour simplifier je ne traite pas les pauses) :
Le compilo 'choisirait' ensuite la fonction qui lui convient.
Je ne sais pas trop comment m'y prendre...
Nathanaël
Message édité par natha31 le 12-05-2013 à 20:33:23