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

Braun a écrit :

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