Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    8

    [C] funzioni gestione tastiera.

    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...
    "Mai fidarti di un computer che non puoi gettare dalla finestra!"
    Steve Wozniak

  2. #2
    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!

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: [C] funzioni gestione tastiera.

    Originariamente inviato da Glaedr
    ragazzi , esiste una funzione per acquisire un carattere semplicemente premendo il suo tasto sulla tastiera?
    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

    codice:
    #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;
    }
    every day above ground is a good one

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    8
    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?? 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?
    "Mai fidarti di un computer che non puoi gettare dalla finestra!"
    Steve Wozniak

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Glaedr
    ...e funziona??
    Provala, no? :°D
    every day above ground is a good one

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    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/c...stdio/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
    every day above ground is a good one

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    8
    @YuYevon
    codice:
    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:
    codice:
    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...
    "Mai fidarti di un computer che non puoi gettare dalla finestra!"
    Steve Wozniak

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    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

    codice:
    #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;
    }
    codice:
    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.
    every day above ground is a good one

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.