Bonjour,
Je voudrais appeler une macro définie comme suit :
700 fois, sans devoir tapper les 700 lignes suivantes :Code:#define MACRO(i) /* corps de la macro */
Merci :)Code:
1
2
3
4
5 MACRO(1) MACRO(2) MACRO(3) .... MACRO(700)
Version imprimable
Bonjour,
Je voudrais appeler une macro définie comme suit :
700 fois, sans devoir tapper les 700 lignes suivantes :Code:#define MACRO(i) /* corps de la macro */
Merci :)Code:
1
2
3
4
5 MACRO(1) MACRO(2) MACRO(3) .... MACRO(700)
Ben un for
Avant qu'il demande comment on fait une boucle for, je me permets de lui répondre par avance :Citation:
Ben un for
Code:
1
2
3
4
5
6
7
8 #define NB_BOUCLE 700 [......] int i; for (i=0; i<NB_BOUCLE; i++) { MACRO(i); } [......]
Je pense que la question porte sur le preprocesseur, et je ne crois pas qu'on puisse faire une boucle "for" ou autre avec le preprocesseur...
Si si j'ai essayéCitation:
Envoyé par rigobert
Code:
1
2
3
4
5
6
7
8
9
10
11 #include <stdio.h> #define DUMP(x) printf ("%d\n", x) int main(void) { int i; for(i=0; i < 10; i++) DUMP(i); return 0; }
Ce que voulait dire Rigobert, c'est faire une boucle avec les instructions du préprocesseur, un truc du genre "#FOR.........". A mon avis ce genre de chose n'existe pas.
Effectivement en relisant, je pense qu'il voulait bien dire ca.Citation:
Envoyé par crocodilex
Un moyen de le faire c'est d'utiliser le preprocesseur template du C++ (si on a un compilo c++ sous la main) et de définir une fonction template récursive.
Perso j'ai essayé de le faire avec le prépro C (définir une macro récursive) mais j'ai pas trouvé de solution pour le moment.
Ecris les 10 lignes de C qui génèrent ce code...Citation:
Envoyé par glKabuto
euh ... la boucle for ça convient pas du tout. Si j'utilise des macros c'est pour qu'elles soient executées avant toute instruction ...Citation:
Envoyé par crocodilex
Oui c'est ça que je cherchaisCitation:
Envoyé par rigobert
J'y ai pensé mais je me demandais s'il y avait pas une méthode plus élégante.Citation:
Envoyé par Emmanuel Delahaye
Une autre solution est de crée un script qui te génère un fichier header contenant tes macros que tu lanceras avant la compilation. Si tu utilises un makefile, dans ce cas c'est très facile. Si c'est a partir d'un IDE, je sais qu'il existe des options style "PRE-COMPILE et POST-COMPILE" qui te permettent d'appeller des scripts (cf. doc de ton environnement de developpement).
Je pense que c'est effectivement la seule solution qui réponde strictement à la question telle qu'elle a été posée.Citation:
Envoyé par crocodilex
Mais une autre question à se poser est de savoir si ça en vaut vraiment la peine : si le code est simple, debuggé et qu'il a peu de chance d'évoluer significativement dans le futur, alors peut-être qu'un simple copier/coller de la macro conviendrait (en faisant éventuellement des macros imbriquées pour réduire le nombre total de lignes de code), plutôt que de transformer le build en usine à gaz.
Le code n'est pas simple, mais est debuggé et n'a aucune chance d'évoluer dans le futur. La macro que j'utilise fait deja appel a d'autres macro qui en appellent d'autres etc.Citation:
Envoyé par rigobert
Pour l'instant, en attendant de trouver mieux, j'ai choisi l'option des 700 lignes.
Merci pour vos réponses :)
Ca existe ^^Citation:
Envoyé par glKabuto
Ca s'appelle Emacs, et ça se fait en trois commandes ;-)
ps : ça fait du bien de dire des betises en français... :)
(attention, ca se fait vraiment en trois commande sous Emacs :P)
Quoi donc ? Générer les 700 lignes de code ? :oCitation:
Envoyé par Pouic
j'ai essayé une méthode toute simple:
Microsoft Excel
case A1: "MACRO("
case A2: "1"
case A3: ")"
ensuite j'ai séléctionné la case A1 et je l'ai "glissé" jusqu'à la A700 (ça copie tout)
idem pour A3
et pour A2, idem sauf qu'à la place de "copy cells" tu fais "fill serie"
ensuite: select all, copy, et paste dans le bloc notes.
et voila, tu as tes 700 lignes en 30 secondes!
C'est un peu tordu comme méthode ^^'
(Surtout que l'idée à la base c'était d'éviter d'avoir 700 lignes (quasi) identiques dans mon fichier .h)
et en 1 ligne de shell ( histoier de finir complement le HS )
Code:
1
2 for i in `seq 1 700`; do echo "MACRO($i)" >> fichier.h; done
T'as fais plus court que moi, j'avais pensé à :
suivi d'unCode:
1
2
3 for i in `seq 1 700` do echo "MACRO($i)" done
Code:gen_macro.sh >> fichier.h
... mais c'est on a toujours les 700 lignes dans le fichier .h :roll:
Boost/preprocessor permet de faire ça en C++.
En C je pense qu'il y a des équivalents.:roll: