FreeBASIC – getkey

Dopo aver visto come si configura la console e aver imparato in un altro articolo ad usare la funzione multikey, oggi vedremo come ottenere il codice ASCII di alcuni pulsanti (keys) della nostra tastiera (keyboard) utilizzando la funzione getkey.

Il codice ASCII viene restituito dalla funzione getkey come valore di tipo long (vedi Tabella dei limiti dei tipi standard).

Vediamo adesso per passi come si può lavorare con questa istruzione:

  • per prima cosa è bene dimensionare una variabile ti tipo long per memorizzare il codice ASCII del pulsante premuto;
  • la funzione getkey va quindi inserita all’interno di un ciclo (per esempio il ciclo do-loop) in modo tale che il programma rimanga costantemente in ascolto dell’input da tastiera dell’utente;
  • a questo punto, all’interno del ciclo do-loop, si inserisce la struttura di controllo select case in modo tale da distinguere i vari codici ASCII che verranno ricevuti.

Una volta ricevuto un codice ASCII la memoria tampone della tastiera (keyboard buffer) viene ripulita automaticamente. Se non viene premuto alcun pulsante la funzione getkey rimane in ascolto e il programma si ferma.

Alcuni pulsanti della tastiera, come quelli funzione (F1, F2, ecc.) o quelli di spostamento del cursore, sono rappresentati da due caratteri e quindi occorrerà, per esempio, identificarli con la struttura di controllo if-then-else e poi operare uno spostamento (shift) di 8 bits in modo tale da scartare il carattere che non ci serve. Per farlo useremo l’istruzione shr.

Un sito molto utile dove trovare descritti i vari codici è theasciicode.com.ar

Per vedere un esempio pratico riporto una parte del codice di CLUMSY ripulita dalle istruzioni che al momento non ci servono:

dim as long key ''key entered

''main loop
do
  key = getkey
  if key > 255 then ''cursor keys
    key = key shr 8 ''shifts the bits to the right
    select case key
      case 59 ''F1
        ''...
      case 60 ''F2
        ''...
      case 61 ''F3
        ''...
      case 62 ''F4
        ''...
      case 63 ''F5
        ''...
      case 64 ''F6
        ''...
      case 65 ''F7
        ''...
      case 66 ''F8
        ''...
      case 67 ''F9
        ''...
      case 68 ''F10
        ''not used (problems with Ubuntu terminal)
      case 71 ''home
        ''...
      case 72 ''up
        ''...
      case 73 ''page up
        ''...
      case 79 ''end
        ''...
      case 80 ''down
        ''...
      case 81 ''page down
        ''...
      case 77 ''right
        ''...
      case 75 ''left
        ''...
      case 83 ''delete
        ''...
      case else ''none
    end select
  else ''ASCII extended
    select case key
      case 32 to 126 ''printable characters
        ''...
      case 128 to 255 ''extended ASCII characters
        ''...
      case 8 ''backspace
        ''...
      case 13 ''carriage return
        ''...
      case 27 '' quit
        exit do
      case else
        ''none
    end select
  end if

''to avoid unwanted or repeated characters,
''this loop works until the inkey buffer is empty
  while inkey <> "": wend

loop

Bene. Un altro piccolo passo è stato fatto. 😉

FreeBASIC – lavorare con i files [1]

Dopo un po’ di tempo che si è iniziato a programmare, è inevitabile che sorga l’esigenza di lavorare con delle informazioni salvate su files.

È bene quindi sapere come farlo anche con FreeBASIC.

Istruzione open

L’istruzione che si utilizza in FreeBASIC per lavorare con i files è l’istruzione open.

Di per sé l’istruzione open non specifica cosa in realtà vogliamo fare: se, per esempio, leggere un file esistente, oppure scriverci sopra, o magari crearne uno nuovo.

Per dire al nostro computer cosa vogliamo fare occorre specificare una delle seguenti cinque modalità di apertura:

  1. Per scrivere del testo a partire da un file vuoto (parola-chiave output)
  2. Per leggere il contenuto testuale (parola-chiave input)
  3. Per aggiungere del testo ad un file esistente (parola-chiave append)
  4. Modalità binaria (parola-chiave binary)
  5. Modalità casuale (parola-chiave random)

In questo articolo vedremo le prime due.

Creare un file di testo (output)

Proviamo a creare il nostro primo file di testo:

dim nome_file as string
dim numero_file as long

nome_file = "prova.txt"
numero_file = freefile 'restituisce un numero di file libero

open nome_file for output encoding "utf8" lock write as #numero_file
print #numero_file, "FreeBASIC è figo!"
close #numero_file

Vediamo di spiegare nel dettaglio cosa abbiamo fatto.

Numero del file

In FreeBASIC è necessario identificare il file su cui stiamo lavorando con un numero.

Nonostante siamo liberi di specificare direttamente noi un valore che sia compreso tra 1 e 255, è preferibile utilizzare la funzione freefile che evita il rischio di utilizzare un valore già in uso.

Nome del file

Se nella stringa del nome del file non viene specificato alcun percorso, il file verrà aperto nella cartella corrente (vedi anche la funzione curdir).

Codifica dei caratteri

Per quanto riguarda la scelta della codifica dei caratteri, in FreeBASIC possiamo sceglierne una tra le seguenti quattro attraverso l’istruzione encoding:

  1. ASCII: digitando “ascii” (codifica di default se non specificata)
  2. UTF-8: digitando “utf8” (codifica consigliata dal W3C)
  3. UTF-16: digitando “utf16”
  4. UTF-32: digitando “utf32”

Accessibilità al file

Con l’istruzione lock si può specificare se l’accesso al file è esclusivo o se ne è permesso l’accesso in lettura o scrittura anche ad altri programmi presenti sul nostro computer:

  • read: impedita la lettura da parte di altri programmi
  • write: impedita la sola scrittura
  • read write: accesso totalmente negato ad altri programmi (valore di default)

Come leggere un file di testo

Proviamo ora a leggere il contenuto del file appena creato utilizzando la modalità input e aggiungendo al nostro programma le seguenti linee di codice:

dim riga_di_testo as string

numero_file = freefile

open nome_file for input as #numero_file
line input #numero_file, riga_di_testo
close #numero_file

print riga_di_testo

Compilando e mandando in esecuzione il programma ci accorgiamo subito che la lettura del carattere accentato “è” non è andata a buon fine. Questo perché non avendo specificato la codifica dei caratteri, di default FreeBASIC ha interpretato il testo come codificato in ASCII. Basterà quindi modificare il codice aggiungendo la codifica in UTF-8 e la lettura del testo sarà corretta.

Modalità di lettura

Per leggere il contenuto di un file di testo abbiamo due diverse istruzioni:

  • line input #: che permette la lettura di una intera riga di testo sino al carattere di fine riga che viene scartato;
  • input #: che permette la lettura di valori separati da virgola (ne parleremo nel prossimo articolo).

Intercettare la fine di un file

Una volta scelta la modalità di lettura, dovremo inserirla in un ciclo in modo tale da leggere tutto il contenuto del file.

Qui si pone un problema: quando uscire dal ciclo di lettura?

Niente panico! FreeBASIC ci mette a disposizione la funzione eof che restituisce il valore -1 (true) se si è raggiunta la fine del file, altrimenti viene restituito il valore 0 (false).

Bene! Per oggi ci fermiamo qui.

Nel prossimo articolo continueremo comunque ad approfondire l’argomento e vedremo come lavora la modalità di apertura append. 🙂