# [c] Effacer l'écran



## Yggdrasill (4 Février 2006)

Bonjour,

J'aimerais savoir deux petite chose :
Le permière, c'est de savoir si Mac Os X charge les codes ansi au boot ou non et la deuxième serait de savoir comment, si c'est faisable, on peut effacer l'ecran dans un programme tournant en console (un equivalent au system ("cls") de windows en gros...).
Au cours, nous avons vu un
	
	



```
printf ("\x1B[jj");
```
 mais visiblement ça ne marche pas...(j'ai peut-être mal pris note aussi hein!

SI qq1 aurait une réponses à mes interrogations...

Merci bcp !


----------



## Pedro (4 Février 2006)

Une façon "bête et méchante" d'effacer l'écran sur un programme affichant du texte sur console, c'est de lui faire imprimer une vingtaine de lignes vides :

for(i=1;i<21;i++) {printf" \n");}

Mais il existe sûrement des méthodes plus sophistiquées...


----------



## ntx (4 Février 2006)

Une instruction du type :

```
#include <stdlib.h>
...
system("clear");
...
```


----------



## Yggdrasill (4 Février 2006)

Pedro a dit:
			
		

> Une façon "bête et méchante" d'effacer l'écran sur un programme affichant du texte sur console, c'est de lui faire imprimer une vingtaine de lignes vides :
> 
> for(i=1;i<21;i++) {printf" \n");}
> 
> Mais il existe sûrement des méthodes plus sophistiquées...



J'espère, je doute que ce genre de manipulation soit aprécié par le profs :s.

En ce qui concerne le system ("clear"), j'essayerais demain. Je pensait que stdlib.h ne fonctionnait que sous windows.

Merci !


----------



## Didier Guillion (5 Février 2006)

Bonjour,

Si tu travaille en C ANSI, je ne pense pas qu'il existe une commande pour effacer l'écran. 

En C ANSI, considere qu'il n'y a pas d'écran, mais plutot une imprimante a marguerite. Tu ne peut donc n'y effacer, ni revenir en arrière. (Mais je crois que tu peut faire beeper l'imprimante avec \b )
A noter que la suggestion d'afficher plusieurs lignes vides, est a mon avis, la seule vraiment standard.

Cordialement


----------



## ntx (5 Février 2006)

Didier Guillion a dit:
			
		

> A noter que la suggestion d'afficher plusieurs lignes vides, est a mon avis, la seule vraiment standard.


Oui, car le clear est à réserver aux UNIX


----------



## Yggdrasill (5 Février 2006)

ntx a dit:
			
		

> Oui, car le clear est à réserver aux UNIX



Effectivement, le clear ne marche pas. Je trouve ça bizare, car dans un terminla, clear a bel et bien l'effet escompté...
Et si on devient un peu moins ansi, n'y a t'il pas un moyen d'effacer l'ecran ?
Mon prof m'avait parlé d'une procedure permettant de changer les codes ansi, que l'on soit sous windows ou non, et qu'ainsi on pouvait utiliser les meme commandes pour effacer l'ecran que l'on soit sous win, nux ou mac. Malheureusement il ne sait plus ou il a vu ça...


----------



## Didier Guillion (5 Février 2006)

Yggdrasill a dit:
			
		

> Effectivement, le clear ne marche pas. Je trouve ça bizare, car dans un terminla, clear a bel et bien l'effet escompté...
> Et si on devient un peu moins ansi, n'y a t'il pas un moyen d'effacer l'ecran ?
> Mon prof m'avait parlé d'une procedure permettant de changer les codes ansi, que l'on soit sous windows ou non, et qu'ainsi on pouvait utiliser les meme commandes pour effacer l'ecran que l'on soit sous win, nux ou mac. Malheureusement il ne sait plus ou il a vu ça...




je pense que ton prof veut parler de ca :
http://www.isthe.com/chongo/tech/comp/ansi_escapes.html

et plus precisement de :
 ESC[2J

(normalement ESC est le caractere ASCII 27 décimal)

Codialement


----------



## hopkins (5 Février 2006)

Yggdrasill a dit:
			
		

> Effectivement, le clear ne marche pas. Je trouve ça bizare, car dans un terminla, clear a bel et bien l'effet escompté...
> Et si on devient un peu moins ansi, n'y a t'il pas un moyen d'effacer l'ecran ?
> Mon prof m'avait parlé d'une procedure permettant de changer les codes ansi, que l'on soit sous windows ou non, et qu'ainsi on pouvait utiliser les meme commandes pour effacer l'ecran que l'on soit sous win, nux ou mac. Malheureusement il ne sait plus ou il a vu ça...




dans un autre domaine, pour conserver mon code portable (mac, unix, pc) je passe par le préprocesseur
une variable à modifier avant la compilation et le code est acclimaté à l'environnement défini !


----------



## Yggdrasill (5 Février 2006)

Didier Guillion a dit:
			
		

> je pense que ton prof veut parler de ca :
> http://www.isthe.com/chongo/tech/comp/ansi_escapes.html
> 
> et plus precisement de :
> ...



C'est exactement ce dont ja parlais. Merci.
sous Linux, ca marche parfaitement, mais sous tiger... c'est une autre histoire. Pour avoir ESC, ce n'est deja plus 1B (27 en decimal) mais 25 (37 en décimal) que je dois taper, mais malgré cela, il affiche stupidement [2J dans mon programme....


----------



## Didier Guillion (5 Février 2006)

hopkins a dit:
			
		

> dans un autre domaine, pour conserver mon code portable (mac, unix, pc) je passe par le préprocesseur
> une variable à modifier avant la compilation et le code est acclimaté à l'environnement défini !



Je me permet de preciser ton explication.

Chaque compilateur defini une ou plusieurs *constantes* de maniere automatique

_Astuce: En C les constantes sont toujours écrites en majuscule et uniquement elles, par exemple GCC4 est une constante. Gcc4 autre chose. _

Lors de la compilation, on peut faire de la compilation conditionnelle en fonction de l'environnement.
C'est a dire, qu'en fonction de l'environnement où l'on compile, le source compilé sera different.

Par exemple imagine que sur Mac, tu utilise XCode et autre chose sur PC.

Le source C compilé sur Mac aura la constante XCODE définie.

On peut donc écrire
#ifdef XCODE
   ClearScreen();
#else
    clrscr();
#endif

La fonction ClearScreen sera appellée sur Mac et clrscr ailleurs.

Cordialement


----------



## Yggdrasill (7 Février 2006)

Merci bcp pour ton explication, mais je ne comprend pas trop comment utiliser la constante... Dois-je appeller "XCODE" dans mon code (ne marche pas ), ClearScreen? 

Merci bien !


----------



## Didier Guillion (7 Février 2006)

Yggdrasill a dit:
			
		

> Merci bcp pour ton explication, mais je ne comprend pas trop comment utiliser la constante... Dois-je appeller "XCODE" dans mon code (ne marche pas ), ClearScreen?
> 
> Merci bien !



L'exemple est juste pour te montrer comment mettre en place une compilation conditionnelle.

Cordialement


----------



## Yggdrasill (7 Février 2006)

Didier Guillion a dit:
			
		

> L'exemple est juste pour te montrer comment mettre en place une compilation conditionnelle.
> 
> Cordialement



Ah, ok. Autant pour moi 

Mais, si je comprend bien ton exemple, ClearScreen(); devrait, sous Mac, permettre d'éffacer l'écran non? Or chez moi lorsque je tape un ClearScreen, on dirait qu'il ne connait pas cette fonction ! Dois-je inclure un header particulier?

Merci !


----------



## Didier Guillion (8 Février 2006)

Yggdrasill a dit:
			
		

> Ah, ok. Autant pour moi
> 
> Mais, si je comprend bien ton exemple, ClearScreen(); devrait, sous Mac, permettre d'éffacer l'écran non? Or chez moi lorsque je tape un ClearScreen, on dirait qu'il ne connait pas cette fonction ! Dois-je inclure un header particulier?
> 
> Merci !



Ce que tu cite, c'est juste un exemple de compilation conditionnelle. Tu dois écrire la fonction ClearScreen(), ce n'est pas une fonction prédéfinie.

Cordialement


----------



## Yggdrasill (8 Février 2006)

Didier Guillion a dit:
			
		

> Ce que tu cite, c'est juste un exemple de compilation conditionnelle. Tu dois écrire la fonction ClearScreen(), ce n'est pas une fonction prédéfinie.
> 
> Cordialement




Ah ok, merci ! Donc, si j'ai bien compris, seule la methode "bourrine" de Pedro fonctionne...

Je m'en vais coder ça, Merci !


----------



## ybart (8 Février 2006)

La commande system("clear") fonctionne dans le vrai terminal de Mac OS X, mais pas dans la console de Xcode. Il existe un réglage pour effacer la console Xcode à chaque éxecution du programme

http://forums.macrumors.com/showthread.php?t=178583

De toutes façons, même si clear n'a pas d'effet dans Xcode, la commande fonctionnera lorsque le programme sera éxécuté de façon autonome.


----------



## Yggdrasill (8 Février 2006)

ybart a dit:
			
		

> La commande system("clear") fonctionne dans le vrai terminal de Mac OS X, mais pas dans la console de Xcode. Il existe un réglage pour effacer la console Xcode à chaque éxecution du programme
> 
> http://forums.macrumors.com/showthread.php?t=178583
> 
> De toutes façons, même si clear n'a pas d'effet dans Xcode, la commande fonctionnera lorsque le programme sera éxécuté de façon autonome.




Ca c'est de la bonne nouvelle ! Merci bcp pour l'info !

Mais puisque j'utilise un system("clear"); je ne devrais pas inclure ncurse.h?

merci !


----------



## Didier Guillion (9 Février 2006)

Yggdrasill a dit:
			
		

> Ah ok, merci ! Donc, si j'ai bien compris, seule la methode "bourrine" de Pedro fonctionne...
> 
> Je m'en vais coder ça, Merci !




Je pense que les systemes d'echappement devraient fonctionner.

Cordialement


----------



## hopkins (9 Février 2006)

ybart a dit:
			
		

> La commande system("clear") fonctionne dans le vrai terminal de Mac OS X, mais pas dans la console de Xcode. Il existe un réglage pour effacer la console Xcode à chaque éxecution du programme
> 
> http://forums.macrumors.com/showthread.php?t=178583
> 
> De toutes façons, même si clear n'a pas d'effet dans Xcode, la commande fonctionnera lorsque le programme sera éxécuté de façon autonome.



l'appel system clear doit faire partie de la norme POSIX non ?


----------

