Aide pour développer en C++ sous Mac OS.

Sous Mac OS X, tout comme sous Windows, la console communique avec l'utilisateur au travers de flux standards (stdin pour l'entrée au clavier, stdout pour la sortie des textes à l'écran, strerr pour la sortie des textes d'erreur, tous manipulés par les fonctions définis dans <stdio.h>).

Or, ces flux transitent souvent par défaut par un tampon mémoire (buffer) de sorte que les données n'atteignent leur destination finale qu'en certains moments opportuns, et en une seule fois.

Dans le cas présent, le programme remplit le tampon de sortie, mais sans que les données n'apparaissent encore à l'écran parce que l'événement qui provoque leur affichage n'est pas encore survenu.

Pour que les données apparaissent en cours de traitement, le plus simple est de provoquer le vidage normal mais anticipé du tampon, en utilisant la fonction standard fflush() qui est également définie dans <stdio.h>. On peut faire fflush(sdtout) ou bien fflush(0) avant de lancer sleep() :
Bloc de code:
[COLOR="DarkRed"]#include <stdio.h>

#ifdef WIN32
[COLOR="Green"]// Ici déclarations spécifiques Windows
[/COLOR]    #include "windows.h"
[COLOR="Green"]    // Attente (en secondes), utilise Sleep (en millisecondes)
[/COLOR]    #define sleep(t) Sleep(1000*(t))

#else
[COLOR="Green"]// Ici déclarations POSIX (Mac et autres Unix)
[/COLOR]    #include <unistd.h>

#endif[/COLOR]

[COLOR="SlateGray"]...[/COLOR]

        printf( [COLOR="SlateGray"]...[/COLOR] );
        fflush( stdout );
        sleep( [COLOR="Navy"]1[/COLOR] );
 
'me semble que 0 c'est stdin et que stdout c'est 1 (stderr c'est 2), du moins sous UNIX :)
fflush(0) (ou plus exactement fflush(NULL), mais cela revient au même) provoque le flush sur tous les flux de sortie ouverts.

C'est clairement spécifié dans la doc de BSD ( faire 'man fflush' ) ainsi que dans celle de Microsoft.

L'assignation des flux standards à des chiffres telle que tu la décris correspond aux redirections (pipes) dans les lignes de commandes sur la console. Par exemple 'ma_commande 2> log.txt' redirige la sortie stderr (=2) vers le fichier 'log.txt'.

Sous BSD, il est en tout cas certain que stdin ne correspond pas à un pointeur nul.
 
fflush(0) (ou plus exactement fflush(NULL), mais cela revient au même) provoque le flush sur tous les flux de sortie ouverts.

C'est clairement spécifié dans la doc de BSD ( faire 'man fflush' ) ainsi que dans celle de Microsoft.

L'assignation des flux standards à des chiffres telle que tu la décris correspond aux redirections (pipes) dans les lignes de commandes sur la console. Par exemple 'ma_commande 2> log.txt' redirige la sortie stderr (=2) vers le fichier 'log.txt'.

Sous BSD, il est en tout cas certain que stdin ne correspond pas à un pointeur nul.

tout a fait ce que pointe pascal est important et il y a une confusion entre le file descriptor number fd et les constantes stdout stderr stdin qui sont des pointeurs sur une structure FILE de type stream

qui ont respectivement

FILE *stdin->fd = 0
FILE *stdout->fd = 1
FILE *stderr->fd = 2



voir stdio.h pour le detail:zen:
 
fflush(0) (ou plus exactement fflush(NULL), mais cela revient au même) provoque le flush sur tous les flux de sortie ouverts.

C'est clairement spécifié dans la doc de BSD ( faire 'man fflush' ) ainsi que dans celle de Microsoft.

L'assignation des flux standards à des chiffres telle que tu la décris correspond aux redirections (pipes) dans les lignes de commandes sur la console. Par exemple 'ma_commande 2> log.txt' redirige la sortie stderr (=2) vers le fichier 'log.txt'.

Sous BSD, il est en tout cas certain que stdin ne correspond pas à un pointeur nul.
Ah okay, je pensais que ça serait pareil pour les redirections de flux en ligne de commande et pour fflush :)

EDIT:
tatouille a dit:
voir stdio.h pour le detail :zen:
j'y suis !

EDIT2 : dans le premier stdio.h sur lequel je suis tombé en googlant (la flemme de pomme-tabber pour aller dans iTerm) :
Bloc de code:
/* Define ISO C stdio on top of C++ iostreams.
(...)
/* Standard streams.  */
extern FILE *stdin;		/* Standard input stream.  */
extern FILE *stdout;		/* Standard output stream.  */
extern FILE *stderr;		/* Standard error output stream.  */
/* C89/C99 say they're macros.  Make them happy.  */
#define stdin stdin
#define stdout stdout
#define stderr stderr
:D
 
Fiou un chtit peu compliqué tout ça. J'ai réussi à débugger mon programme heureusement je n'ai plus besoin du sleep(). Si jamais j'en ai encore besoin, je me pencherai plus dessus.

Merci à tous pour votre aide !