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

  FORUM HardWare.fr
  Programmation

  [C] : help help ...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] : help help ...

n°27948
HelloWorld
Salut tout le monde!
Posté le 27-04-2001 à 09:36:14  profilanswer
 

je cherche, dans une fonction acceptant un nombre indeterminé de parametres (ellipse), à passer ces parametres à unr fonction qui accepte elle aussi une nombre indeterminé de parametres.
 
exemple avec une fonction "test", bon ca sert à rien, mais c'est pour comprendre:
 

Code :
  1. void test(char * format,...)
  2. {
  3.     if( format == NULL )
  4.         return;
  5.     else
  6.         printf(format, ...);
  7. }


 
evidement ca marche pas;
j'ai essayé des trucs genre :  
     
    va_list liste;
    va_start(liste, format);
    printf(liste);
 
liste étant un pointeur sur la liste de parametres, je me suis dit ... mais non.
sauriez pas comment faire ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le 27-04-2001 à 09:36:14  profilanswer
 

n°27971
jupiler
Un cousin...
Posté le 27-04-2001 à 10:35:25  profilanswer
 

tu fais comme pour les paramètres du main
 
 
void test(int argc, char *argv[])
{  
...
}  
 
evidemment faut convertir tes paramètres en *char


---------------
Je ne suis ni pour, ni contre, bien au contraire  
n°27985
HelloWorld
Salut tout le monde!
Posté le 27-04-2001 à 11:05:47  profilanswer
 

:??:
 
et je passe quoi à printf ???
ca ? => printf(argv) ???
 
j'ai pas préciser mais le but est en quelque sorte de surcharger la fonction printf
je veux faire un truc du genre :
 

Code :
  1. enum
  2. {
  3. FICHIER,
  4. ECRAN
  5. }sortie;
  6. FILE * FichierDest;
  7. void print(char *, ...)
  8. {
  9.     switch(sortie)
  10.     {
  11.         case FICHIER : fprintf(FichierDest, <les memes parametres> );break;
  12.         case ECRAN : printf(<les memes parametres> );break;
  13.     }
  14. }


 
le but etant de faire apres dans mon source :

Code :
  1. print("%sLa valeur du nombre est %d.\n",Nombre);


 
et en fonction de ma variable "sortie", ca affiche ca à l'écran et/ou dans un fichier particulier et/ou dans un autre fichier particulier et/ou dans une chaine de caractere ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°27987
HelloWorld
Salut tout le monde!
Posté le 27-04-2001 à 11:06:47  profilanswer
 

bon y'a un "%s" en trop mais vous aurez rectifié ;)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°28028
SoWhatIn22
Posté le 27-04-2001 à 13:14:19  profilanswer
 

je ne suis pas sûr d'avoir tout compris, mais voila mon avis:
 
.soit tu sais d'avance quel est le type des paramètres que tu veux passer.
auquel cas tu mets tous les paramètres en question dans un tableau, et dans ta fonction tu passes un pointeur sur le tableau et sa longeur/nombre d'éléments.
 
Alors dans ta fonction, tu peux aller lire les éléments de ton tableau, sachant que tu en connais la taille.
 
.sois tu as plusieurs type différents, mais dans l'appel de ta fonction, tous les paramètres seront de même type.
auquel cas tu passes en argument le nombre d'éméments, leur type et un pointeur void* qui pointe sur le tableau. Al'interieur de ta fonction, en fonction du type, tu fais un casting sur le void* pour avoir a nouveau le bon type.
 
.sois tu ne connais ni le nombre d'éléments ni le type de chaque element (cas le plus générique) et la il faut faire des enums et des struct. désolé, pas le temps d'écrire un ex.

n°28036
HelloWorld
Salut tout le monde!
Posté le 27-04-2001 à 13:31:00  profilanswer
 

je sais tres bien comment récupérer les arguments d'une fonction qui en accepte un nombre indeterminé.
 
