Differenze tra le versioni di "Alsa e Gambas - Dereferenziazione mediante lo scorrimento dell'area di memoria puntata dal Puntatore"

Da Gambas-it.org - Wikipedia.
 
Riga 23: Riga 23:
 
   
 
   
 
  <FONT color=gray>' ''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:''</font>
 
  <FONT color=gray>' ''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:''</font>
     If Byte@(po) > 14 Then Return
+
     If Byte@(p) > 14 Then Return
 
   
 
   
 
  <FONT color=gray>' ''Legge il byte di indice 16 byte:''</font>
 
  <FONT color=gray>' ''Legge il byte di indice 16 byte:''</font>
     b1 = Byte@(po + 16)
+
     b1 = Byte@(p + 16)
 
   
 
   
 
  <FONT color=gray>' ''Legge il byte di indice 17 byte:''</font>
 
  <FONT color=gray>' ''Legge il byte di indice 17 byte:''</font>
     b2 = Byte@(po + 17)
+
     b2 = Byte@(p + 17)
 
   
 
   
 
  <FONT color=gray>' ''Legge il byte di indice 18 byte:''</font>
 
  <FONT color=gray>' ''Legge il byte di indice 18 byte:''</font>
     b3 = Byte@(po + 18)
+
     b3 = Byte@(p + 18)
 
   
 
   
 
  <FONT color=gray>' ''Mostriamo il risultato:''</font>
 
  <FONT color=gray>' ''Mostriamo il risultato:''</font>

Versione attuale delle 17:11, 25 gen 2022

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