Page 1 sur 1

[langage C] conio.h et kbhit() [RESOLU]

Publié : dim. 13 janv. 2019, 10:43
par -fab1en-
Bonjour,

Juste pour le plaisir, je m’initie au langage C.

J'ai un problème avec la fonction kbhit, je ne trouve pas d'équivalent à conio.h, mon programme ne compile pas.

J'ai pas mal fouillé sur la toile.

ncurse.h ne donne rien.

J'ai trouvé ce lien mais c'est pour C++, du coup ca va pas.
https://sourceforge.net/projects/linux- ... ror=freefr

J'ai également trouvé ça http://www.sandroid.org/TurboC/#Download
Mais "make" n'a pas fonctionné

Code : Tout sélectionner

[dos2unix.c: Dans la fonction « write_printer »:
dos2unix.c:226:23: warning: variable « ts » définie mais non utilisée [-Wunused-but-set-variable]
       struct timespec ts;
                       ^~
cc -O0 -g -DWITH_X -I/usr/X11R6/include -Wall -c -funsigned-char -o getgraphmode.o getgraphmode.c
cc -O0 -g -DWITH_X -I/usr/X11R6/include -Wall -c -funsigned-char -o sector.o sector.c
cc -O0 -g -DWITH_X -I/usr/X11R6/include -Wall -c -funsigned-char -o gettext.o gettext.c
gettext.c: Dans la fonction « gettextTurboC »:
gettext.c:93:13: warning: les cibles pointées dans l'affectation de « int8_t * » {alias « signed char * »} vers « uint8_t * » {alias « unsigned char * »} diffèrent dans la plage signée [-Wpointer-sign]
   TurboData = (int8_t *) dest;
             ^
In file included from TurboC.h:60,
                 from conio.h:49,
                 from gettext.c:42:
TurboC.h:250:14: error: expected « ) » before « int32_t »
 #define long int32_t
              ^~~~~~~
/usr/include/curses.h:1238:66: note: dans l'expansion de la macro « long »
 #define PAIR_NUMBER(a) (NCURSES_CAST(int,((NCURSES_CAST(unsigned long,(a)) & A_COLOR) >> NCURSES_ATTR_SHIFT)))
                                                                  ^~~~
gettext.c:124:10: note: pour correspondre à ce « ( »
  Color = PAIR_NUMBER (ch & A_COLOR);
          ^~~~~~~~~~~
gettext.c:125:23: warning: les cibles pointées dans le passage de l'argument 2 de « pair_content » diffèrent dans la plage signée [-Wpointer-sign]
  pair_content (Color, &dFore, &dBack);
                       ^~~~~~
In file included from TurboC.h:60,
                 from conio.h:49,
                 from gettext.c:42:
/usr/include/curses.h:746:28: note: « short int * » attendu mais l'argument est de type « uint16_t * » {alias « short unsigned int * »}
 extern NCURSES_EXPORT(int) pair_content (NCURSES_PAIRS_T,NCURSES_COLOR_T*,NCURSES_COLOR_T*);  /* implemented */
                            ^~~~~~~~~~~~
gettext.c:125:31: warning: les cibles pointées dans le passage de l'argument 3 de « pair_content » diffèrent dans la plage signée [-Wpointer-sign]
  pair_content (Color, &dFore, &dBack);
                               ^~~~~~
In file included from TurboC.h:60,
                 from conio.h:49,
                 from gettext.c:42:
/usr/include/curses.h:746:28: note: « short int * » attendu mais l'argument est de type « uint16_t * » {alias « short unsigned int * »}
 extern NCURSES_EXPORT(int) pair_content (NCURSES_PAIRS_T,NCURSES_COLOR_T*,NCURSES_COLOR_T*);  /* implemented */
                            ^~~~~~~~~~~~
make: *** [Makefile:126: gettext.o] Error 1
Cette erreur me laisse perplexe:
TurboC.h:250:14: error: expected « ) » before « int32_t »
#define long int32_t

Quelqu'un aurait-il une idée de comment compiler un programme comportant la fonction kbhit sous ArchLinux?

Merci et bon dimanche.

Fabien

Re: [langage C] conio.h et kbhit()

Publié : dim. 13 janv. 2019, 13:30
par benjarobin
Bonjour, tu devrais donner ton code, cela pourrait aider à comprendre ce que tu veux faire et où est le problème

Re: [langage C] conio.h et kbhit()

Publié : dim. 13 janv. 2019, 16:47
par -fab1en-
Salut benjarobin,

Le code est tout bête. Il vient du livre Langage C des éditions ENI et est uniquement à but pédagogique.

Code : Tout sélectionner

#include <stdio.h>
#include <conio.h>
#include <time.h>
int main()
{
int res, top=0;

	while (res!='q'){
	   if (kbhit()){
		res=getch();
		printf("touche %c pressee, val ascii : %d\n",res,res);
	   }
	   if(clock()>top+30){  // contrôler le temps
	      top=clock();
         putchar('0');
	   }
	}
	return 0;
}
Je cherche à remplacer conio.h et kbhit.

D'après les réponses que j'ai eu içi: https://stackoverflow.com/questions/541 ... 0_54168482
ncurses est la solution.

J'ai de la lecture...

Re: [langage C] conio.h et kbhit()

Publié : lun. 14 janv. 2019, 20:51
par -fab1en-
Si par hasard un jour un débutant en programmation se pose la même question, voilà la réponse (sans utiliser ncurses).
J'ai trouvé les fonctions içi : https://c.developpez.com/faq/?page=Gest ... -sous-UNIX
Ce n'est évidemment pas moi qui les ai trouvé, je ne suis pas Alan Turing...mais je vais quand même essayer de réécrire ça avec ncurses :lol:


Code : Tout sélectionner

#include <stdio.h>
#include <time.h>

#include <unistd.h>   //  kbhit
#include <sys/time.h> //  kbhit

#include <termios.h>  //  raw           
#include <unistd.h>   //  raw           


void mode_raw(int activer)                              // passer le terminal en mode brut permet de détecter l'arrivée de caractères dès leur frappe, comme avec _kbhit, sans attendre "entrée"
{ 
    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; 
}

/*

int getch(void)
{
        int ch;
        struct termios oldt, newt;

        tcgetattr(STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~(ICANON|ECHO);
        tcsetattr(STDIN_FILENO, TCSANOW, &newt);
        ch = getchar();
        tcsetattr(STDIN_FILENO, TCSANOW, &oldt);

        return ch;
}
*/

int unix_text_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; 
}

int main()
{

	
int res, top=0;
int activer=1;

mode_raw(activer);


	while (res!='q'){
	   if (unix_text_kbhit()){
		res=getchar();
		printf("touche %c pressee, val ascii : %d\n",res,res);
	   }
	   if(clock()>top+1000){                                                                      // contrôler le temps
	      top=clock();
         putchar('0');
	   }
	}
	
mode_raw(!activer);

	return 0;
}

Re: [langage C] conio.h et kbhit()

Publié : mar. 15 janv. 2019, 01:45
par -fab1en-
Et voilà, tout seul comme un grand. Je pense que ncurses va beaucoup me plaire.

Code : Tout sélectionner

#include <stdio.h>
#include <ncurses.h>
#include <time.h>

int main()
{
int ch, top=0;
	
	initscr();	
	timeout(TRUE);                                                                                                     // fait ensorte que getch() ne soit pas bloquant    
	keypad(stdscr, TRUE);
	noecho();	
	
	while (ch!='q'){
		
	   if ((ch=getch())){                                                                                                // getch() retourne ERR si on ne lui fournit rien
			if (ch>=1){                                                                                               // ERR (-1 je suppose?) est exclu, ainsi printw() n'affichera que les touches pressées  
			printw(" Touche %c pressee, val ASCII: %d ",ch,ch);       
		    }
	   }
	   	
	   if(clock()>top+1000){  
			top=clock();
			printw("0");
	   }
	   
	}
	
	endwin();

	return 0;
}

Re: [langage C] conio.h et kbhit() [RESOLU]

Publié : mar. 15 janv. 2019, 16:21
par avi3000
Bonjour,

Ton code contient au moins une erreur : la fonction timeout attend un entier et non un booléen.
Je te conseille la lecture du man .

La première ligne du code ci-dessous permet de l'exécuter à l'aide de tcc sans compilation.

Code : Tout sélectionner

#!/usr/bin/tcc -run -lncursesw

#define _GNU_SOURCE
#include <unistd.h>
#include <ncurses.h>

int main (int argc, char **argv) {
    int wch;

    initscr();
    noecho();
    keypad(stdscr, TRUE);
    timeout(-1);
    printw("%s\n", curses_version());
    while ( 1  ) {
        get_wch(&wch);
        printw("KEY NAME : %s - %d - %lc}}\n", keyname(wch),wch,wch);
        if ( wch == 'q' ) break;
    }
    endwin();
    printf("%s\n", curses_version());
    return 0;
}

Re: [langage C] conio.h et kbhit() [RESOLU]

Publié : mar. 15 janv. 2019, 20:14
par -fab1en-
Bonsoir,

Je dois remplacer TRUE par 1 par exemple?

Code : Tout sélectionner

timeout(1);
Il y a-t-il un moyen de se passer de la condition

Code : Tout sélectionner

if ch>1
Je ne trouve que ça comme man:

https://linux.die.net/man/3/timeout

Code : Tout sélectionner

man timeout
dans le terminal ne me donne pas ce que souhaite: timeout(0)

Peux-tu m'éclairer?

Re: [langage C] conio.h et kbhit() [RESOLU]

Publié : mer. 16 janv. 2019, 16:15
par avi3000
man 3 timeout

Il faudra lire également le man du man

sinon apropos -e timeout

à lire aussi le man de apropos

Re: [langage C] conio.h et kbhit() [RESOLU]

Publié : jeu. 17 janv. 2019, 11:52
par -fab1en-
Merci.