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

C Discussion :

printf et fprintf.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 23
    Par défaut printf et fprintf.
    Bonjour,

    Savez vous comment je pourrais redéfinir ces deux fonctions avec presque le même prototype ?

    En pratique, je veux pouvoir écrire quelque chose comme :

    myprintf(int a, ...)
    {
    if (a == 1)
    printf(...)
    else
    {
    /* TODO */
    }
    }

    Merci

  2. #2
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Quel est ton but de vouloir réaliser une telle chose?
    printf écrit sur la sortie standard
    fprintf écrit sur un flux spécifique
    rajouter des if esle ne rendra que ton programme plus lents!

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 23
    Par défaut
    Le but est de pouvoir activer / desactiver toutes les sorties (standard et fichiers) en un seul coup je m'explique :

    1) je définis :
    #define ACTIVEPRINTF 1 //(ou 0)

    2) j'écris un peu partout dans mon code
    #if ACTIVEPRINTF
    printf(...)
    #endif

    Je voudrais eviter cela partout dans le code, en ayant une fonction MyPrintf du type
    MyPrintf(...)
    {
    #if ACTIVEPRINTF
    printf(...)
    #endif

    }

    Merci

    Nicolas

  4. #4
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Non tu ne peux pas, tu es obligé de mettre à chaque fois un #if

  5. #5
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Si j'ai bien compris tu peux tout simplement faire comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #define  ACTIVEPRINTF 1
     
    #if ACTIVEPRINTF
        #define  MyPrintf(...) 	printf(__VA_ARGS__)
    #else
        #define  MyPrintf(...)
    #endif

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par doudounico Voir le message
    Savez vous comment je pourrais redéfinir ces deux fonctions avec presque le même prototype ?

    En pratique, je veux pouvoir écrire quelque chose comme :

    myprintf(int a, ...)
    {
    if (a == 1)
    printf(...)
    else
    {
    /* TODO */
    }
    }
    Personnellement, pour ce que tu cherches à faire ici, je te conseille de passer par des macros comme le propose ssmario2.

    Maintenant, si tu as vraiment besoin de créer une fonction du style de printf(), je t'invite à regarder du côté des fonctions va_start(), va_arg() et va_end() ainsi que du côté de vprintf() et consœur.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 23
    Par défaut
    L'idée de la macro me convient bien mais je n'arrive pas à la faire fonctionner correctement.

    J'ai mis :
    #define ACTIVEPRINTF 1
    #if ACTIVEPRINTF
    #define MyPrintf(__VA_ARGS__) printf(__VA_ARGS__)
    #else
    #define MyPrintf(__VA_ARGS__)
    #endif

    puis dans le main : MyPrintf("Test %d\n %0.20f\n",15, 3.14152);

    et j'ai les warning suivants à la compilation ;

    warning C4002: too many actual parameters for macro 'MyPrintf'
    warning C4313: 'printf' : '%d' in format string conflicts with argument 1 of type 'const char *'

    mais surtout un échec à l'exécution...

    Merci de votre aide

  8. #8
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Dans ta première macro il faut mettre des points (pour montrer que tu attends un nombre variable d'arguments). Dans la deuxième aussi d'ailleurs :p
    Ta deuxième macro ne sert à rien lol

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define ACTIVEPRINTF 1
    #if ACTIVEPRINTF
    #define MyPrintf(...) printf(__VA_ARGS__)
    #else
    #define MyPrintf(...) my_printf(__VA_ARGS__)
    #endif

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 23
    Par défaut
    Ca ne fonctionne pas, je présume que le compilo C++ de Visual Studio n'en veut pas.
    Je suis passé via les va_args avec vprintf et cela fonctionne très bien

    Nicolas

  10. #10
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Support for variadic macros was introduced in Visual C++ 2005.
    Si tu as Visual C++ 2005 ou plus normalement ça devrais fonctionner

Discussions similaires

  1. printf fprintf puts et fputs
    Par salseropom dans le forum C
    Réponses: 7
    Dernier message: 28/03/2011, 13h49
  2. Différence printf() et fprintf()
    Par cmoibal dans le forum C
    Réponses: 8
    Dernier message: 21/05/2008, 18h11
  3. Redefinition de printf en fprintf
    Par iza76 dans le forum C
    Réponses: 4
    Dernier message: 13/03/2008, 17h35
  4. histoire d'affichage printf fprintf
    Par gnto dans le forum C
    Réponses: 4
    Dernier message: 01/06/2006, 09h20
  5. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24

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