Alsa e Gambas - Dereferenziazione mediante lo scorrimento dell'area di memoria puntata dal Puntatore

Da Gambas-it.org - Wikipedia.

Come è ormai noto, la funzione esterna di Alsa:

int  snd_seq_event_input(snd_seq_t * seq, snd_seq_event_t ** ev)

assegna alla variabile di tipo Puntatore, presente come suo secondo parametro, l'indirizzo di memoria che punta ad una Struttura (esterna) contenente i dati Midi passati da Alsa.

Possiamo dereferenziare tale variabile di tipo Pointer, per estrarne i dati Midi utili, facendo scorrere l'indirizzo di memoria, puntata dal predetto Puntatore, così da individuare il dato utile.
Tale impostazione si effettuerà sommando all'indirizzo di memoria contenuto nel Puntatore il numero d'indice offset ) utile per individuare l'indirizzo di memoria del dato che deve essere letto:

Valore = Puntatore + offset

Individuato ed impostato, dunque, l'indirizzo di memoria utile, la dereferenziazione avverrà mediante le apposite funzioni previste da Gambas:

Byte@() o Int@()

a seconda del tipo di dato ricevuto appartenente all'Evento Midi di ALSA.


Mostriamo un esempio essenziale:

 Dim p As Pointer    ' La variabile da dereferenziare per raccogliere i singoli dati Midi degli Eventi Midi Alsa
 Dim i As Integer
 Dim b1, b2, b3 As Byte

 Do

   i = snd_seq_event_input(handle, VarPtr(p))
   If i < 0 Then Return

' Legge il 1° byte ("Type"), ossia quello puntato dall'indirizzo di memoria contenuto dal "Puntatore" e elimina i tipi di Eventi Midi di ALSA che qui non interessano:
   If Byte@(p) > 14 Then Return

' Legge il byte di indice 16 byte:
   b1 = Byte@(p + 16)

' Legge il byte di indice 17 byte:
   b2 = Byte@(p + 17)

' Legge il byte di indice 18 byte:
   b3 = Byte@(p + 18)

' Mostriamo il risultato:
   Print b1, b2, b3

 Loop