Bonjour alors voila ... J'ai réalisé une application sous Windows (qui fonctionne) qui utilise la fonction kbhit ... j'utilise cette fonction enfait pour pouvoir arreter une boucle infinie.
de la facon suivante :
Maintenant je dois aussi faire tourner ce code sous linux ... Comme la fonction kbhit ne se trouve pas sous linux, j'ai trouvé dans les FAQ de developpez.net une fonction qui permettait d'avoir le même comportement que kbhit() sous windows.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 while(!quit){ if(kbhit()) out_char = getch(); if(out_char == 27) quit = true; }
Voici quand même le code si jamais:
et pour pouvoir utiliser cette fonction j'ai bien lu qu'il fallait placer la console en mode raw, ce que j'ai fais avec le code juste trouvé en dessous du code pour simuler la fonction kbhit():
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <unistd.h> #include <sys/time.h> int unix_kbhit(void) { struct timeval tv = { 0, 0 }; fd_set readfds; FD_ZERO(&readfds); FD_SET(STDIN_FILENO, &readfds); return select(STDIN_FILENO + 1, &readfds, NULL, NULL, &tv) == 1; }
Et donc j'ai changé la boucle infinie pour etre compatible avec linux puisque la fonction getch n'existe pas non plus ... Donc pour pouvoir l'utiliser, j'ai trouvé la fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #include <termios.h> #include <unistd.h> void mode_raw(int activer) { static struct termios cooked; static int raw_actif = 0; if (raw_actif == activer) { return; } if (activer) { struct termios raw; tcgetattr(STDIN_FILENO, &cooked); raw = cooked; cfmakeraw(&raw); tcsetattr(STDIN_FILENO, TCSANOW, &raw); } else { tcsetattr(STDIN_FILENO, TCSANOW, &cooked); } raw_actif = activer; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int getch(){ char ch; read(0,&ch,1); return ch; }
Une fois tout mis en place, et que je lance le programme, celui ci a un comportement assez bizzar, du faite que les printf réalisé s'écrive en diagonale... Et je n'ai pas l'impression que cela fonctionne aussi bien que sous windows (il ne detecte pas spécialement que j'appuie sur echap pour pouvoir arreter la boucle principale) ....
Auriez vous une idée sur le probleme ?
merci![]()
Partager