[C-preprocessor] L'inverse d'une fonction variadique

L'inverse d'une fonction variadique [C-preprocessor] - C - Programmation

Marsh Posté le 13-09-2007 à 04:33:52    

Salut a tous les afficionados de C et les maitres du preprocesseur!
 
Ok, donc j'ai un fichier qu'on va appeler timer.c qui contient un main et qui, caricaturalement, alloue de la memoire, lance un timer, lance une fonction avec pour argument des pointeurs venant du malloc d'avant, stoppe et affiche le timer. La fonction en question est decrite dans un autre fichier, mettons fonction.c. Jusque la, rien de bien excitant.
 
Maintenant, le truc qui fait mal, c'est que j'ai pleins de fonction.c differents qui contienne des fonctions qui ont le meme nom mais pas la meme signature et je veux avoir un timer.c qui puisse les gerer tous.  
 
Donc, pour resumer, je veux le meme code pour timer.c qui puisse linker avec fonction1.c et fonction2.c ci-dessous.
 
timer.c main{
a=malloc()
b=malloc()
...
start time
fonction(a,b,...)
stop time
}
 
fonction1.c {
void fonction(int[4],int[5])
}
 
fonction2.c {
void fonction(int[2],int[5],int[6])
}
 
 
En verite, les fonction.c sont autogeneres par un autre programme donc j'en ai une infinite de differents et ils ont vraiment tous des signatures differentes. Par contre, j'aimerais bien ecrire un unique timer qui les gere tous.
 
Bref, pour faire tout ca, il me faut definir quelques define dans les fonctions.c ce qui n'est pas un probleme, ca pourrait etre comme ca par exemple pour fonction2.c:
 
#define NUM_ARGS 3
#define TYPE_ARG_1 int
#define SIZE_ARG_1 2
#define TYPE_ARG_2 int
#define SIZE_ARG_2 5
#define TYPE_ARG_3 int
#define SIZE_ARG_3 6
 
bon, maintenant que j'ai ca, comment je fais pour l'appeler depuis timer.c??? En supposant que je puisse reconstruire la liste d'arguments (ce qui est deja pas gagne), il me faudrait faire un truc du genre
apply(fonction,[arg1,arg2,arg3]) qui appelle fonction avec arg1,arg2 et arg3 comme arguments
bref, c'est l'inverse d'une fonction variadique: "j'ai besoin d'appeler une fois une fonction qui peut etre definie de plusieurs maniere" alors qu'une fonction variadique a besoin de definir une fois une fonction qui peut etre appelee de plusieurs maniere.
 
Merci pour votre connaissance infinie ;)
 
Fred


Message édité par Cytoplasm le 13-09-2007 à 04:34:20
Reply

Marsh Posté le 13-09-2007 à 04:33:52   

Reply

Marsh Posté le 13-09-2007 à 09:22:20    

C'est strictement impossible, tu ne pourra jamais linker un objet avec deux objets qui définissent deux fonctions de même nom.
 
La seul raison qui fait que c'est possible en C++, c'est que le compilo C++ génère ("mangle" ) lui-même des noms qui contiennent sous forme codée la description du type des arguments.

Reply

Marsh Posté le 13-09-2007 à 16:26:04    

Ahah, petite precision utile : je ne veux pas tous les linker en meme temps. Juste un a la fois.

Reply

Marsh Posté le 13-09-2007 à 17:03:00    

mais par contre tu ne veux compiler qu'une seule fois si j'ai bien compris ?


---------------
TriScale innov
Reply

Marsh Posté le 13-09-2007 à 17:11:22    

merci les gars, toujours les memes ;)
 
en fait, tu compiles a chaque fois un couple timer.c/fonction.c ce qui te donne un executable pour chaque fonction.c

Reply

Marsh Posté le 13-09-2007 à 18:46:38    

Si tu peux recompiler à chaque fois timer.c, tu dois pouvoir t'en sortir à coup de macros bien crades.
 
Mais c'est quand même à min avis un design un peu bizarre. Sachant que tu génères toi même le code des fichiers fonctionN.[ch], pourquoi ne génères-tu pas en même temps le code permettant de les appeler ?
 
Genre :
 
fonctionN.c

Code :
  1. void test_fonction ()
  2. {
  3.   int *a = malloc (/*...*/)
  4.   int *b = malloc (/*...*/)
  5.   fonction (a, b);
  6. }
  7. void fonction (int *a, int *b)
  8. {
  9.   /* ... */
  10. }


 
timer.c

Code :
  1. void test_fonction ();
  2. void timer ()
  3. {
  4.   start_timer ();
  5.   test_fonction ();
  6.   stop_timer ();
  7. }


 
C'est devenu beaucoup plus simple parce que le code spécifique à ta fonction est déporté au même endroit que là où elle est définie.
 
[edit]

Cytoplasm a écrit :

merci les gars, toujours les memes ;)

J'avais pas fait gaffe que c'était encore toi...


Message édité par franceso le 13-09-2007 à 18:47:35

---------------
TriScale innov
Reply

Marsh Posté le 13-09-2007 à 19:31:33    

Yo, je t'accorde que ce serait plus simple si on pouvait faire comme tu dis. En fait, c'est tellement simple que j'y avais deja pense moi-meme. En fait c'est tellement simple que ca marche presque comme ca a l'heure actuelle
 
Bon, maintenant le probleme avec ca c'est que les codes en questions tournent tres tres rapidemment (nanosecondes) et que donc il est impossible de faire le malloc dans le timer sans detruire la raison d'etre du timer. Du coup on a une fonction indirecte pour faire les mallocs. (un test_malloc selon ton exemple) ensuite le code est appele indirectement comme tu l'as fait.
 
Cependant, le saut indirect dans le timer enleve de la precision donc c'est pour cela que j'aimerais bien pouvoir le virer.
 
Bien joue cependant ;)

Reply

Marsh Posté le 24-09-2007 à 19:01:23    

Cytoplasm a écrit :

Yo, je t'accorde que ce serait plus simple si on pouvait faire comme tu dis. En fait, c'est tellement simple que j'y avais deja pense moi-meme. En fait c'est tellement simple que ca marche presque comme ca a l'heure actuelle
 
Bon, maintenant le probleme avec ca c'est que les codes en questions tournent tres tres rapidemment (nanosecondes) et que donc il est impossible de faire le malloc dans le timer sans detruire la raison d'etre du timer. Du coup on a une fonction indirecte pour faire les mallocs. (un test_malloc selon ton exemple) ensuite le code est appele indirectement comme tu l'as fait.
 
Cependant, le saut indirect dans le timer enleve de la precision donc c'est pour cela que j'aimerais bien pouvoir le virer.
 
Bien joue cependant ;)


Et tu pourrais pas faire tes fonctions qui reçoivent toutes
- un tableau d'entiers
- le nombre d'éléments du tableau
???


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed