Assegnare un vettore ad una variabile di tipo Puntatore
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: