affichage pourcents déja calculé ???

affichage pourcents déja calculé ??? - C - Programmation

Marsh Posté le 01-02-2006 à 11:22:24    

bonjour,
 
je fais un petit programme en C qui m'affche le pourcentage déja calculé dans une boucle, c'est un truc du genre :
 

Code :
  1. for (i=0;i<taille_y;i++) {
  2.   for (j=0;j<taille_x;j++) {
  3. // ... blablabla
  4.   }
  5. fprintf(stderr,"%d%%\r",(int)floor( ((float)i/taille_y)*100));
  6. }


 
le truc que je comprend pas c'est que ca me l'affiche bien dans mon xterm si je fais un fprintf sur le stderr comme dans l'exemple, mais plus si je le fais sur le stdout !  :??:  ...qqu'un saurait-il pourquoi ???
 
merci par avance  [:arg]

Reply

Marsh Posté le 01-02-2006 à 11:22:24   

Reply

Marsh Posté le 01-02-2006 à 11:26:03    

ptet une bete histoire de flush ?

Reply

Marsh Posté le 01-02-2006 à 11:29:44    

+1, c'est logique stderr n'est pas bufferisé (comme il se doit)

Reply

Marsh Posté le 01-02-2006 à 11:33:59    

in_your_phion a écrit :

le truc que je comprend pas c'est que ca me l'affiche bien dans mon xterm si je fais un fprintf sur le stderr comme dans l'exemple, mais plus si je le fais sur le stdout !  :??:  ...qqu'un saurait-il pourquoi ???


http://mapage.noos.fr/emdel/notes.htm#fflush_stdout


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-02-2006 à 11:36:59    


Citation :


 Il y a trois critères qui déclenchent l'émission réelle des caractères :
 
    * Un '\n' a été placé dans le tampon


 
sauf en cas de redirection dudit flux vers un fichier [:klem3i1]

Reply

Marsh Posté le 01-02-2006 à 11:38:34    

heuh ..

Citation :


 Il est possible cependant de réduire la portée de la fonction à l'unité de compilation dans laquelle elle a été définie, en ajoutant le qualificateur static.[..] Certains compilateurs sont capables d'"inliner" une telle fonction dans certaines conditions, ce qui diminue le temps d'exécution au prix d'une augmentation de la taille (le code de la fonction est recopié autant de fois que nécessaire).


 
l'inlining n'a rien a voir avec la presence ou non de static [:le kneu] Bcp de compilo on besoin d'avoir le code de la fonction (et donc pas que sa declaration) sous la main au moment de la compilation pour faire l'inline, mais static n'y change rien

Message cité 2 fois
Message édité par chrisbk le 01-02-2006 à 11:39:29
Reply

Marsh Posté le 01-02-2006 à 11:41:45    

chrisbk a écrit :

Citation :


 Il y a trois critères qui déclenchent l'émission réelle des caractères :
 
    * Un '\n' a été placé dans le tampon


 
sauf en cas de redirection dudit flux vers un fichier [:klem3i1]


Ok, je vais le préciser.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-02-2006 à 11:43:36    

chrisbk a écrit :

heuh ..

Citation :


 Il est possible cependant de réduire la portée de la fonction à l'unité de compilation dans laquelle elle a été définie, en ajoutant le qualificateur static.[..] Certains compilateurs sont capables d'"inliner" une telle fonction dans certaines conditions, ce qui diminue le temps d'exécution au prix d'une augmentation de la taille (le code de la fonction est recopié autant de fois que nécessaire).


 
l'inlining n'a rien a voir avec la presence ou non de static [:le kneu] Bcp de compilo on besoin d'avoir le code de la fonction (et donc pas que sa declaration) sous la main au moment de la compilation pour faire l'inline, mais static n'y change rien


 
c'est ce que j'avais dit dans l'autre topic, static peut juste permetre au compilo de ne pas garder le code de la fonction

Message cité 1 fois
Message édité par skelter le 01-02-2006 à 11:44:24
Reply

Marsh Posté le 01-02-2006 à 11:47:22    

skelter a écrit :

c'est ce que j'avais dit dans l'autre topic, static peut juste permetre au compilo de ne pas garder le code de la fonction


 
oué. Ce qui n'est pas une grande optimisation vu qu'un linker intelligent  n'inserera pas les fonctions non utilisée dans l'exe final

Message cité 1 fois
Message édité par chrisbk le 01-02-2006 à 11:47:36
Reply

Marsh Posté le 01-02-2006 à 11:51:30    

chrisbk a écrit :

oué. Ce qui n'est pas une grande optimisation vu qu'un linker intelligent  n'inserera pas les fonctions non utilisée dans l'exe final


 
oui mais ca, ca ne concernerais pas uniquement les symboles externes ??

Message cité 1 fois
Message édité par skelter le 01-02-2006 à 11:51:50
Reply

Marsh Posté le 01-02-2006 à 11:51:30   

Reply

Marsh Posté le 01-02-2006 à 11:52:28    

skelter a écrit :

oui mais ca, ca ne concernerais pas uniquement les symboles externes ??


 
What ? jcrois on se comprends pas trotro bien la :d

Reply

Marsh Posté le 01-02-2006 à 12:00:07    

tu dis que le linker sait faire ce genre de tri (inserer une fonction seulement si elle est appelé) mais ca ne serais pas logique qu'il fasse de meme avec une fonction 'static', c'est le travail du compilateur, c'est lui qui sait ce qui se passe dans une unité de traduction
 
