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 :

"surcharge" de printf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut "surcharge" de printf
    Bonjour,

    Pour me simplifier la vie, j'ai voulu ecrire une fonction
    qui doit être appelé a la place d'un printf
    pour profiter des charactères de control des terminaux.
    Et ce sans forcement appeler d'autre fonctions
    pour activer les changements de couleur.

    d'où l'idée d'avoir une fonction cprintf qui aurait 3 parametres
    en plus avant la chaine de format :

    printf étant une fonction avec une liste de parametres variables, je m'etais dis
    un peu naïvement j'avoue, qu'il suffirait de récupérer le premier paramêtre
    via les va_list et va_start, et de passer tout ceci à printf.

    Mais à priori la réflexion était trop simpliste...

    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
     
    #define NOIR 	30
    #define ROUGE	31
    #define VERT	32
    #define JAUNE	33
    #define BLEU	34
    #define MAGENTA	35
    #define CYAN	36
    #define BLANC	37
     
    #define FOND_NOIR 		0
    #define FOND_GRIS 		40
    #define FOND_ROUGE		41
    #define FOND_VERT		42
    #define FOND_JAUNE		43
    #define FOND_BLEU		44
    #define FOND_MAGENTA	45
    #define FOND_CYAN		46
    #define FOND_BLANC		47
     
    #define VIDEO_NORMAL 1
    #define VIDEO_INVERSE 7
     
    void cprintf(int colour, int bgcolour, int VideoMode, char *format,...){
    	va_list args;
    	va_start(args,format);
     
    	printf("\E[%d;%d;%dm",VideoMode,colour,bgcolour);
    	printf(format,args);
    	printf("\E[0m");
    	va_end(args);
    }
     
     
    //pour pouvoir appeler comme ceci
     
    cprintf(ROUGE,FOND_NOIR,VIDEO_NORMAL, "Connection timeout. %d try remain\n",nbrTry--);

    J'effectue actuellement les recherches pour trouver une solution a ce problème et ne manquerai pas de la partager si je la trouve.

    [MODE PAS CLAIR]
    Quelqu'un connaitrait il, si cela existe, la maniere de passer une liste d'arguments variable que recoit une fonction, à une autre fonction a arguments variables,elle meme appelée depuis cette 1ere ?
    [/MODE PAS CLAIR]


    Sinon, je reparse la chaine de format et récupère chaques argument pour faire des appels unitaire à printf.
    Mais bon si une autre solution existe, autant ne pas mourrir idiot.:p

    Merci d'avance.

    Cordialement.

  2. #2
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut
    Dans l'urgence, je me suis codé ca vite fait,

    c'est moche, ca n'a pas toute la puissance et la richesse de printf
    mais ca répond rapidement au besoin pour les cas gérénaux.


    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
     
    #define NOIR 	"30"
    #define ROUGE	"31"
    #define VERT	"32"
    #define JAUNE	"33"
    #define BLEU	"34"
    #define MAGENTA	"35"
    #define CYAN	"36"
    #define BLANC	"37"
     
     
    #define FOND_NOIR 		""
    #define FOND_GRIS 		"40"
    #define FOND_ROUGE		"41"
    #define FOND_VERT		"42"
    #define FOND_JAUNE		"43"
    #define FOND_BLEU		"44"
    #define FOND_MAGENTA	"45"
    #define FOND_CYAN		"46"
    #define FOND_BLANC		"47"
     
     
    #define VIDEO_NORMAL "1"
    #define VIDEO_INVERSE "7"
     
     
     
     
     
    void cprintf(char *colour, char *bgcolour, char *VideoMode, char *format,...){
    	va_list args;
    	va_start(args,format);
    	char *ptr = format;
     
    	printf("\E[%d;%d;%dm",VideoMode,colour,bgcolour);
    	while (ptr - format < strlen(format)){
    		if (*ptr == '%'){
    			ptr++;
    			switch(*ptr){
    			case '%':
    				printf("%%");
    				break;
    			case 'd':
    			case 'i':
    				printf("%d",va_arg(args, int));
    				break;
    			case 'c':
    				printf("%c",va_arg(args, int));
    				break;
    			case 's':
    				printf("%s",va_arg(args, char *));
    				break;
    			case 'g':
    				printf("%g",va_arg(args, double));
    				break;
     
    			case 'f':
    				printf("%f",va_arg(args, double));
    				break;
    			}
    			ptr++;
    		}else{
    			printf("%c",*ptr++);
    		}
    	}
    	printf("\E[0m");
    	va_end(args);
     
    }
    Mais si quelqu'un a mieux, je suis toujours prenneur.

    Cordialement.

  3. #3
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut vprintf peut etre ?
    il existe une version de printf, vprintf, qui prend une liste d'arguments en paramètre, plutot que des arguments variables.
    est-ce que ça irait ?

  4. #4
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut
    Merci,
    c'est exactement ça.



    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
     
     
    #define NOIR 	"30"
    #define ROUGE	"31"
    #define VERT	"32"
    #define JAUNE	"33"
    #define BLEU	"34"
    #define MAGENTA	"35"
    #define CYAN	"36"
    #define BLANC	"37"
     
     
    #define FOND_NOIR 		""
    #define FOND_GRIS 		";40"
    #define FOND_ROUGE		";41"
    #define FOND_VERT		";42"
    #define FOND_JAUNE		";43"
    #define FOND_BLEU		";44"
    #define FOND_MAGENTA	";45"
    #define FOND_CYAN		";46"
    #define FOND_BLANC		";47"
     
     
    #define VIDEO_NORMAL "1"
    #define VIDEO_INVERSE "7"
     
    void cprintf(char *colour, char *bgcolour, char *VideoMode, char *format,...){
    	va_list args;
    	va_start(args,format);
    	char *ptr = format;
     
    	printf("\E[%s;%s%sm",VideoMode,colour,bgcolour);
    	vprintf(format,args);
    	printf("\E[0m");
    	va_end(args);
    }
    Merci

  5. #5
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par Lharuun Voir le message
    c'est exactement ça.
    La, ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cprintf(FOND_ROUGE, JAUNE, "donner un verbe:%s", "aller")
    Mais si le formateur n'a pas de paramètres, ça ne compile pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cprintf(FOND_ROUGE, JAUNE, "donner un verbe")
    A+

    Pfeuh

  6. #6
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    En effet, la fonction prend au moins 4 paramètres, mais tu as mis le formatteur dans le 3eme.

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

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