FreeBASIC – gestione degli errori

La gestione degli errori è un aspetto molto importante che un programmatore deve conoscere per scrivere del codice affidabile.

Può capitare per esempio di dover aprire un file, ma, per qualche motivo, il file è stato cancellato, spostato o rinominato. In questi casi è bene prevedere un controllo per intercettare l’eventuale errore ed informare così l’utente del problema.

A tale scopo FreeBASIC mette a disposizione la funzione err che ritorna lo specifico codice di errore del problema riscontrato.

In FreeBASIC esiste una lista dei codici di errore che il programmatore può gestire.

Vediamo un semplice esempio:

dim err_code as integer

open "file.txt" for input as #1

err_code = err

select case err_code
  case 0
    close #1 'nessun errore riscontrato
  case 1
    print "Illegal function call"
  case 2
    print "File not found signal"
  case 3
    print "File I/O error"
  case 4
    print "Out of memory"
  case 5
    print "Illegal resume"
  case 6
    print "Out of bounds array access"
  case 7
    print "Null Pointer Access"
  case 8
    print "No privileges"
  case 9
    print "Interrupted signal"
  case 10
    print "Illegal instruction signal"
  case 11
    print "Floating point error signal"
  case 12
    print "Segmentation violation signal"
  case 13
    print "Termination request signal"
  case 14
    print "Abnormal termination signal"
  case 15
    print "Quit request signal"
  case 16
    print "Return without gosub"
  case 17
    print "End of file"
end select

sleep

Abbastanza semplice direi. 😉

In FreeBASIC esistono anche altre istruzioni e procedure che permettono una gestione degli errori avanzata.

A rileggerci al prossimo articolo.

FreeBASIC – libreria dinamica

A differenza della libreria statica che abbiamo visto nel precedente articolo, la libreria dinamica viene caricata soltanto quando il nostro programma è in esecuzione (runtime).

Altra importante caratteristica è che la libreria dinamica può essere condivisa (shared) tra più programmi in esecuzione.

Passiamo subito alla pratica e scriviamo quattro files.

Modulo libreria

''nome del file: funzioni_utili.bas

''funzione per il calcolo dell'area di un quadrato
public function area_quadrato(byval l as integer) _
       as integer
  return l * l
end function

Una volta salvato il file dobbiamo compilarlo specificando al compilatore FreeBASIC che vogliamo creare proprio una libreria dinamica:

fbc -dll [eventuale percorso]\funzioni_utili.bas

Se tutto è andato in porto troveremo nella stessa cartella contenente il file sorgente la nostra libreria.

Sui sistemi operativi Linux l’estensione del file sarà .so, mentre sul sistema operativo Windows l’estensione del file sarà .dll.

A questo punto il file della libreria dinamica va spostato in specifiche cartelle a seconda del sistema operativo:

  • su Linux: /usr/lib
  • su Windows: la cartella di sistema (p.e. C:\Windows\System32)

Interfaccia

Come abbiamo già fatto per rendere facilmente disponibile la libreria statica, anche per la libreria dinamica creiamo la nostra interfaccia (API) sfruttando un file di intestazione:

''nome file: funzioni_utili.bi

#inclib "funzioni_utili" ''include il modulo libreria

''dichiara la funzione
declare function area_quadrato(byval l as integer) _
        as integer

Test

Creiamo adesso due programmi sostanzialmente identici che, una volta mandati in esecuzione, condivideranno la medesima libreria dinamica.

Programma 1

''nome file: test1.bas

#include "funzioni_utili.bi" ''include l'interfaccia

dim a as integer

''stampa l'area del quadrato
do
  input "Test 1: Inserisci la lunghezza del lato: "; a
  print "L'area del quadrato vale: "; area_quadrato(a)
loop until a = 0

Programma 2

''nome file: test2.bas

#include "funzioni_utili.bi" ''include l'interfaccia

dim a as integer

''stampa l'area del quadrato
do
  input "Test 2: Inserisci la lunghezza del lato: "; a
  print "L'area del quadrato vale: "; area_quadrato(a)
loop until a = 0

Bene! Con questo articolo possiamo per ora ritenere la nostra conoscenza dell’uso delle librerie in FreeBASIC sufficiente.

Ricordiamoci però sempre di ben commentare le nostre librerie per aiutare chi volesse utilizzarle a capire velocemente come funzionano.

A rileggerci al prossimo articolo. 🙂

FreeBASIC – libreria statica

Nel precedente articolo abbiamo avuto modo di dare un primo sguardo alla teoria che riguarda le librerie.

Oggi passeremo alla pratica realizzando la nostra prima libreria statica.

Una libreria statica è un file contenente del codice compilato che svolge diversi compiti. Questo codice può essere utilizzato nel proprio progetto e quindi aggiunto staticamente durante la creazione del file eseguibile.

Facciamo quindi un semplice esempio creando una libreria che contiene un unico modulo con un’unica funzione:

Modulo libreria

''nome del file: libreria.bas

''funzione per il calcolo dell'area di un triangolo
public function area(byval b as integer, _
                     byval h as integer) as integer
  return b * h / 2
end function

A questo punto dobbiamo compilare il file specificando al compilatore FreeBASIC che vogliamo creare una libreria e non un eseguibile:

fbc -lib libreria.bas

Noteremo che nella stessa cartella del modulo compare ora il file liblibreria.a che è il file archivio contenente la nostra libreria.

Un archivio può contenere più moduli.

Interfaccia

Per facilitare l’uso della nostra libreria è bene creare una interfaccia (API) che permetta ad un qualsiasi programmatore interessato di accedere facilmente alle varie funzioni messe a disposizione.

In FreeBASIC per creare una interfaccia, non facciamo altro che scrivere un file di intestazione.

''nome del file: libreria.bi

#inclib "libreria" ''include il modulo libreria

declare function area(byval b as integer, _
                      byval h as integer) as integer

Programma

Immaginiamo ora di essere un programmatore che voglia utilizzare la funzione area della nostra libreria.

Scriviamo quindi questo semplice programma:

''nome file: test.bas

#include "libreria.bi" ''include il file di intestazione

'stampa l'area del triangolo
print "L'area del triangolo vale: "; area(4, 5)

A questo punto si compila il modulo del programma (test.bas) e si ottiene il file eseguibile che ingloba anche la libreria.

Nel prossimo articolo creeremo invece una libreria dinamica.