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 – creare una immagine

Spesso può rivelarsi utile creare una immagine in memoria invece che disegnarla direttamente sullo schermo grafico.

Poi, una volta creata, sarà possibile richiamarla attraverso il suo indirizzo di memoria.

Questo procedimento, oltre a velocizzare il disegno delle immagini, rende possibile vari effetti grafici che possono migliorare l’efficacia e la qualità dei nostri programmi.

Possiamo immaginare ciascuna immagine come una tela contenuta all’interno di una cornice avente delle specifiche dimensioni (larghezza e altezza); la tela potrà essere colorata o trasparente.

Come creare una immagine

La funzione che ci permette di creare un’immagine è imagecreate disponibile in due versioni:

screen 19, 32, 1

''dimensiona due variabili di tipo puntatore
''per gli indirizzi di memoria
dim immagine1 as any ptr
dim immagine2 as any ptr

''I versione con i seguenti argomenti:
''- larghezza
''- altezza
''- colore dello sfondo
immagine1 = imagecreate(200, 200, rgb(255,0,0))
if immagine1 = 0 then
  print "Creazione dell'immagine 1 non riuscita!"
  sleep
else
  ''disegna un cerchio verde al centro
  circle immagine1, (100, 100), 50, rgb(0,255,0)
  ''inserisce l'immagine all'interno
  ''della finestra grafica
  put(150, 150), immagine1
  ''distrugge l'immagine per liberare la memoria
  imagedestroy immagine1
end if

''II versione con l'aggiunta di un quarto argomento:
''- profondità di colore
immagine2 =imagecreate(200, 200, rgb(0,255,0), 32)
if immagine2 = 0 then
  print "Creazione dell'immagine 2 non riuscita!"
  sleep
else
  ''disegna un cerchio rosso al centro
  circle immagine2, (100, 100), 50, rgb(255,0,0)
  ''inserisce l'immagine all'interno
  ''della finestra grafica
  put(300, 300), immagine2
  ''distrugge l'immagine per liberare la memoria
  imagedestroy immagine2
end if

sleep

Note sulla istruzione imagecreate

  • L’istruzione va utilizzata soltanto dopo aver definito la modalità grafica: e quindi sia la risoluzione dello schermo che la risoluzione grafica.
  • Se il colore dello sfondo non viene specificato, il valore predefinito sarà trasparente e quindi in pratica sarà visibile il colore di sfondo della finestra grafica.
  • Se l’istruzione dovesse fallire, viene restituito il valore null (0), altrimenti viene restituito l’indirizzo di memoria dell’immagine.

Per fare le cose per bene, occorre anche ricordarsi di distruggere le immagini create in modo tale da liberare la memoria. Per farlo si utilizza l’istruzione imagedestroy.

Bene. Per oggi possiamo fermarci qui. Nel prossimo articolo impareremo a salvare e caricare le immagini.