Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1361 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1611213
Cytoplasm
Posté le 13-09-2007 à 04:33:52  profilanswer
 

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
mood
Publicité
Posté le 13-09-2007 à 04:33:52  profilanswer
 

n°1611236
matafan
Posté le 13-09-2007 à 09:22:20  profilanswer
 

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.

n°1611421
Cytoplasm
Posté le 13-09-2007 à 16:26:04  profilanswer
 

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

n°1611434
franceso
Posté le 13-09-2007 à 17:03:00  profilanswer
 

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


---------------
TriScale innov
n°1611441
Cytoplasm
Posté le 13-09-2007 à 17:11:22  profilanswer
 

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

n°1611486
franceso
Posté le 13-09-2007 à 18:46:38  profilanswer
 

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
n°1611496
Cytoplasm
Posté le 13-09-2007 à 19:31:33  profilanswer
 

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 ;)

n°1614680
Sve@r
Posté le 24-09-2007 à 19:01:23  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
[JS] Appel fonction d'une autre pagefonction if
creat table en php avec une fonction en +fonction date VBA
[Résolu] Fonction readfile() et chemins relatifs/absolusexcel/vba fonction trouver un mot dans une plage
problème javascript pour déclencher une fonction dans une framePointeur de fonction en argument [Résolu]
[Résolu] Image en fonction du nom de la page[ ASP ] Fonction include d'une page HTTP situé sur un autre serveur
Plus de sujets relatifs à : [C-preprocessor] L'inverse d'une fonction variadique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR