Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/12/2009, à 03:11

Mpok

[Résolu] Peut-on "renvoyer" sur printf ?

Bonsoir,

J'ai un programme C qui doit fonctionner à la fois en mode console et en mode graphique.
Donc, dans le mode console, pas de problème, c'est fait : j'ai une série de "printf" (beaucoup).
Dans le mode graphique, je veux afficher (sensiblement) la même chose dans un TextView.

Et tant qu'à faire, je voudrais bien me servir des possibilités "évoluées" du TextView (par rapport à un terminal).
Il faudrait donc que je "re-dirige" les "printf" vers une fonction spécifique qui :
- soit on est en mode console : alors printf standard.
- soit on est en mode graphique : alors formattage spécifique pour le TextView.

Question : comment faire pour remplacer globalement tous les "printf" par "ma_fonction" ?

- "ma_fonction" est évidemment déclarée comme "printf" : ma_fonction(char *format, ...)
- dans "ma_fonction", je sais récupérer les arguments variables avec va_list, va_start, va_arg, etc...
- donc, dans le mode graphique, je m'en sors (je reformatte les arguments).
- MAIS comment "renvoyer" vers printf dans le mode console ???

Ma fonction serait du genre :

ma_fonction(char *format, ...)
{
    va_list ap;

    if (console)
        printf(format, ....???.........);
    else
    {
        va_start(ap, format);
        [Traitement graphique]
    }
}

Est-ce qu'une telle construction est possible ? (a priori, non et c'est dommage)
Ou y-a-t-il une "ruse" que je n'ai pas vue ?

Note : pour l'instant, la solution qui marche est de rajouter des "if (console)" devant chaque printf dans le code initial, mais c'est gonflant... J'aurais préféré faire un "search&replace" sur tous les printf...

Dernière modification par Mpok (Le 04/12/2009, à 17:19)

Hors ligne

#2 Le 02/12/2009, à 11:20

Link31

Re : [Résolu] Peut-on "renvoyer" sur printf ?

Bien entendu que c'est possible wink

man vprintf

Hors ligne

#3 Le 04/12/2009, à 17:19

Mpok

Re : [Résolu] Peut-on "renvoyer" sur printf ?

Ah ben oui ! big_smile
(je me demande encore comment j'ai pu passer à côté, c'est dans la même page de man que printf !).
Merci.

Hors ligne

#4 Le 04/12/2009, à 18:06

Karl_le_rouge

Re : [Résolu] Peut-on "renvoyer" sur printf ?

La GLib offre un jeu de fonctions spécialement adaptée à ce genre de cas.
Au lieu d'utiliser printf, tu utilises la fonction g_print qui offre la particularité de rediriger la chaine construite à un gestionnaire pour soit l'écrire dans un fichier de logs, un widget etc ... le gestionnaire par défaut affiche le message dans la console comme avec printf.
Le gestionnaire doit avoir la signature suivante: void (*)(const gchar *) et tu définis le gestionnaire en charge avec la fonction g_set_print_handler qui te renvoie un pointeur vers l'ancien gestionnaire.

Gtk c'est bien, mais il ne faut pas oublier que derrière il y a aussi la GLib ! yikes)

Hors ligne

#5 Le 07/12/2009, à 16:24

Mpok

Re : [Résolu] Peut-on "renvoyer" sur printf ?

Ah ouais Karl, c'est encore mieux !!

Karl_le_rouge a écrit :

Gtk c'est bien, mais il ne faut pas oublier que derrière il y a aussi la GLib ! yikes)

Tout à fait, mais je débute... Alors je prends les infos (de vous, du man, des différents tutoriels) au fur et à mesure de mes pbms.
Note : la Glib est-elle très différente de la Xlib de base ? (genre : j'ai un soft développé avec la Xlib debut des années 90, la Glib n'existait pas encore. Est-ce que le dev est compatible avec la Glib d'aujourd'hui ?).

Hors ligne

#6 Le 07/12/2009, à 17:22

Link31

Re : [Résolu] Peut-on "renvoyer" sur printf ?

Mpok a écrit :

Note : la Glib est-elle très différente de la Xlib de base ? (genre : j'ai un soft développé avec la Xlib debut des années 90, la Glib n'existait pas encore. Est-ce que le dev est compatible avec la Glib d'aujourd'hui ?).

La glib et la xlib n'ont absolument rien à voir. Ce sont deux bibliothèques complètement différentes.
Et pour ton soft, je pense qu'il est encore compatible avec la xlib actuelle.

Hors ligne

#7 Le 07/12/2009, à 23:54

Karl_le_rouge

Re : [Résolu] Peut-on "renvoyer" sur printf ?

La GLib est une bibliothèque C portable offrant divers utilitaires:  structures de données (chaines de caractères dynamique, arbre, hashtable, liste chainées etc ...), expressions régulières, gestion d'erreur, threads, gestion de fichiers, options de ligne de commande, timers, log etc ...
Gtk+ se base sur la GLib pour tout ce qui n'est pas du ressort de l'interface graphique. Une excellente bibliothèque (indépendante de Gtk+) à mettre entre les mains de tout les développeurs C.

Rien à voir avec la XLib.

Hors ligne

#8 Le 08/12/2009, à 15:21

Mpok

Re : [Résolu] Peut-on "renvoyer" sur printf ?

Ok. Merci pour ces précisions.

Hors ligne