Configurazione, organizzazione ed impostazione dell'oggetto Struttura secondo i sorgenti di Gambas

Da Gambas-it.org - Wikipedia.

Per la creazione di una Struttura, non v'è la sola e semplice allocazione di memoria per la memorizzazione dei dati in essa contenuti, ma, essendo anche un Oggetto di Gambas, si innesca una procedura più complessa che coinvolge più Strutture di dati a livello dei sorgenti di Gambas, e quindi diversi byte di memoria da occupare.

Tali risorse, insomma, servono sia per definire alcune caratteristiche generali dell'oggetto Struttura, sia per memorizzare i dati che essa contiene.

Vediamo, dunque, cosa avviene, appunto, a livello dei sorgenti di Gambas e quali loro risorse in particolare vengono richiamate e usate per creare e gestire una Struttura.

La memorizzazione, dunque, dei dati, avviene attraverso l'utilizzo di una Struttura, chiamata "CSTATICSTRUCT", così dichiarata nel file sorgente "...main/gbx/gbx_struct.h ":

typedef
       struct {
               OBJECT ob;
               void *ref;
               char *addr;
       }
       CSTATICSTRUCT;

Laddove abbiamo:

  • OBJECT ob, rappresenta la Struttura OBJECT, contenuta nel file sorgente ".../main/gbx/gbx_object.h" dell'Interprete. Il primo membro di tale Struttura OBJECT è a sua volta un Puntatore alla Struttura chiamata CLASS e definita nel file sorgente ".../main/gbx/gbx_class.h".
  • void *ref, è un Puntatore.
  • char *addr, è un Puntatore all'area di memoria contenente i dati della Struttura creata nel nostro progetto Gambas, ed ha inizio al byte di indice 24 dell'area di memoria della predetta Struttura CSTATICSTRUCT. I dati si dispongono in quell'area di memoria occupando ciascuno una quantità di memoria commisurata al rispettivo tipo di valori di appartenenza e nel rispetto degli eventuali allineamenti.


Accedere e leggere nella Struttura CSTATICSTRUCT

E' possibile da un progetto Gambas penetrare nella Struttura CSTATICSTRUCT e leggere i dati contenuti in alcuni suoi membri come mostriamo nel seguente semplice esempio:

Public Struct STRUTTURA
  b As Byte
  s As Short
  i As Integer
End Struct


Public Sub Main()
 
 Dim tt As New STRUTTURA
 Dim p As Pointer
 
  With tt
    .b = 99
    .s = 999
    .i = 99999
  End With
  
' Accede alla Struttura "CSTATICSTRUCT":
  p = Object.Address(tt)
  
' Avanza di 25 byte (indice 24 del flusso di memoria allocata) per accedere al membro "char *addr", e lo dereferenzia. Ciò si spiega con il fatto che il Metodo "Object.Address()" restituisce l'indirizzo di un Oggetto Gambas (in tal caso una Struttura) in memoria, non l'indirizzo dei dati a cui fa riferimento. 
  Print Byte@(p + 24)
' Avanza di due byte a causa dell'allineamento:
  Print Short@(p + 26)
  Print Int@(p + 28)
  
End