PDA

Visualizza la versione completa : [C] funzioni gestione tastiera.


Glaedr
17-07-2009, 18:30
ragazzi , esiste una funzione per acquisire un carattere semplicemente premendo il suo tasto sulla tastiera?
eppoi (sono su Linux), come faccio a creare un loop che duri fino alla pressione di Invio che non allochi inutili variabili nella RAM come scanf? getchar() non funziona...
:dhò: :confused: :D

frankitt
17-07-2009, 20:19
Potresti scusami spiegarmi cosa intendi fare con il ciclo infinito?

#include <stdio.h>

int main(void) {

while(getchar()!='\n');

}

questo qui dura fino alla pressione di Invio...però non ho capito cosa vuoi farci dentro!

YuYevon
17-07-2009, 22:00
Originariamente inviato da Glaedr
ragazzi , esiste una funzione per acquisire un carattere semplicemente premendo il suo tasto sulla tastiera?
:dhò: :confused: :D

Per Linux non mi pare esista nulla del genere di già fatto, ma un po' di tempo fa cercavo un omologo di getch() per Linux e trovai dopo pochi secondi questa funzione



#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int mygetch()
{
struct termios oldt, newt;
int ch;

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

Glaedr
18-07-2009, 10:52
Originariamente inviato da frankitt
Potresti scusami spiegarmi cosa intendi fare con il ciclo infinito?

Niente, solo attendere...tipo "Premi Invio per uscire..."


Originariamente inviato da YuYevon
Per Linux non mi pare esista nulla del genere di già fatto, ma un po' di tempo fa cercavo un omologo di getch() per Linux e trovai dopo pochi secondi questa funzione

...e funziona?? :D Voglio dire, mi sembra che ritorni un intero, ma conoscendo la flessibilità dei tipi del C...un'altra cosa, se faccio maiusc + lettera, ritorna la lettera in maiuscolo?

YuYevon
18-07-2009, 10:55
Originariamente inviato da Glaedr
...e funziona?? :D

Provala, no? :°D

YuYevon
18-07-2009, 11:05
Originariamente inviato da Glaedr
Voglio dire, mi sembra che ritorni un intero, ma conoscendo la flessibilità dei tipi del C...un'altra cosa, se faccio maiusc + lettera, ritorna la lettera in maiuscolo?

(questo lo hai aggiunto dopo)

Anche la getchar() classica restituisce un intero e non un carattere

http://www.cplusplus.com/reference/clibrary/cstdio/getchar/ (o anche "man 3 getchar" )

in ogni caso non ti darà problemi, al massimo se proprio vuoi essere assillante fai un

ch = (char) mygetchar()

ma non serve praticamente a nulla.

Per le maiuscole, non ricordo ma direi che dovrebbe funzionare proprio come una getchar(), ma ripeto... provala ;D

Glaedr
18-07-2009, 11:11
@YuYevon

In file included from main.c:9:
libraries.h: In function ‘mygetch’:
libraries.h:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
main.c:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token

come avrai immaginato, ho messo la funzione che mi hai segnalato in un header (libraries.h) e l'ho incluso nel main.c.

ma dopo aver apportato le modifiche mi risulta questo errore che prima non c'era:

main.c:11: error: declaration for parameter ‘choix’ but no such parameter
main.c:39: error: expected ‘{’ at end of input


il main prevede la dichiarazione di un carattere, choix, che contiene la scelta dell'utente del programma da lanciare, per caso è una parola riservata?
ma non ho capito cosa vuol dire il secondo errore, perchè l'albero dei blocchi di codice è perfettamente apposto...

YuYevon
18-07-2009, 11:42
Innanzitutto in generale in un header file non ci vanno le definizioni delle funzioni, ma solo le dichiarazioni dei prototipi. In ogni caso non penso proprio che sia un problema dovuto a quella funzione



#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int mygetch()
{
struct termios oldt, newt;
int ch;

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 main(void)
{
short i = 0;
char ch;

printf("Immetti dieci caratteri:\n");

while ( i++ < 10 ) {
printf("Carattere %hd: ", i);
ch = (char) mygetch();
printf("Hai scritto: %c\n", ch);
}

return 0;
}




YuYevon@slackware:~$ gcc --version
gcc (GCC) 4.2.4
Copyright (C) 2007 Free Software Foundation, Inc.
YuYevon@slackware:~$ gcc prova.c -o prova -Wall -pedantic
YuYevon@slackware:~$ ./prova
Immetti dieci caratteri:
Carattere 1: Hai scritto: q
Carattere 2: Hai scritto: w
Carattere 3: Hai scritto: e
Carattere 4: Hai scritto: r
Carattere 5: Hai scritto: t
Carattere 6: Hai scritto: y
Carattere 7: Hai scritto: u
Carattere 8: Hai scritto: i
Carattere 9: Hai scritto: o
Carattere 10: Hai scritto: p


Prova a compilare il codice che ho appena postato e vedi se ti da errori. Se la compilazione va a buon fine, significa che il problema è altrove.

Loading