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 :

Problème de printf sans retour chariot \n


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut Problème de printf sans retour chariot \n
    Voilà le problème :

    J'ai une fonction callback dans laquelle mes printf() ne s'affichent que s'ils se terminent par un retour chariot \n.

    En gros ça ca marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    gboolean clicImage( GtkWidget *widget,GdkEventButton *event,
                       gpointer   data )
    {
      printf("OK");
     
      return 1;
    }
     
    //Ajoute le signal "button_press_event" au GtkEventBox.
        gtk_widget_add_events(event_box,GDK_BUTTON_PRESS_MASK);
     
    g_signal_connect (G_OBJECT (event_box), "button_press_event",
    		      G_CALLBACK (clicImage),NULL);
    Et ça ca marche !! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    gboolean clicImage( GtkWidget *widget,GdkEventButton *event,
                       gpointer   data )
    {
      printf("OK\n");
    
      return 1;
    }
    
    //Ajoute le signal "button_press_event" au GtkEventBox.
        gtk_widget_add_events(event_box,GDK_BUTTON_PRESS_MASK);
    
    g_signal_connect (G_OBJECT (event_box), "button_press_event",
    		      G_CALLBACK (clicImage),NULL);
    Je précise la fonction en elle même marche bien. Tout ce que je peux mettre dedans marche nickel sauf les printf

    Mes printf marche "normalement" dans mes autres fonctions callback ...

    Merci d'avance, jcomprends pas grand choses lol

  2. #2
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Ce n'est pas le printf qui ne fonctionne pas, c'est juste que les sorties doivent être bufferisées. Le '\n' peut avoir pour effet de vider le buffer. Essayez fflush(stdout); après printf() pour forcer l'écriture sans avoir à utiliser '\n'.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par stephl
    Ce n'est pas le printf qui ne fonctionne pas, c'est juste que les sorties doivent être bufferisées. Le '\n' peut avoir pour effet de vider le buffer. Essayez fflush(stdout); après printf() pour forcer l'écriture sans avoir à utiliser '\n'.
    Merci mon sauveur ..

    Mais concrètement d'où vient le problème ??
    J'utilise sprintf juste avant l'appelle de la fonction est ce lié ??
    fclose suffit pas après l'éciture du fichier ?
    fflush(stdout); ca s'utilise quand ?

    Merci sinon !

  4. #4
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Acivurt
    Mais concrètement d'où vient le problème ??
    Il n'y a pas vraiment de problème. Les sorties sont bufferisées, c'est à dire que le texte est stocké en mémoire et n'est pas écrit à la fin de chaque printf(); le buffer est vidé de temps en temps et alors le texte est affiché.
    Citation Envoyé par Acivurt
    J'utilise sprintf juste avant l'appelle de la fonction est ce lié ??
    Non, je ne pense pas.
    Citation Envoyé par Acivurt
    fclose suffit pas après l'éciture du fichier ?
    Si, mais ici il apparaît que vous utilisez la sortie standard stdout, fichier que vous n'avez pas à fermer vous-même.
    Citation Envoyé par Acivurt
    fflush(stdout); ca s'utilise quand ?
    Quand on souhaite forcer l'écriture et vider le buffer de sortie d'un fichier.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Merci !

    Juste avant de mettre resolu dernière question :
    Donc en gros : des fois dans mon programme je dois vider le buffer sous peine de pas ne voir s'afficher mes printf() !!
    Mais pourquoi dans tout mon programme il n'y a que là que mes "sorties sont bufferisées" ?? C'est aléatoire comme "problème" ?
    Il est possible d'éviter ca ? ce serait peut être plus propre que fflush, et surtt ca m'embête de ne pas savoir concrètement quand mes printf s'afficheront où pas.
    je me vois mal "fflusher" tt les printf de mon prog lol.

    Merci de ton(oups votre ??) aide en tt cas, je suis moins bête qu'hier ...

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    En C il y a 2 fichiers standard de sortie (stdout et stderr) et un fichier standard d'entrée (stdin).

    stdout est bufferisé, c'est à dire que les messages sont envoyés dans un tampon, qui est vidé à une fréquence/une taille dépendant du système. Cependant, normalement, mettre un '\n' à la fin de la chaine à imprimer force le vidage.

    stderr lui n'est pas bufferisé, c'est à dire que tout message écrit sur stderr s'affiche tout de suite, qu'il soit ou non terminé par '\n'.

    On dit donc que stdout est asynchrone, ou temporisé, alors que stderr est synchrone.

    En ce qui concerne du debug, il vaut donc toujours mieux écrire sur stderr.. En ce qui concerne des sorties autres que pour le debug, le choix est à l'utilisateur. Et on peut combiner les 2...

    Note : il y a un deuxième effet de bufferisation, dû à la console... La console lisant le fichier et l'affichant. Il peut donc également y avoir un décalage à ce niveau-là (par exemple lors de grandes sorties, la console peut stocker 50 lignes, et afficher 50 par 50...)

  7. #7
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Acivurt
    Mais pourquoi dans tout mon programme il n'y a que là que mes "sorties sont bufferisées" ?? C'est aléatoire comme "problème" ?
    Il est possible d'éviter ca ?
    Ce n'est pas aléatoire, cela dépend de certains paramètres du système comme l'a mentionné souviron34. Si on souhaite forcer l'affichage sur stdout après un printf(), fflush(stdout); est une solution propre, standard, et tout à fait acceptable.

    Note: Même sans fflush(stdout);, les printf() finiront par s'afficher tôt ou tard.

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par souviron34
    En C il y a 2 fichiers standard de sortie (stdout et stderr) et un fichier standard d'entrée (stdin).
    <mode pedant=on>Le C parle de flux (streams), meme si le nom du type FILE porte un peu a confusion.<mode pedant=off>

    Acivurt: Tu as quelque-chose contre les '\n' ?

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par DaZumba
    <mode pedant=on>Le C parle de flux (streams), meme si le nom du type FILE porte un peu a confusion.<mode pedant=off>

    Acivurt: Tu as quelque-chose contre les '\n' ?
    lol ! Non mais j'aime pas ne pas savoir ce qui se passe dans mon programme ...
    Merci à vous deux en tt cas, les choses sont plus clairs maintenant !!

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

Discussions similaires

  1. Problème de fonction sans retour
    Par Bahan dans le forum C
    Réponses: 1
    Dernier message: 14/09/2007, 20h25
  2. Tableau sans retour chariot
    Par Tyler Durden dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 20/03/2007, 14h24
  3. Formulaire sans retour chariot
    Par Tyler Durden dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 20/02/2007, 17h50
  4. Ecrire ds fichier sans retour chariot
    Par totoche dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 01/08/2006, 21h39
  5. variable $_ sans retour chariot
    Par samipate dans le forum Langage
    Réponses: 1
    Dernier message: 11/11/2005, 18h15

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