Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 sad
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 sad
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