ma question serait comment passer cette liste à une fonction identique
revenons sur cette exemple tres simple
 
j'ai une fonction Affiche qui envoi à printf tous les arguments qu'on lui a passé en une seule fois.

Code :
  1. void Affiche(char * fromat_des_parametres, ...)
  2. {
  3.     printf( <liste des parametres> );
  4. }


 
par exemple, si j'écrit :
 
    Affiche("%s %s\n","Hello","World" );
 
eh ben ca me fait :
 
    printf("%s %s\n","Hello","World" );
 
et si je fait :
    Affiche("Bonjour %s %s\n","tout","le monde !!!" );
ca me fait
    printf("Bonjour %s %s\n","tout","le monde !!!" );
 
:??: :sweat:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°28039
wouatouwou​atou
Posté le 27-04-2001 à 13:39:46  profilanswer
 

jai pas tou lu.. mais en gros tu veu faire de la surcharge de fonction ??!!
 
Tu peux pas avoir de signature inconnue a l'avance :)
Donc c pas possible du point de vue concept et meme technique je crois.. du fait ke la machine pourra pas faire la difference entre telle ou telle fonction...


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
n°28046
Amadeus
Posté le 27-04-2001 à 13:58:52  profilanswer
 

Tu peux pas repasser les args de cette manière car les fonctions appelées ds ta fonct° (printf, sprinf et fprintf) font appel au fonctions va_start et va_end qui modifient le ptr arg_ptr. Donc la seule solut° c'est de faire toi même un fonct° qui formate les données :
 
#include <stdarg.h>
 
int ma_fonction_de_formatage(char* out, const char *format, va_list arglist)
{
/* un while qui parcourt la chaine format et la liste d'arg et qui sort la  chaîne formaté dans out */
 ...
}
 
void mon_print(const char *format, ...)
{
   va_list arglist;
   char out[512];
 
   va_start(arglist, format);
 
   ...
   ma_fonction_de_formatage(out, format, arglist);
   /* là ds out tu a la chaine formater que tu balances où tu  
    veux */
   ...
 
   va_end(arglist);
}

 

[edit]--Message édité par Amadeus--[/edit]

n°28068
HelloWorld
Salut tout le monde!
Posté le 27-04-2001 à 14:23:08  profilanswer
 

C'est ce que je suis en train de faire.
Mais je voulais savoir si y'avais pas un moyen tout con pour éviter que je me tappe l'analyse de la chaine :D
 
le probleme est que je veux respecter le "standard" (:??:) de formattage de printf.
et fo que je m'épluche toutes les options ... :(
enfin, sprintf va m'aider un peu;
 
mais je vais quand meme étudié l'option de passer la liste des parametres.
J'aurais recours à l'assembleur s'il le faut, mais je suis sûr que c'est possible (avec VC++ j'ai déjà récupéré le code assembleur de comment il empile ses parametres + la definition des macros va_start et va_arg)
je vais pas m'enuyer ce week end :lo:
 
merci pour votre aide les gars ;)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°28323
kotw
Posté le 28-04-2001 à 23:28:18  profilanswer
 

Salut, tu as regardé dans les fonctions "vprintf", "vsprintf" et "vfprintf" ? Jettes un oeil sur le MSDN et tu trouveras des exemples de l'utilisation de ces fonctions .


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

  [C] : help help ...

 

Sujets relatifs
JE VAIS BRULER NETSCAPE ! help me !DEVOIR POUR DEMAIN!!!! HELP!!! (language C)
GTK Help ! (Linux)help sous batch
Help, besoin d'aide en Java !Aux pros du javascript ! HELP
help me en VB !!!Help: [Microsoft][ODBC Driver Manager] Data source name not found an..
[ASP / SQL Server] Urgent Help[Opengl glut et C++] Débuggeurs fous, HELP!
Plus de sujets relatifs à : [C] : help help ...


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