#1 Le 23/10/2013, à 11:03
- on4ldj
Problème d'affichage dans terminal après exécution d'un prg en C
Bonjour à tous,
J'ai écrit un petit programme en C avec mode canonique.
La re-configuration d'origine n'a pas l'aire de se faire dans le "close_keyboard ()"
En sortie du programme les entrées claver ne s'affichent plus à l'écran mais fonctionnent (sauf la touche effacer)
J'ai repris les modules "void init_keyboard()" et "void close_keyboard ()" sur le sans trop les maîtriser.
je vous montre ça:
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <curses.h>
#include <time.h>
#include <sys/io.h>
static struct termios initial_settings, new_settings, old, new;
static int peek_character = -1;
int secondes,millisecondes,usleep(useconds_t usec),rec,recs,recms,kbhit(),null, readch(); //close_keyboard(void), init_keyboard(void);
char s, c='m',ch;
void init_keyboard()
{
tcgetattr(0,&initial_settings);
new_settings = initial_settings;
new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO;
new_settings.c_lflag &= ~ISIG;
new_settings.c_cc[VMIN] = 1;
new_settings.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &new_settings);
}
void close_keyboard ()
{
new.c_lflag &= ~ECHO || ECHOCTL;
tcsetattr(0, TCSANOW, &initial_settings);
}
void gotoxy(int x,int y)
{
printf("%c[%d;%df",0x1B,y,x);
}
int kbhit()
{
int nread;
if(peek_character != -1)
return 1;
new_settings.c_cc[VMIN]=0;
tcsetattr(0, TCSANOW, &new_settings);
nread = read(0,&ch,1);
new_settings.c_cc[VMIN]=1;
tcsetattr(0, TCSANOW, &new_settings);
if(nread == 1)
{
peek_character = ch;
return 1;
}
return 0;
}
int readch()
{
char ch;
if(peek_character != -1)
{
ch = peek_character;
peek_character = -1;
return ch;
}
read(0,&ch,1);
return ch;
}
int main (void)
{
init_keyboard;
debut:
recs=99; recms=99;
srand(time(NULL));
secondes=(rand()%5)+1;
system("clear");
//gotoxy(10,10);
//printf (" Entrez le temps du compte à rebours au format ss: ");
//scanf ("%d", &secondes);
while(secondes>=0)
{
while(millisecondes>=1)
{
system("clear");
gotoxy(35,15);
printf("-%02d:%02d\n",secondes, millisecondes);
if(kbhit())
{
s='-'; recs=secondes; recms=millisecondes; rec=readch();
}
usleep(6833);
millisecondes--;
}
millisecondes=99;
secondes--;
}
gotoxy(35,13);
printf ("********************\n");
gotoxy(35,14);
printf ("* TOP *\n");
gotoxy(35,15);
printf ("********************\n");
while(secondes<=4)
{
while(millisecondes<=99)
{
if(kbhit())
{
s='+'; recs=secondes; recms=millisecondes; rec=readch();
}
gotoxy(35,20);
printf("%02d:%02d\n",secondes, millisecondes);
usleep(6833);
millisecondes++;
}
millisecondes=00;
secondes++;
}
gotoxy(35,25);
printf ("%c%02d:%02d secondes\n", s, recs, recms);
boucle:
gotoxy(1,30);
printf (" On recommence ? o/n :");
scanf ("%c", &c);
if (c == 'o') {goto debut;}
if (c != 'n') {goto boucle;}
system("clear");
gotoxy (1,1);
close_keyboard();
exit(0);
}
A vrai dire les modules init et close clavier ne fonctionnent pas du tout. pas de changement en les supprimant.
Qu'en pensez-vous ? ou est mon erreur ?
Merci pour votre aide.
Frank
Dernière modification par on4ldj (Le 23/10/2013, à 14:51)
Hors ligne
#2 Le 23/10/2013, à 11:11
- Bigcake
Re : Problème d'affichage dans terminal après exécution d'un prg en C
Bonjour
Et ARGGHHH !! Peut-tu mettre ton code dans une balise code ? (le signe <> bleu)
Personnellement pour "désactiver l'affichage de la saisie clavier" j'utilise le code suivant :
/* Initialisation */
struct termios old, new;
if (tcgetattr(fileno(stdin), &old) != 0)
error();
new = old;
new.c_lflag &= ~ECHO || ECHOCTL;
/* désactivation de l'affichage */
if (tcsetattr(fileno(stdin), TCSAFLUSH, &new) != 0)
error();
/* réactivation de l'affichage */
if (tcsetattr(fileno(stdin), TCSAFLUSH, &old) != 0)
error();
Dernière modification par Bigcake (Le 23/10/2013, à 11:12)
"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5
Hors ligne
#3 Le 23/10/2013, à 12:02
- on4ldj
Re : Problème d'affichage dans terminal après exécution d'un prg en C
Bonjour Bigcake,
Ca n'a pas l'air d'aller non plus
Est ce que mon programme fonctionne chez vous ?
Merci quand même
Dernière modification par on4ldj (Le 23/10/2013, à 12:18)
Hors ligne
#4 Le 23/10/2013, à 13:04
- Bigcake
Re : Problème d'affichage dans terminal après exécution d'un prg en C
A oui effectivement après test, ça me fout en l'air bash, et a moitié zsh comme quoi zsh > bash \o/ (hum... je m'écarte du sujet ....)
"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5
Hors ligne
#5 Le 23/10/2013, à 13:38
- Bigcake
Re : Problème d'affichage dans terminal après exécution d'un prg en C
J'ai pu regarder/tester un peu plus ton code, le problème de vient pas de tes fonctions init_keyboard() et close_keyboard() (mets les en commentaire, tu verra, le problème persiste)
Edit a mince tu a déja constaté ça ...dans ton 1er post
Dernière modification par Bigcake (Le 23/10/2013, à 13:42)
"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5
Hors ligne
#6 Le 23/10/2013, à 13:54
- pingouinux
Re : Problème d'affichage dans terminal après exécution d'un prg en C
Bonjour,
init_keyboard n'est jamais appelé, donc initial_settings jamais initialisé.
Hors ligne
#7 Le 23/10/2013, à 14:53
- on4ldj
Re : Problème d'affichage dans terminal après exécution d'un prg en C
Bonjour et merci Pingouinux,
C'est corrigé mais ne change rien
De toute façons le programme fonctionne bien sans l'init_keyboard..
Drôle d'affaire !
Dernière modification par on4ldj (Le 23/10/2013, à 14:58)
Hors ligne
#8 Le 23/10/2013, à 15:21
- pingouinux
Re : Problème d'affichage dans terminal après exécution d'un prg en C
Chez moi, le fait d'ajouter init_keyboard(); corrige le problème (je l'ai placé juste après system("clear");). D'ailleurs dans close_keyboard, sans cette correction, tcsetattr se termine en erreur (retourne -1 au lieu de 0).
Hors ligne
#9 Le 23/10/2013, à 15:27
- on4ldj
Re : Problème d'affichage dans terminal après exécution d'un prg en C
En effet !
Ca marche !!!
Ca fait longtemps que je cherchais.
merci Pingouiux.
Hors ligne
#10 Le 23/10/2013, à 15:51
- pingouinux
Re : Problème d'affichage dans terminal après exécution d'un prg en C
C'est une bonne habitude à prendre que de tester le code de retour des appels de fonction, et d'arrêter le programme en cas d'erreur (ou de traiter l'erreur). Ça fait gagner du temps.
Hors ligne
#11 Le 23/10/2013, à 16:23
- on4ldj
Re : Problème d'affichage dans terminal après exécution d'un prg en C
Et tu fais ça comment ? analyser les retours ?
J'ai fais ça avec gedit à partir d'un terminal.
Maintenant je vais recommencer ça en Java.
Pas facile.
Hors ligne
#12 Le 23/10/2013, à 16:30
- pingouinux
Re : Problème d'affichage dans terminal après exécution d'un prg en C
Et tu fais ça comment ? analyser les retours ?
Par exemple, dans close_keyboard :
int ret;
ret=tcsetattr(0,TCSANOW,&initial_settings);
if(ret!=0) { printf("erreur tcsetattr ret=%d\n",ret); exit(1); }
ou bien
if(tcsetattr(0,TCSANOW,&initial_settings)!=0) { printf("erreur tcsetattr\n"); exit(1); }
Hors ligne
#13 Le 23/10/2013, à 17:23
- on4ldj
Re : Problème d'affichage dans terminal après exécution d'un prg en C
ok merci
Hors ligne