IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres éditeurs Discussion :

ellipse : Passage d'arguments multiples (stdarg)


Sujet :

Autres éditeurs

  1. #1
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut ellipse : Passage d'arguments multiples (stdarg)
    Bonjour,

    J'ai une fonction privée dans une librairie comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    static int
    pipo (char *blablabla, char *fmt, ...)
    {
        va_list argptr;
        int rc = 0;
     
        va_start (argptr, fmt);
     
        /* ceci est un exemple, mais peut être autre chose */
        printf ("%s", blablabla);
        rc = vprintf (fmt, argptr); 
     
        va_end (argptr);
        return (rc);
    }
    et je voudrais créer des fonctions publiques qui s'utiliseraient un peu comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    rc = pipo_cas_particulier_1 (<mes arguments ici>);
    rc = pipo_cas_particulier_2 (<mes arguments ici>);
    et qui ferait en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    rc = pipo ("description du cas 1", <mes arguments ici>);
    rc = pipo ("description du cas 2", <mes arguments ici>);
    Quelque chose qui serait codé du genre :
    (mais c'est bien entendu faux)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int
    pipo_cas_particulier_1 (char *fmt, ...)
    {
        return pipo ("description du cas 1", ...);
    }
    Comment faire pour passer les ellipses au sous-fonctions ?

    Merci.

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Tu passes le va_list, en général, mais cela demande d'avoir un prototype capable de gérer ça (cf. prototype "vprintf" notamment).

    En général, je fais deux fonctions pour ça, une avec ellipse, l'autre avec un va_list, et celle avec ellipse appelle la deuxième.

    Petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <stdio.h>
    #include <stdarg.h>
     
    // "Vraie" fonction, faisant réellement le travail attendu.
    void vfmtstring ( char* fmt, va_list arg_ptr ) { 
     
        // Traitement du va_list.
        for (int i=0;fmt[i];i++)
            switch (fmt[i]) {
                case 'I' :
                    printf("\t%d\n",va_arg(arg_ptr,int));
                    break;
                case 'C' :
                    printf("\t%s\n",va_arg(arg_ptr,char*));
                    break;
                case 'H' :
                    printf("\t%08X\n",va_arg(arg_ptr,char*));
                    break;
                default :
                    printf("\t<<ERROR>>\n",va_arg(arg_ptr,void*));
                    return;
            }
    } 
     
    // Fonction destinée à l'utilisateur, afin d'autoriser les paramètres variadiques.
    // Appelle vfmtstring, ne fait rien d'autre.
    void fmtstring ( char* fmt, ... ) { 
     
        va_list arg_ptr ;
        va_start(arg_ptr,fmt) ;
        vfmtstring(fmt,arg_ptr) ; 
        va_end(arg_ptr) ;
    }
     
    int main ( void ) {
     
        fmtstring("ICH",1654,"test",987564);
        fmtstring("CHI","test2",0,0);
        return 0 ;
    }
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Merci Mac LAK

    Je viens de faire un petit test, mais ça ne va pas

    Peux-tu me dire où je me plante
    Merci encore.

    Voilà le test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    #include <stdarg.h>
    #include <stdio.h>
     
    #ifndef vsnprintf
    #define vsnprintf _vsnprintf
    #endif
     
    void
    vfmtstring (char *type, char *fmt, va_list arg_ptr)
    {
        char buffer [256];
        va_start (arg_ptr, fmt);
        vsnprintf (buffer, sizeof (buffer), fmt, arg_ptr);
        va_end (arg_ptr);
        printf ("%s,%s %s %s", "2010/01/29", "14:30:25", type, buffer);
    }
     
    void
    fmtstring  (char *fmt, ...)
    {
        va_list arg_ptr;
        va_start (arg_ptr, fmt);
        vfmtstring  ("TOTO", fmt, arg_ptr);
        va_end (arg_ptr);
    }
     
     
    int
    main (void)
    {
        fmtstring ("aaa=%d, bbb=%s\n", 1654, "test");
        return 0;
    }
    Je pensais obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    2010/01/29,14:30:25 TOTO aaa=1654, bbb=test

  4. #4
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    J'ai trouvé

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #include <stdarg.h>
    #include <stdio.h>
     
    #ifndef vsnprintf
    #define vsnprintf   _vsnprintf
    #endif
     
    void
    vfmtstring (char *type, char *fmt, va_list arg_ptr)
    {
        char buffer [256];
        vsnprintf (buffer, sizeof (buffer), fmt, arg_ptr);
        printf ("%s,%s %s %s", "2010/01/29", "14:30:25", type, buffer);
    }
     
    void
    fmtstring  (char *fmt, ...)
    {
        va_list arg_ptr;
        va_start (arg_ptr, fmt);
        vfmtstring  ("TOTO", fmt, arg_ptr);
        va_end (arg_ptr);
    }
     
    int
    main (void)
    {
        fmtstring ("aaa=%d, bbb=%s\n", 1654, "test");
        return 0;
    }
    Merci pour les indications.

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Yep, il ne faut pas appeler le va_start (ni le va_end, d'ailleurs) lorsque tu reçois directement un paramètre va_list...

    Ces deux macros sont réservées aux fonctions possédant une ellipse dans leur signature, justement pour "fabriquer" un va_list à partir de l'ellipse.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut

    Merci à tous pour l'aide que vous m'avez apportée.

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par domiq44 Voir le message
    Merci à tous pour l'aide que vous m'avez apportée.
    De rien. Mais je ne savais pas que j'étais si nombreux !
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  8. #8
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Je m'étais compté dedans je présume

    Désolé « Mac LAK »

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/04/2010, 14h07
  2. [JAVASCRIPT] passage d'argument à une fonction
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/06/2005, 18h17
  3. [TASM] Passage d'argument à une macro
    Par sorry60 dans le forum Assembleur
    Réponses: 13
    Dernier message: 23/04/2005, 18h22
  4. [web] passage d'arguments à un CGI
    Par ma2th dans le forum Web
    Réponses: 4
    Dernier message: 20/08/2004, 12h18
  5. passage d'argument à la procédure main ()
    Par Zazeglu dans le forum C
    Réponses: 5
    Dernier message: 01/09/2003, 19h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo