Pages : 1
#1 Le 27/05/2015, à 19:25
- Rémi1995
termcaps en c
bonjour,
j'aimerai pouvoir me déplacer dans mon terminal. j'ai essayé de faire ça:
#include "my.h"
int main(int ac, char **av, char **env)
{
voir_touche();
return (0);
}
int my_outc()
{
char str;
write (1, &str, 1);
return (0);
}
int voir_touche()
{
char *buffer;
char *res;
char *area;
buffer = malloc(500);
while (1)
{
read(0, buffer, 4);
if (buffer[0] == 27)
{
if (buffer[1] == '[')
{
if (buffer[2] == 'A')
printf("fleche du haut\n");
else if (buffer[2] == 'B')
printf("fleche du bas\n");
else if (buffer[2] == 'C')
{
res = tgetstr("ch", &area);
tputs(tgoto(res, 0, 1), 1, my_outc);
}
else if (buffer[2] == 'D')
printf("fleche gauche\n");
}
}
}
return (0);
}
mais il ne fait absolument rien.
merci
Hors ligne
#2 Le 27/05/2015, à 20:29
- pingouinux
Re : termcaps en c
Bonsoir,
Je ne connais pas trop, mais je pense qu'il manque un argument à my_outc.
Voici le prototype de tputs
int tputs(const char *str, int affcnt, int (*putc)(int));
et voici celui de ta fonction my_outc
int my_outc()
Tu appelles tputs ainsi
tputs(tgoto(res, 0, 1), 1, my_outc);
Hors ligne
#3 Le 27/05/2015, à 21:37
- Rémi1995
Re : termcaps en c
comme ça :
int my_outc(int str)
{
write (1, &str, 1);
return (0);
}
tputs(tgoto(res, 0, 1), 1, my_outc(2));
il m'affiche :
main.c: In function ‘voir_touche’:
main.c:37:5: warning: passing argument 3 of ‘tputs’ makes pointer from integer without a cast [enabled by default]
tputs(tgoto(res, 0, 1), 1, my_outc(2));
^
In file included from my.h:8:0,
from main.c:1:
/usr/include/term.h:767:28: note: expected ‘int (*)(int)’ but argument is of type ‘int’
extern NCURSES_EXPORT(int) tputs (const char *, int, int (*)(int));
Dernière modification par Rémi1995 (Le 27/05/2015, à 21:38)
Hors ligne
#4 Le 27/05/2015, à 21:43
- pingouinux
Re : termcaps en c
L'appel initial (en #1) de tputs était correct, et la nouvelle définition de my_outc (en #3) me semble bonne. J'ai bien peur de ne rien pouvoir dire de plus…
Hors ligne
#5 Le 27/05/2015, à 21:51
- Braun
Re : termcaps en c
Bonsoir,
Si j'ai bien compris ton « my_outc() » devrait rendre un pointeur et non un entier, cf la doc de tputs().
Hors ligne
#6 Le 28/05/2015, à 07:44
- pingouinux
Re : termcaps en c
Si j'ai bien compris ton « my_outc() » devrait rendre un pointeur et non un entier
my_outc doit bien retourner un entier
Voici un exemple, avec deux façons de déclarer le paramètre f dans les fonctions appel1 et appel2
#include <stdio.h>
int appel1( int x, int (f) (int) ){ return f(x); }
int appel2( int x, int (*f)(int) ){ return f(x); }
int carre( int x ){ return x*x; }
int cube ( int x ){ return x*x*x; }
int main() {
int n=5;
printf( "Appel1 : le carré de %d est %d\n", n, appel1(n,carre) );
printf( "Appel1 : le cube de %d est %d\n", n, appel1(n,cube) );
printf( "Appel2 : le carré de %d est %d\n", n, appel2(n,carre) );
printf( "Appel2 : le cube de %d est %d\n", n, appel2(n,cube) );
}
et voici le résultat après compilation et exécution
Appel1 : le carré de 5 est 25
Appel1 : le cube de 5 est 125
Appel2 : le carré de 5 est 25
Appel2 : le cube de 5 est 125
Hors ligne
#7 Le 29/05/2015, à 13:54
- Rémi1995
Re : termcaps en c
j'ai trouvé la lib ncuses mais quand je le lance et que j'appuis sur a touche du haut il se ferme et mon terminal est explosé.
#include "my.h"
#include <curses.h>
int main()
{
WINDOW *ecran;
char c;
int x;
int y;
ecran = initscr();
move(10, 10);
refresh();
getyx(ecran, y, x);
printw("%i\n%i\n", y, x);
c = getch();
if (c == KEY_UP)
{
if (move(y - 1, x) != OK)
endwin();
/* else
refresh();
*/ }
/*else if (c == KEY_DOWN)
move(y + 1, x);
else if (c == KEY_LEFT)
move(y, x - 1);
else if (c == KEY_RIGHT)
move(y, x + 1);
*/else if (c == 'q')
endwin();
return (0);
}
Hors ligne
Pages : 1