FONCTIONS KBHIT() ET GETCH() SOUS LINUX (DOIT MARCHER AVEC TOUT OS À BASE D'UNIX
yapud
Messages postés8Date d'inscriptionmercredi 12 mars 2003StatutMembreDernière intervention25 juin 2004
-
2 avril 2003 à 12:52
cyk1986
Messages postés4Date d'inscriptiondimanche 30 octobre 2005StatutMembreDernière intervention16 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.
cyk1986
Messages postés4Date d'inscriptiondimanche 30 octobre 2005StatutMembreDernière intervention16 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és4Date d'inscriptiondimanche 30 octobre 2005StatutMembreDernière intervention16 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és1Date d'inscriptionjeudi 5 février 2009StatutMembreDerniè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és1Date d'inscriptionjeudi 23 août 2007StatutMembreDernière intervention15 décembre 2007 15 déc. 2007 à 12:44
Merci beaucoup pour ton code :)
Bonne continuation :)
GlanduSchmoldu
Messages postés199Date d'inscriptionmardi 23 décembre 2003StatutMembreDernière intervention27 octobre 20061 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és199Date d'inscriptionmardi 23 décembre 2003StatutMembreDernière intervention27 octobre 20061 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és338Date d'inscriptionjeudi 22 août 2002StatutMembreDernière intervention14 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és42Date d'inscriptionmercredi 10 septembre 2003StatutMembreDernière intervention 8 février 2004 4 févr. 2004 à 19:57
Voila le clone de la fonction clsrcr() de conio.h, made by Sylvain et Sirius
Siriusgalaxie26
Messages postés42Date d'inscriptionmercredi 10 septembre 2003StatutMembreDerniè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és6Date d'inscriptionmardi 16 septembre 2003StatutMembreDernière intervention 8 juin 2005 4 févr. 2004 à 17:41
Essaye ca : (en prime, gotoxy() et _setcursortype())
Siriusgalaxie26
Messages postés42Date d'inscriptionmercredi 10 septembre 2003StatutMembreDerniè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és6Date d'inscriptionmardi 16 septembre 2003StatutMembreDerniè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és71Date d'inscriptionmercredi 17 juillet 2002StatutMembreDernière intervention20 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és6Date d'inscriptionmardi 16 septembre 2003StatutMembreDerniè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és518Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 novembre 20073 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és71Date d'inscriptionmercredi 17 juillet 2002StatutMembreDernière intervention20 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;
// 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és518Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 novembre 20073 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és71Date d'inscriptionmercredi 17 juillet 2002StatutMembreDernière intervention20 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és8Date d'inscriptionmercredi 12 mars 2003StatutMembreDernière intervention25 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).
20 août 2009 à 12:24
20 août 2009 à 12:23
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();
5 févr. 2009 à 19:07
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.
15 déc. 2007 à 12:44
Bonne continuation :)
9 mai 2005 à 21:31
Il suffit donc, si par hasard qqun avait ce genre de problème, de remplacer read() par getchar().
Voilà.
3 mai 2005 à 19:28
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.
12 juin 2004 à 11:31
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.
4 févr. 2004 à 19:57
void clrscr(void){
printf("\033[2J");
gotoxy(0,0);
}
Voila le clone de la fonction clsrcr() de conio.h, made by Sylvain et Sirius
4 févr. 2004 à 19:28
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+
4 févr. 2004 à 17:41
#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 )
4 févr. 2004 à 14:31
15 oct. 2003 à 15:24
c vrai, j'oubliais, peut etre que l'auteur de cet article est lui meme a l'origine de cet exemple ;-)
Sans rancune,
Sylvain
15 oct. 2003 à 12:59
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 !
15 oct. 2003 à 11:26
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
3 avril 2003 à 07:40
Merci MickBad
Bouba
2 avril 2003 à 22:11
... 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
2 avril 2003 à 19:05
Bouba
2 avril 2003 à 15:58
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
2 avril 2003 à 12:52
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