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

  FORUM HardWare.fr
  Programmation
  C

  Créer une fonction acceptant divers arguments en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Créer une fonction acceptant divers arguments en C

n°2251118
Maxwell166​4
Posté le 18-02-2015 à 11:24:15  profilanswer
 

Salut à toutes et tous,
 
Je voulais savoir si pouvais faire une fonction C qui accepte des valeurs en entrée soit "normale", soit des pointeurs sans devoir écrire 2 fonctions. Du genre :
 
int Foo(char a, char b) ;
 
int Foo(char *a, char *b) ;
 
Mon idée est de faire une fonction Foo et une FooPtr, mais je me demandais si je pouvais regrouper les 2 en 1... sachant que les valeurs, qu'elles soient passer par pointeurs ou pas ont la même signification.
 
Merci d'avance.


---------------
Intel Core i7 2600K / Corsair H60 / Asus P8P67 Deluxe / Asus GTX 580 DirectCUII / Corsair Vengeance 1866 MHz 2x4 Go CAS9 / NZXT Phantom rouge et blanc / Seasonic X-850 / Corsair Force Series GT 240 Go / Western Digital Caviar Blue 1 To SATA III / Lite-On
mood
Publicité
Posté le 18-02-2015 à 11:24:15  profilanswer
 

n°2251123
theshockwa​ve
I work at a firm named Koslow
Posté le 18-02-2015 à 12:12:48  profilanswer
 

en C, tu ne peux pas faire d'overload (utiliser le même nom de fonction pour des appels avec des arguments différents)
 
Dans ton cas, tu peux toujours faire une fonction inline avec un autre nom qui appellera l'autre fonction, comme ca, ton code reste factorisé.


---------------
last.fm
n°2251171
tpierron
Posté le 18-02-2015 à 19:49:49  profilanswer
 

En fait, c'est faisable en C11, en utilisant le mot-clé _Generic() (cf. http://en.wikipedia.org/wiki/C11_% [...] evision%29). Cela dit, je n'ai jamais fait joujou avec ça, mais ce mot-clé a été introduit pour exactement ce genre de raison. En gros: tu dois avoir 2 fonctions avec 2 noms différents + une macro qui permet de d'appeler l'une ou l'autre en fonction des types passés en paramètres.
 
Et si tu aimes le gore, ce genre de chose est aussi faisable avec le préprocesseur C (C99): https://web.archive.org/web/2013120 [...] e-tgmathh/
 
Edit: En C99, tu auras en fait besoin d'une extension de gcc : typeof().

Message cité 1 fois
Message édité par tpierron le 18-02-2015 à 19:57:37
n°2251197
theshockwa​ve
I work at a firm named Koslow
Posté le 19-02-2015 à 11:34:30  profilanswer
 

tpierron a écrit :

En fait, c'est faisable en C11, en utilisant le mot-clé _Generic() (cf. http://en.wikipedia.org/wiki/C11_% [...] evision%29). Cela dit, je n'ai jamais fait joujou avec ça, mais ce mot-clé a été introduit pour exactement ce genre de raison. En gros: tu dois avoir 2 fonctions avec 2 noms différents + une macro qui permet de d'appeler l'une ou l'autre en fonction des types passés en paramètres.
 
Et si tu aimes le gore, ce genre de chose est aussi faisable avec le préprocesseur C (C99): https://web.archive.org/web/2013120 [...] e-tgmathh/
 
Edit: En C99, tu auras en fait besoin d'une extension de gcc : typeof().


 
Generic a l'air d'être plus comme un template de C++, et du coup, ca ne passerait pas si tu as un niveau d'indirection différent.


---------------
last.fm
n°2251199
Devil'sTig​er
Posté le 19-02-2015 à 13:05:16  profilanswer
 

Hum, je ne suis pas forcément de l'avis de tous, il y a bien une façon de faire "détournée", a l'aide de vaargs.
 
http://www.cplusplus.com/reference/cstdarg/va_start/
 
Dans l'exemple donné dans le lien ci dessus, suivant n par exemple, il serait possible d'appliquer différent va arg en changeant cette ligne:
 

Code :
  1. val=va_arg(vl,double);


 
Avec le type attendu.
 
Ca n'est pas très beau (c'est même très laid puisque normalement on réserve va arg pour les arguments illimités), mais c'est pour autant possible de la sorte...


Message édité par Devil'sTiger le 19-02-2015 à 13:05:51
n°2251218
tpierron
Posté le 19-02-2015 à 17:05:46  profilanswer
 

Ha, je n'ai que ça à foutre en moment. J'ai fait joujou avec gcc 4.9.2, et on peut faire pas mal de délire avec ce mot clé :
(on notera que les caractères en C, sont des "int" et non des "char" ). La flemme de voir si on peut varier le nombre d'argument en fonction du type.
 

Code :
  1. #include <stdio.h>
  2.  
  3. int FooChr(char a, char b)
  4. {
  5.  fprintf(stderr, "(char) version\n" );
  6. }
  7.  
  8. int FooPtr(char * a, char * b)
  9. {
  10.  fprintf(stderr, "(char *) version\n" );
  11. }
  12.  
  13. int FooChrPtr(char a, char * b)
  14. {
  15.  fprintf(stderr, "(char, char *) version\n" );
  16. }
  17.  
  18. #define Foo(a, b)     _Generic(a, int: _Generic(b, int: FooChr, char *: FooChrPtr), char *: FooPtr)(a, b)
  19.  
  20. int main(int nb, char * argv[])
  21. {
  22.  char * a = NULL;
  23.  Foo('a', 'b'); // FooChr
  24.  Foo(a, a);     // FooPtr
  25.  Foo('a', a);   // FooChrPtr
  26.  return 0;
  27. }



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

  Créer une fonction acceptant divers arguments en C

 

Sujets relatifs
C# Web Service et Action mustUnderstandCréer site web d'après un classeur excel
Créer une extension avec des actions automatiqueUtilisation de librairie C avec node.js
[C] Faire un mode multijoueur en ligne pour un jeuCréer une animation en python
[Divers] Conseil création site webC# / StarUml
bouton de redirection en fonction du login[C#] HttpWebRequest et adresse d'hôte avec majuscule
Plus de sujets relatifs à : Créer une fonction acceptant divers arguments en C


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