edit: de plus ca explique ce comportement (de gcc du moin, les autres compilo je ne sais pas)


Message édité par skelter le 01-02-2006 à 12:00:54
Reply

Marsh Posté le 01-02-2006 à 12:01:29    

heuh ... [:petrus75] par inserer, tu entends quoi ? faire l'inlining ou inserer le code de la fonction dans l'exe / dll final ?

Reply

Marsh Posté le 01-02-2006 à 12:04:33    

inserer le code dans l'exe

Reply

Marsh Posté le 01-02-2006 à 12:06:10    

chrisbk a écrit :

heuh ..

Citation :


 Il est possible cependant de réduire la portée de la fonction à l'unité de compilation dans laquelle elle a été définie, en ajoutant le qualificateur static.[..] Certains compilateurs sont capables d'"inliner" une telle fonction dans certaines conditions, ce qui diminue le temps d'exécution au prix d'une augmentation de la taille (le code de la fonction est recopié autant de fois que nécessaire).


 
l'inlining n'a rien a voir avec la presence ou non de static [:le kneu] Bcp de compilo on besoin d'avoir le code de la fonction (et donc pas que sa declaration) sous la main au moment de la compilation pour faire l'inline, mais static n'y change rien


Mmmm...  
 
Une fonction non static (donc exportable aka with external linkage) ne peut pas être 'inlinée', car comme elle peut être appelée de l'extérieur, elle doit avoir un point d'entrée et donc un point de sortie, ce que n'ont pas les fonctions 'inlinées'.  
 
Par contre, toutes les fonctions 'static' ne peuvent pas être 'inlinées', notamment si on a besoin de leur addresse pour un callback ou tout autre appel via un pointeur de fonction...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-02-2006 à 12:06:22    

bah ca me parait quand meme assez etre le boulot du linker, c'est le seul a avoir une vision a peu pres globale du progamme (le compilo n'en a qu'une vision partielle, nommément une par unité de compilation)
 
Le linker connait tous les symboles presents, le(s) point(s) d'entrée. Si en plus il connait quels symboles en utilise quel autre (genre la fonction A utilise les fonctions C et B) alors il peut en déduire les symboles utilisés dans le programme et laisser de coté les autres
 

Reply

Marsh Posté le 01-02-2006 à 12:07:57    

Emmanuel Delahaye a écrit :

Mmmm...  
 
Une fonction non static (donc exportable aka with external linkage) ne peut pas être 'inlinée', car comme elle peut être appelée de l'extérieur, elle doit avoir un point d'entrée et donc un point de sortie, ce que n'ont pas les fonctions 'inlinées'.  


 
Je vois ton point, mais pourquoi ne pas l'inliner la ou elle peut l'etre et en garder une copie "normale" pour les autres cas ? Une fois de plus, le linker pourra degager cette derniere copie si jamais elle n'est jamais appelé

Message cité 2 fois
Message édité par chrisbk le 01-02-2006 à 12:08:32
Reply

Marsh Posté le 01-02-2006 à 12:08:16    

c'est vrai, en fait c'est juste que le compilateur peut égalment faire ce boulot pour une fonction static mais si tu dis que de toute facon le linker peut le faire et le fait...

Reply

Marsh Posté le 01-02-2006 à 12:09:19    

skelter a écrit :

c'est vrai, en fait c'est juste que le compilateur peut égalment faire ce boulot pour une fonction static mais si tu dis que de toute facon le linker peut le faire et le fait...


 
Ouaip. D'ailleurs gcc te previens quand tu fais défini un symbole statique sans l'utiliser

Reply

Marsh Posté le 01-02-2006 à 12:09:52    

chrisbk a écrit :

Je vois ton point, mais pourquoi ne pas l'inliner la ou elle peut l'etre et en garder une copie "normale" pour les autres cas ? Une fois de plus, le linker pourra degager cette derniere copie si jamais elle n'est jamais appelé


 
+1, c'est ce que fais gcc et c'est bien préciser dans la doc, il gardera le code si la fonction est non static

Reply

Marsh Posté le 01-02-2006 à 12:19:56    

chrisbk a écrit :

Je vois ton point, mais pourquoi ne pas l'inliner la ou elle peut l'etre et en garder une copie "normale" pour les autres cas ? Une fois de plus, le linker pourra degager cette derniere copie si jamais elle n'est jamais appelé


Peut être, ça fait un peu usine à gaz, mais les compilateurs sont libres de faire ce qu'ils veulent... du moment que le comportement est conforme...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-02-2006 à 12:24:00    

Usine a gaz, pas tant que ca, apres tout le principe d'inlining c'est bien la recopie de code de fonctions en plusieurs endroits, donc ca reste de toute facon coherent.  
 
d'ailleurs
 

Code :
  1. static int inutile()
  2. {
  3. return 20;
  4. }


 
sera (j'espere=) inliné par un compilo, mais il aura besoin d'une copie si jamais on ecrit :
 
 

Code :
  1. int (*machin )() = inutile;


 
donc bon

Reply

Marsh Posté le 01-02-2006 à 12:28:00    

chrisbk a écrit :

ptet une bete histoire de flush ?


 
 
ça marche avec le fllush  :)  Merci à tous, et pour les explications !  [:arg]  [:arg]  [:arg]


Message édité par in_your_phion le 01-02-2006 à 12:28:39
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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