Accedere linearmente in scrittura ed in lettura ad una Matrice

Da Gambas-it.org - Wikipedia.

Oltre che nelle modalità consuete è possibile accedere ad una Matrice - in lettura ed in scrittura - in modo lineare, come descritto dal metodo chiamato "Row Major Order " [Rifer.].

In particolare, il "Row Major Order " è un metodo di rappresentazione sequenziale della memoria riservata per la Matrice. In questo metodo gli elementi di una Matrice sono disposti in sequenza riga per riga. Così gli elementi della prima riga occupano la prima serie di locazioni di memoria riservata per la Matrice, gli elementi della seconda riga occupano la successiva serie della memoria e così via.

Dunque, se per ipotesi abbiamo una Matrice costituita da 5 righe e 5 colonne, essa solitamente verrebbe così visivamente rappresentata:

Il metodo "Row Major Order " rappresenta la predetta Matrice in modo lineare disponendo gli elementi di ciascuna riga uno dopo l'altro per blocchi, come segue:

Per utilizzare questo metodo in Gambas dobbiamo accedere alla memoria della Matrice attraverso la proprietà ".Data " dell'Oggetto Matrice.

Mostriamo un esempio di accesso lineare in sola lettura di una Matrice:

Public Sub Main()

 Dim matr As New Integer[3, 3]
 Dim i, k As Integer  

' Scriviamo in modo consueto all'interno di tutti gli elementi della Matrice:
 For i = 0 To 2
   For k = 0 To 2
     matr[i, k] = i + k
   Next
 Next
 
' Leggiamo i valori, presenti nella Matrice, accedendo ad essa in modo lineare:
 For i = 0 To matr.Max
   Print Int@(matr.Data + (i * SizeOf(gb.Integer)))
 Next
 
End

Quest'altro esempio mostra un accesso lineare in scrittura e poi in lettura di una Matrice:

Public Sub Main()
 
 Dim matr As New Integer[3, 3]
 Dim i, k As Integer
 Dim st As Stream
 
' Scriviamo negli elementi della Matrice, accedendo ad essa in modo lineare:
 st = Memory matr.Data For Write
 For i = 0 To matr.Max
   Write #st, i As Integer
 Next
 st.Close
  
' Con le funzioni di Gambas di dereferenziazione dei Puntatori, leggiamo i valori, presenti nella Matrice, accedendo ad essa In modo lineare:
 For i = 0 To matr.Max
   Print Int@(matr.Data + (i * SizeOf(gb.Integer)))
 Next
 
End

I due esempi dimostrano appunto che i dati, presenti nell'area di memoria dell'Oggetto Matrice deputata alla loro memorizzazione, sono scritti in modo comunque sequenziale.


Riferimenti