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 :

Avis pour une fonction de log des erreurs


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut Avis pour une fonction de log des erreurs
    Bonjour,

    J'aurais souhaité avoir votre avis sur la création d'une fonction de log des erreurs.
    Voilà ce que j'ai pensé faire :

    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
     
    typdef struct
    {
        char **header;
        char **msg; 
        char *buffer;
        t_uint64 line;
        t_uint64 line_sz;
        t_uint64 index;
    }t_log;
     
    void log_write( t_log *p_log, const char *header, char *msg )
    {
        if ( header && msg )
        {
            if ( index < line )
            {
                str_replace(p_log->header[index] , header);
                str_replace(p_log->msg[index], msg);
                index++;
            }
        }
    }
    Chaque fonction aura systématiquement pour argument une variable de type t_log* qui permettra d'enregistrer dans le tableau 2D header, le nom du header qui contient la fonction en faute puis, dans un tableau 2D msg, un message pour ajouter des indications sur l'erreur.
    Et à chaque nouvelle erreur, on incrémente index qui définit la position courante dans les tableaux 2D où écrire les informations.
    Les dimensions de ces tableaux 2D seront initialisés et fixes avant son utilisation bien entendu.

    Ma question étant la suivante : cela vous parait-il correcte (Pas le code mais la manière de faire) ?


    /*EDIT 1 suite à la remarque d'edgar*/

    Une question subsidiaire : Est-ce qu'il possible de refaire une fonction comme printf mais qui renverrait le resultat vers un char* ? De cette façon je pourrai ajouter des valeurs de variables à msg ?

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    log_write(p_log, "header.h::functionX", la_fonction("a=%d, b=%c", a, b) );
    /*EDIT 2*/
    Ok j'ai finalement trouvé la fonction asprintf après avoir bien galéré. Je ne devais pas taper ce qu'il fallait dans google xD
    On entend jamais parler de cette fonction, à juste titre ?

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    log_write(p_log, "header.h::functionX", asprintf("a=%d, b=%c", a, b) );
    /*EDIT 3 suite à la remarque d'Obsidian*/

    asprintf n'est pas un standard donc.... Bonjour snprintf ?

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    snprintf(t_log->buffer, "a=%d, b=%c", a, b), log_write(p_log, "header.h::functionX", t_log->buffer );
    J'avoue que ça ne m'enchante pas de faire comme ça mais on dirait qu'il n'y a pas d'autre solutions sinon de coder sa propre fonction. Sinon je ferai sans, tant pis, je me contenterai d'un string.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    log_write(p_log, "header.h::functionX", "Description de l'erreur" );
    Merci d'avance.

    666ème message xD
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  2. #2
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 562
    Points
    1 562
    Par défaut
    Hello,

    Je ne répondrai pas quant à la pertinence de la méthode, mais attention: sprintf() renvoie le nombre de caractères écrits, en aucun cas un pointeur char *. Or ta fonction log_write() attend en 3ème paramètre, un char *. Et qui plus est, ton appel à sprintf() est faux: voir ici le prototype.

    A+

    Edgar;
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  3. #3
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Merci, oui exact, j'ai craqué mon slip avec sprintf !
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Bonsoir,

    Citation Envoyé par darkwall_37 Voir le message
    /*EDIT 2*/
    Ok j'ai finalement trouvé la fonction asprintf après avoir bien galéré. Je ne devais pas taper ce qu'il fallait dans google xD
    On entend jamais parler de cette fonction, à juste titre ?
    À cause d'un détail non négligeable concernant asprintf() et vasprintf() en particulier :

    Citation Envoyé par man asprintf
    SYNOPSIS
    #define _GNU_SOURCE /* Consultez feature_test_macros(7) */
    #include <stdio.h>

    int asprintf(char **strp, const char *fmt, ...);

    int vasprintf(char **strp, const char *fmt, va_list ap);

    CONFORMITÉ
    Ces fonctions sont des extensions GNU et sont absentes des standards C et POSIX. Elles sont également disponibles sous BSD. L'implémentation FreeBSD affecte à strp la valeur
    NULL en cas d'erreur.

    Bon courage.

  5. #5
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Merci Obsidian pour ta réponse.
    Effectivement, le compilateur me quand j'essaye d'utiliser asprintf =)
    J'ai donc relancé ma recherche et j'ai trouvé snprintf qui pourrait répondre à mon besoin.
    J'ai également regarder le code source de printf.c dans le but de voir la technique utilisée pour gérer un nombre d'arguments inconnus dans un prototype et j'avoue que c'est un peu costaud pour moi à la première lecture si on considère mon petit niveau en C. J'avoue que l'idéal serait de refaire une fonction adaptée à mon besoin mais bon...

    Concernant la méthode envisagée pour logguer les erreurs, qu'en penses-tu ?

    Merci d'avance.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu as accès au vrai snprintf() de C99 (celui qui accepte un pointeur nul et retourne toujours la taille théorique écrite), tu peux re-créer asprintf() facilement.

    Et si tu es sous Visual Studio (qui n'offre pas le vrai snprintf()), tu pourras faire la même chose en utilisant _scprintf() à la place.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Si tu as accès au vrai snprintf() de C99 (celui qui accepte un pointeur nul et retourne toujours la taille théorique écrite), tu peux re-créer asprintf() facilement.

    Et si tu es sous Visual Studio (qui n'offre pas le vrai snprintf()), tu pourras faire la même chose en utilisant _scprintf() à la place.
    Salut, je tourne sous codeblocks avec le GNU GCC Compiler

    J'ai testé l'appel à snprintf avec une chaine non allouée et il n'a pas aimé. Je dois donc conclure que je n'ai pas la vraie fonction snprintf ?

    NOK;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char *s = NULL;
    snprintf(s,10,"%s", "bonjour");
    printf("%s", s);
    free(s);
    OK;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char *s = (char*)malloc(10*sizeof(char));
    snprintf(s,10,"%s", "bonjour");
    printf("%s", s);
    free(s);
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    À quoi t'attendais-tu?
    snprintf() n'a pas de mécanisme pour retourner un pointeur vers une chaîne nouvellement allouée.

    Tu dois faire deux appels à snprintf(), et entre les deux un malloc(longueur_retournee+1).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si tu as accès au vrai snprintf() de C99 (celui qui accepte un pointeur nul et retourne toujours la taille théorique écrite)
    J'ai naïvement appliqué à tort ce que tu disais. Enfin, ce que j'en ai compris. Bien que je sois conscient que passer un char* initialisé à NULL à une fonction qui prend en paramètre un char* ne permet pas de récupérer un char* alloué.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est vrai que tu n'es pas forcément habitué à la méthode "appel avec buffer nul, puis malloc, puis appel", car elle n'est pas tellement utilisée en C standard ou sous *n*x. Pour un vétéran de la programmation Windows, ça devient une seconde nature.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Demande d'avis pour une solution de gestion des releases
    Par mahermaher8989 dans le forum ALM
    Réponses: 1
    Dernier message: 28/02/2013, 10h37
  2. Construction d'une fonction de log d'erreur
    Par vdary dans le forum Programmation système
    Réponses: 0
    Dernier message: 22/09/2012, 17h14
  3. Une fonction Trim génère des erreurs
    Par sash6 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/11/2007, 12h40
  4. booléen d'erreur pour une fonction
    Par kebab666 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 28/06/2007, 14h46
  5. [VBA][03] Erreur dans une fonction qui vide des tables
    Par NiKoTiNe dans le forum VBA Access
    Réponses: 3
    Dernier message: 20/04/2007, 14h13

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