Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C linux] Leggere la pressione di un solo tasto da input

    Ciao a tutti, mi servirebbe poter gestire la pressione di un solo tasto dalla tastiera, senza dover inserire il carattere e poi premere invio.
    In pratica vorrei che il programma si mettesse in attesa di una pressione di un tasto, e una volta premuto lo legga.
    Mi sarebbe anche utile gestire la pressione dei tasti freccia.

    Tutto ciò è possibile in C sotto linux?

    thanks!

  2. #2
    Usa la funzione getchar. Per la faccenda dei tasti freccia dai un'occhiata qui.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ripensandoci per i tasti-freccia su Linux credo che ti basti interpretare le sequenze di escape che vengono generate alla pressione di tali tasti.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Originariamente inviato da MItaly
    Usa la funzione getchar. Per la faccenda dei tasti freccia dai un'occhiata qui.
    Su linux la funzione getchar richiede comunque la pressione del tasto invio!
    la funzione getch non esiste nemmeno, in quanto inclusa nella libreria conio.h che non appartiene a linux.

    Come fare?

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Se non ricordo male, ti serve la ncurses.

  6. #6
    Utente di HTML.it L'avatar di 810106
    Registrato dal
    Jun 2008
    Messaggi
    67

    IN LINUX TUTTO SI PUO!

    La lettura dal terminale senza l'attesa del carattere '\n' si chiama `canonical input processing'
    leggendo le pagine info della libreria GNU C alla sezione `Low-level terminal interface' trovi tutto quel che riguarda le impostazioni di lettura e scrittura dalla console.
    DOCUMENTAZIONE:
    libc (pagina info attraverso il comando `info libc' e poi entri nella sezione low-level Terminal Interface)
    man: `man tcsetattr', `man tcgetattr' (Si possono usare anche le funzioni linux ioctl `man ioctl' e `man tty_ioctl' ma il programma non è piu compatibile con gli standard POSIX)

    Un esempio di funzione che legge un solo carattere:

    #include <termios.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <stdio.h>

    /* Legge un sigolo carattere dal terminale senza
    * aspettare la pressione del tasto invio.
    * Restituisce 1 in caso di successo, 0 in caso di errore.
    * Il carattere letto viene memorizzato nel parametro `c' */
    unsigned char read_nocannon(int *c)
    {
    /* orig per ripristinare le impostazioni
    * new per cambiare le impostazioni */
    struct termios orig, new;

    /* Legge le impostazioni del terminale e
    * le memorizza in orig (vedere `man tcgetattr')*/
    if(tcgetattr(0, &orig) != 0)
    {
    perror("tcgetattr");
    return 0;
    }
    /* copia le impostazioni in new. Metodo consigliato nella
    * documentazione della libreria GNU C (vedere `info libc') */
    memcpy(&new, &orig, sizeof(struct termios));

    /* Imposta `canonical imput' e toglie l'echo dei caratteri */
    new.c_lflag &= ~(ICANON|ECHO);

    /* Imposta il minimo numero di caratteri da leggere */
    new.c_cc[VMIN] = 1;

    /* Imposta il tempo di attesa 0 dice a read di attendere finchè non ci
    * sono X.c_cc[VMIN] caratteri letti */
    new.c_cc[VTIME] = 0;

    /* Setta le nuove impostazioni (vedere `man tcsetattr') */
    if(tcsetattr(0, TCSANOW, &new) != 0)
    {
    perror("tcsetattr");
    return 0;
    }

    /* legge 1 carattere */
    if(read(0, c, 1) == -1)
    {
    perror("read");
    tcsetattr(0, TCSANOW, &orig);
    return 0;
    }

    /* Ripristina le impostazioni precedenti ###IMPORTANTE### */
    tcsetattr(0, TCSANOW, &orig);

    return 1;
    }

    int main()
    {
    int c;
    if(read_nocannon(&c))
    {
    printf("Read one character: '%c'\n", c);
    return EXIT_SUCCESS;
    }
    return EXIT_FAILURE;
    }
    Spero di esserti stato utile. Se hai domende sono qui.

  7. #7

    Re: IN LINUX TUTTO SI PUO!

    Originariamente inviato da 810106
    La lettura dal terminale senza l'attesa del carattere '\n' si chiama `canonical input processing'
    leggendo le pagine info della libreria GNU C alla sezione `Low-level terminal interface' trovi tutto quel che riguarda le impostazioni di lettura e scrittura dalla console.
    DOCUMENTAZIONE:
    libc (pagina info attraverso il comando `info libc' e poi entri nella sezione low-level Terminal Interface)
    man: `man tcsetattr', `man tcgetattr' (Si possono usare anche le funzioni linux ioctl `man ioctl' e `man tty_ioctl' ma il programma non è piu compatibile con gli standard POSIX)

    Un esempio di funzione che legge un solo carattere:

    Spero di esserti stato utile. Se hai domende sono qui.
    Funziona, e senza utilizzare librerie non standard, sei un grande!!!

    p.s. l'unica cosa che vorrei evitare è questi warning, cosa significano?
    getc.c: In function 'read_nocannon':
    getc.c:24: warning: implicit declaration of function 'memcpy'
    getc.c:24: warning: incompatible implicit declaration of built-in function 'memcpy'
    getc.c:43: warning: implicit declaration of function 'read'
    thanks!

  8. #8
    Utente di HTML.it L'avatar di 810106
    Registrato dal
    Jun 2008
    Messaggi
    67

    ops

    ho dimenticato di includere `string.h' (strings.h nel caso di bsd) e `unistd.h', aggiungi questi include e sei a posto.

    Cmq `implicit declaration' significa dichiarazione implicita, nel nostro caso la funzione viene dichiarata nel momento in cui la utilizziamo, perchè non c'è il prototipo. Includendo l'header si importano le dichiarazioni delle funzioni
    oppure volendo possiamo dichiararle esplicitamente:
    codice:
    extern signed int read(int, void *, unsigned int);
    extern void *memcpy(void *, const void*, unsigned int);

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.