Assegnare un vettore ad una variabile di tipo Puntatore

Da Gambas-it.org - Wikipedia.

Situazione nel linguaggio C

Nel linguaggio C è possibile avere il caso in cui un vettore viene assegnato ad una variabile di tipo Puntatore, ossia:

Variabile_Puntatore = Vettore;

ad esempio:

#include <stdio.h>


char a[3] = {1,2,3};

void main() {

  char *b;

  b = a;

  printf("%d\n", (int)b[1]);

}

Ciò è possibile, in quanto la variabile array è comunque un Puntatore all'area di memoria ove sono contenuti i valori dell'array.

Situazione nel linguaggio Gambas

In Gambas, invece, bisogna distinguere due aspetti. [nota 1]

1) la specifica area di memoria del vettore ove sono memorizzati i valori contenuti dal vettore: in quest'altro caso si assegnerà al "Puntatore" la Proprietà ".Data" posseduta dai vettori:

Variabile_Puntatore = vettore.Data

Tale Proprietà ritorna, infatti, un Puntatore all'indirizzo di memoria dei dati del vettore.


2) l'array come Oggetto: in tal caso l'assegnazione si effettua con il Metodo "Object.Address()", il quale infatti restituisce l'indirizzo di memoria dell'Oggetto vettore:

Variabile_Puntatore = Object.Address(array)

Tale Oggetto vettore è costituito dalla Struttura definita nel file header ".../main/gbx/gbx_c_array.h " dell'Interprete di Gambas.
Per poter accedere ai dati presenti nel vettore, bisognerà dereferenziare l'area di memoria puntata dal 5° membro, "void *data ", posto al byte di indice 32 della predetta Struttura "CARRAY". [nota 1]

Vediamo un esempio:

Public Sub Main()

 Dim bb As Byte[] = [11, 12, 13, 14]
 Dim p1, p2 As Pointer
 Dim i As Integer

' Accede alla Struttura "CARRAY" dell'Oggetto "Array" definita nel file header sorgente ".../main/gbx/gbx_c_array.h" di Gambas:
 p1 = Object.Address(bb)

' Accede all'area di memoria puntata dal 5° membro, "void *data", posto al byte di indice 32 della Struttura "CARRAY":
 p2 = Pointer@(p1 + 32)

 For i = 0 To 3
   Print i, Byte@(p2 + i)
 Next

End


Note

[1] Al riguardo vedere la seguente pagina: Configurazione, organizzazione ed impostazione dell'array secondo i sorgenti di Gambas

[2] Vedere anche le seguenti pagine: