carriage return '\r' : fonctionne une fois sur 50 ???

carriage return '\r' : fonctionne une fois sur 50 ??? - C++ - Programmation

Marsh Posté le 13-04-2009 à 09:03:09    

J'ai un petit souci d'affichage dans une de mes fonctions, je ne comprends pas bien d'où ça vient.
 
 
A noter que cela foncitonne bien sous windows, ça merdouille depuis que je suis passé à Linux (je suis sous Ubuntu). Le bug que je décris se produit pour toutes les boucles de mon programme qui ont le même type d'affichage, en voici un exemple (dans une partie du programme qui est en C en fait) :
 

Code :
  1. void play_goia_tournament(Gameinfo *gameinfo, int nb_players) {
  2. int max_game = nb_players * 2;
  3. int game_nb;
  4. int winner;
  5. float score;
  6. printf("Starting tournament.\n" );
  7. for(game_nb = 0;game_nb<max_game;game_nb++) {
  8.  gnugo_clear_board(SIZEGOIA);
  9.  printf("\rPlaying game %d/%d",game_nb+1,max_game);
  10.  PickTwo(nb_players);
  11.  Play_Goia(gameinfo, &winner, &score);
  12.  Update_Score(winner, score);
  13. }
  14. Repro_mutate();
  15. Send_Receive_Players(nb_players);
  16. }


 
Le but est d'afficher "Playing game n/100" en mettant à jour n au fur et à mesure de l'avancement du tournoi. Le problème que je rencontre est que je vois n=51, n=102, n=151 et c'est tout. Visiblement, le tournoi se déroule correctement, le reste se passe bien.
 
Des idées/suggestions ?

Reply

Marsh Posté le 13-04-2009 à 09:03:09   

Reply

Marsh Posté le 13-04-2009 à 09:14:25    

c'ets pas juste le fait que l'affichage soit bufferisé et n'affiche qu'un certain nombre de valeurs ?

Reply

Marsh Posté le 13-04-2009 à 09:16:48    

Hmm peut-être oui, ce serait une question de configuration de ma console alors ? Une idée pour savoir où est-ce que ça se règle ?

Reply

Marsh Posté le 13-04-2009 à 12:25:06    

fflush(stdout)

Reply

Marsh Posté le 13-04-2009 à 12:25:49    

Joel F a écrit :

c'ets pas juste le fait que l'affichage soit bufferisé et n'affiche qu'un certain nombre de valeurs ?


Achete une télé 100Hz

Reply

Marsh Posté le 13-04-2009 à 12:50:38    

Et en remplaçant \r par \n ?

Reply

Marsh Posté le 13-04-2009 à 13:06:14    

Alter Ego a écrit :

Et en remplaçant \r par \n ?


Si j'ai bien compris ce qu'il veut faire, ce n'est pas le but recherché.
 
Comme l'a dit Taz : fflush(stdout) pour forcer le vidage du buffer.

Reply

Marsh Posté le 13-04-2009 à 13:45:11    

Ouep, vais tenter ça, sinon ya pas moyen de régler la taille du buffer de stdout dés le début ?

Reply

Marsh Posté le 13-04-2009 à 13:46:49    

hephaestos a écrit :

Ouep, vais tenter ça, sinon ya pas moyen de régler la taille du buffer de stdout dés le début ?


Si mais t'en ferais quoi ?  Tu vois bien que %d/%d ça n'a déjà pas une largeur fixe ...

Reply

Marsh Posté le 13-04-2009 à 13:54:20    

J'avais dans l'idée de le mettre à 1 pour qu'il affiche systématiquement ce que je mets dans stdout ?
 
Sinon je confirme que ça marche avec fflush :jap:

Reply

Marsh Posté le 13-04-2009 à 13:54:20   

Reply

Marsh Posté le 13-04-2009 à 13:57:19    

Mais du coup je ne comprends pas trop pourquoi il affiche pas ce qu'il a dans son buffer systématiquement dans ce cas, alors que tous les autres cout et printf marchent dirrectement ?

Reply

Marsh Posté le 13-04-2009 à 14:04:56    

Ok j'ai trouvé, sous linux ya pas de fflush automatique à moins de mettre un \n dans la chaine de caractères.
 
Merci pour le coup de main ! :jap:

Reply

Marsh Posté le 13-04-2009 à 16:27:14    

hephaestos a écrit :

Ok j'ai trouvé, sous linux ya pas de fflush automatique à moins de mettre un \n dans la chaine de caractères.

 

Merci pour le coup de main ! :jap:


C'est pas sous linux ... par défaut ça bufferise par ligne sur un terminal ...


Message édité par Taz le 13-04-2009 à 16:27:31
Reply

Marsh Posté le 13-04-2009 à 18:34:06    

Ah ben je t'assure qu'avec visual studio, le même programme ne bufferise rien du tout. La seule chose qui a changé est le compilateur.

Message cité 1 fois
Message édité par hephaestos le 13-04-2009 à 18:34:27
Reply

Marsh Posté le 13-04-2009 à 19:50:16    

* setvbuf() est standard et permet de choisir entre absence de bufferisation, bufferisation par ligne et complète.  Et pour Unix, un \r ne termine pas une ligne.
* en C++, il y a un flag unitbuf dans les IOStreams (c'est la difference entre clog et cerr)

Reply

Marsh Posté le 13-04-2009 à 20:38:38    

hephaestos a écrit :

Ah ben je t'assure qu'avec visual studio, le même programme ne bufferise rien du tout. La seule chose qui a changé est le compilateur.


C'est à dire tout. Mefie toi du mode debug, etc. En programmation, quand on veut quelque chose, on le code, on attend pas "que ça marche quand je clique".

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed