FONCTIONS KBHIT() ET GETCH() SOUS LINUX (DOIT MARCHER AVEC TOUT OS À BASE D'UNIX

yapud Messages postés 8 Date d'inscription mercredi 12 mars 2003 Statut Membre Dernière intervention 25 juin 2004 - 2 avril 2003 à 12:52
cyk1986 Messages postés 4 Date d'inscription dimanche 30 octobre 2005 Statut Membre Dernière intervention 16 avril 2006 - 20 août 2009 à 12:24
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/10611-fonctions-kbhit-et-getch-sous-linux-doit-marcher-avec-tout-os-a-base-d-unix-freebsd-etc

cyk1986 Messages postés 4 Date d'inscription dimanche 30 octobre 2005 Statut Membre Dernière intervention 16 avril 2006
20 août 2009 à 12:24
en lisant les comment plus haut, je précise: fflush (stdout); permet de ne aps faire de "\n" pour afficher la sortie.
cyk1986 Messages postés 4 Date d'inscription dimanche 30 octobre 2005 Statut Membre Dernière intervention 16 avril 2006
20 août 2009 à 12:23
MERCI !
pour ceux qui voudraient exploiter de manière simple, un exemple bête avec le fflush en plus (chez moi ça ne marche pas bien sans ça.(ubuntu))
char a=100;
Keyboard Clavier;
Clavier.Initialisation();
while (a--)
{
printf ( "\a%c_", Clavier.getch() );
fflush (stdout);
}
Clavier.Arret();
roger400t Messages postés 1 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 5 février 2009
5 févr. 2009 à 19:07
Merci pour ce code.
Le premier résultat dans google fonctionne du premier coup c'est merveilleux.
Personnellement, j'ai remplacé Initialisation et Arret par un constructeur et un destructeur.
C'est plus paresseux à utiliser.
MrAhah Messages postés 1 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 15 décembre 2007
15 déc. 2007 à 12:44
Merci beaucoup pour ton code :)
Bonne continuation :)
GlanduSchmoldu Messages postés 199 Date d'inscription mardi 23 décembre 2003 Statut Membre Dernière intervention 27 octobre 2006 1
9 mai 2005 à 21:31
Bon j'ai compris. Chez moi, la fonction read(), grâce aux manips de bouba (que je remercie), n'attend pas la touche entrée pour se débloquer, mais par contre elle l'attend pour repermettre l'affichage, donc rien ne s'affiche tant qu'on ne fait pas un printf("\n"). Pas très grave mais chez moi ça me posais problème.
Il suffit donc, si par hasard qqun avait ce genre de problème, de remplacer read() par getchar().
Voilà.
GlanduSchmoldu Messages postés 199 Date d'inscription mardi 23 décembre 2003 Statut Membre Dernière intervention 27 octobre 2006 1
3 mai 2005 à 19:28
Bon alors je comprend pas bien comment ça marche.
Si VMIN = 0, j'ai des problèmes, c'est à dire que kbhit me renvoie le code de la dernière touche pressée, même quand j'arrête d'appuyer, donc je peux pas savoir si on vient d'appuyer ou pas. J'ai essayé en regardant le nombre de caractères lus comme dans la remarque de mickbad, mais ça renvoie tjrs la même valeurs, une centaine de millions.

En fait si qqun pouvois m'expliquer comment marche la fonction read je comprendrais mieux.

Enfin bon c'est qd même déjà bien, merci.
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
12 juin 2004 à 11:31
les extern "C" pour les includes / déclarations C :o
sinon, je pense que Initialisation devrait etre le constructeur, et Arret le destructeur, c'est tout l'interet de l'encapsulation dans une classe.
Egalement je pense que ce serait une bonne idée de fournir une interface portable, pour cela mettre des #ifdef WIN32 un peut partout pour selectionner les bons includes, et le bon code a executer.
Siriusgalaxie26 Messages postés 42 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 8 février 2004
4 févr. 2004 à 19:57
#define gotoxy( x, y) printf("\033[%d;%dH", y, x)
void clrscr(void){
printf("\033[2J");
gotoxy(0,0);
}

Voila le clone de la fonction clsrcr() de conio.h, made by Sylvain et Sirius
Siriusgalaxie26 Messages postés 42 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 8 février 2004
4 févr. 2004 à 19:28
Ouais, ca marche, merci :-)

Un seul hic, quand j'efface l'écran avec ta methode, il ne me remet pas en haut à gauche, mais fait un "trou" dans la console. Je pense pourvoir bidouiller avec ton gotoxy() (très utile. merci)

A+
sylvainmarechal Messages postés 6 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 8 juin 2005
4 févr. 2004 à 17:41
Essaye ca : (en prime, gotoxy() et _setcursortype())

#define _NOCURSOR 0
#define _SOLIDCURSOR 1
#define _NORMALCURSOR 2

#define gotoxy( x, y) printf("\033[%d;%dH", y, x)
#define clrscr() printf("\033[2J")
#define _setcursortype( cur_t )
Siriusgalaxie26 Messages postés 42 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 8 février 2004
4 févr. 2004 à 14:31
Pas mal la converstion... et qu'en est-il de par exemple la fonction clrscr() ??
sylvainmarechal Messages postés 6 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 8 juin 2005
15 oct. 2003 à 15:24
D'acc sur tous les points avec toi, sauf que qd on pompe du code, c'est toujours utile de donner ses sources (ds ts les sens du terme) , plutot que de dire qu'on l'a fait soit meme ("J'ai donc créé une classe") alors qu'on retrouve le meme code mot pour mot un peu partout sur Internet.
c vrai, j'oubliais, peut etre que l'auteur de cet article est lui meme a l'origine de cet exemple ;-)
Sans rancune,
Sylvain
mickbad Messages postés 71 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 20 avril 2008
15 oct. 2003 à 12:59
pfff ...

OpenSource man : on se sert des travaux de tout le monde pour avancer plus vite, non ?

en tout cas, ce code existe bien avant ce livre je te le garanti et aussi d'en d'autre livre comme "Programmation système en C sous Linux" (bien qu'il faille faire queque transformation :))

enfin pense aussi à ceux qui recherche ce genre de fonction et ne savent pas ou réellement trouver !
sylvainmarechal Messages postés 6 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 8 juin 2005
15 oct. 2003 à 11:26
Juste 1 ptite remarque :
Vous pourriez dire que vous avez pompé ce code texto ds le bouquin "Beginning Linux Programming" de www.wrox.com :
http://web.wrox.com/0764543733/2971.tar.gz (kbhit.c)

Sylvain
cs_bouba Messages postés 518 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 novembre 2007 3
3 avril 2003 à 07:40
Tu as un pe raison c'est vrai, c'est plus pratique de mettre ca dans une simple fonction, en tout cas je suis sûr que ca va servir au newbies de la prog sous Linux.
Merci MickBad
Bouba
mickbad Messages postés 71 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 20 avril 2008
2 avril 2003 à 22:11
Emulation en C de la fonction kbhit que j'utilise souvent dans mes dev sur linux

... et c'est la même chose que toi sans class :))

ta classe est très bien (sisi) mais avantage de la fonction type C: facile de faire le dev cross-plateforme ensuite (ie : dans le main par exple, lorsque tu appelles kbhit(), tu n'es pas obligé de l'entourer avec des #ifdef _Windows pour gérer la compilation Win32 et GNU :)



#include <termios.h>

int kbhit() {
// * Emulatiion de la fonction kbhit() de DOS
// variables de lecture
char ch;
int nread;
struct termios origTerm, newTerm;

// vérification d'usage
if(peek != -1)
return 1;

// préparation du terminal
tcgetattr(0, &origTerm);
newTerm = origTerm;
newTerm.c_lflag &= ~ICANON;
newTerm.c_lflag &= ~ECHO;
newTerm.c_lflag &= ~ISIG;
newTerm.c_cc[VMIN] = 1;
newTerm.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &newTerm);

// écoute clavier
newTerm.c_cc[VMIN]=0;
tcsetattr(0, TCSANOW, &newTerm);
nread = read(0,&ch,1);
newTerm.c_cc[VMIN]=1;
tcsetattr(0, TCSANOW, &newTerm);

// Rétablissement du terminal
tcsetattr(0,TCSANOW, &origTerm);

// test de lecture
if (nread == 1) {
peek = ch;
return 1;
}
return 0;
} // fin de la fonction kbhit()


ceci dit ... la classe C++ est fort intéressante car applicable facilement !

MickBad
cs_bouba Messages postés 518 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 novembre 2007 3
2 avril 2003 à 19:05
Oui, getch() est en effet présent dans curses, je le sais. Mais cette librairie possède son propre mode d'affichage, il faut utiliser obligatoirement le printw() et pas cout par exemple sans koi ca risque de ne pas produire l'effet souhaité, curses est une librairie utilisée pour programmer en C et pas en C++. Et puis de tout de façon kbhit() n'est pas sous curses. Voila, la classe que j'ai créée est donc parfaite pour être utilisé dans un programme basic C ou C++ avec affichage sous konsole normal (pas d'affichage spécifique a une librairie comme curses ou autre). Si vous le souhaitez vous pouvez modifier mon code afin de ne pas avoir de classe mais une simple fonction. Mais je trouve ke c'est plus claire comme ceci.
Bouba
mickbad Messages postés 71 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 20 avril 2008
2 avril 2003 à 15:58
Salut,

Effectivement la librairie curses est là entre autre pour bénéficier de conio.h sous gnu.

Cependant, si on veut faire du développement en environnement réduit ou tout simplement faire un programme très petit, il est interessant d'avoir ce genre de code car on n'a pas forcément besoin de toutes les fonctions.

pour info, la librairie utilisée pour curses fait environ 253Ko ... pas bcp mais des fois c'est largement trop surtout pour utiliser un kbhit() et un getch(), héhé :)))

voilà mais c'est normal de parler de curses (ouf :))
MickBad
yapud Messages postés 8 Date d'inscription mercredi 12 mars 2003 Statut Membre Dernière intervention 25 juin 2004
2 avril 2003 à 12:52
Bonjour,

Juste pour dire : La fonction GETCH() existe déjà sous LINUX. En tout cas dans ma distribution. Elle se trouve dans CURSES.H et marche comme sous Windows (aprés quelques initialisations).

Voilà c'est tout.

YAPUD
Rejoignez-nous