Come lavorare con le proprietà di tipo stringa o array a lunghezza variabile

Nella introduzione alla programmazione ad oggetti in FreeBASIC abbiamo visto cosa sono le proprietà di un oggetto.

In questo nuovo articolo proveremo a scendere un po’ più nel dettaglio per imparare come il compilatore FreeBASIC tratta quel tipo di proprietà che hanno, per loro stessa natura, una lunghezza variabile: ovvero una quantità variabile di spazio di memoria occupato.

Vedremo quindi come lavorare con le stringhe e gli array di tipo variabile (variable-length array).

Lavorare con gli array di tipo variabile

In FreeBASIC le classi sono realizzate attraverso dei tipi di dato definiti da noi (user-defined type o UDT) che devono avere una dimensione fissa.

Nonostante questo, possiamo scegliere come proprietà un array di tipo variabile.

Per farlo dovremo però dichiarare, all’interno della definizione della classe, il nostro array dinamico utilizzando la parola-chiave any.

Questa parola-chiave comunica al compilatore FreeBASIC – come fosse un segnaposto – che le effettive dimensioni dell’array saranno specificate attraverso l’istruzione redim soltanto dopo aver creato un oggetto (istanza della nostra classe).

Esempio con una proprietà stringa e un array di tipo variabile

''definizione della classe
type mia_classe
  ''definizione delle proprietà
  dim as string mia_stringa_variabile
  dim as integer mio_array_variabile(any)
end type

''creiamo un oggetto del tipo della classe definita
dim as mia_classe mio_oggetto

''aggiorniamo la proprietà stringa
mio_oggetto.mia_stringa_variabile = "Oggi e' una bella giornata!"

''aggiorniamo la proprietà array
redim mio_oggetto.mio_array_variabile(1 to 5)

''stampa la stringa
print mio_oggetto.mia_stringa_variabile
''stampa la dimensione dell'array
print str(ubound(mio_oggetto.mio_array_variabile) - _
          lbound(mio_oggetto.mio_array_variabile) + 1)

Nel prossimo articolo vedremo come in FreeBASIC viene implementato il concetto di incapsulamento, tipico della programmazione orientata agli oggetti, per una migliore gestione dell’accesso ai membri di una classe.

FreeBASIC – tipo di dato definito da noi

Nonostante i tipi di dato standard ci permettano di risolvere la maggior parte dei problemi che affrontiamo quando scriviamo un programma, può verificarsi il caso che si renda utile, se non addirittura necessario, utilizzare un tipo di dato creato ad hoc direttamente da noi.

Anche questo tipo di dato dovrà essere identificato da una etichetta che dovrà rispettare le stesse regole viste per le variabili.

Il tipo di dato creato dall’utente (user-defined type o UDT) può essere visto come una specie di array, con la particolarità che un UDT può contenere anche tipi di dato differenti. È proprio questa caratteristica a rendere utile un UDT.

Un UDT può contenere sia variabili che procedure che prendono il nome di membri (o elementi).

Utilizzo di un UDT attraverso una variabile

Per creare un UDT si utilizza l’istruzione type.

Per accedere ai singoli membri attraverso una variabile si utilizza l’operatore . (notazione puntata):

'definizione di un nostro tipo di dato
type automobile
  cavalli as integer
  cilindrata as integer
end type

'dimensionamento e creazione di una variabile
'del tipo appena definito
dim mia_auto as automobile

'valorizzazione dei membri
mia_auto.cavalli = 75
mia_auto.cilindrata= 999

'stampa dei valori
print "CV = "; mia_auto.cavalli
print "Cilindrata = "; mia_auto.cilindrata

Utilizzo di un UDT attraverso un puntatore alla sua variabile

Come abbiamo visto nell’articolo dedicato ai puntatori, anche per i tipi di dato definiti da noi (UDT) possiamo creare il relativo puntatore alla sua variabile.

La creazione di questo tipo di puntatore è simile a quella per un puntatore ad una variabile relativa a un tipo di dato standard. Ciò che cambia è la modalità di accesso ai singoli membri che dovrà avvenire attraverso l’operatore ->.

Riprendendo l’esempio precedente, aggiungiamo le seguenti righe di codice:

'creazione di un puntatore alla variabile
dim p as automobile pointer = @mia_auto

'valorizzazione dei membri attraverso il puntatore
p->cavalli = 90
p->cilindrata= 1500

'stampa dei valori
print "CV = "; p->cavalli
print "Cilindrata = "; p->cilindrata

Nel prossimo articolo inizieremo a parlare delle procedure.

A presto. 🙂