Differenze tra le versioni di "Configurazione, organizzazione ed impostazione dell'oggetto Struttura secondo i sorgenti di Gambas"
(Una versione intermedia di uno stesso utente non è mostrata) | |||
Riga 42: | Riga 42: | ||
p = Object.Address(tt) | p = Object.Address(tt) | ||
− | <FONT Color=gray>' ''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. ''</font> | + | <FONT Color=gray>' ''Avanza di 25 byte (indice 24 del flusso di memoria allocata)'' <SUP>[[[#Note|nota 1]]]</sup> ''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. ''</font> |
Print Byte@(p + '''24''') | Print Byte@(p + '''24''') | ||
<FONT Color=gray>' ''Avanza di due byte a causa dell'allineamento:''</font> | <FONT Color=gray>' ''Avanza di due byte a causa dell'allineamento:''</font> | ||
Riga 49: | Riga 49: | ||
End | End | ||
+ | |||
+ | |||
+ | |||
+ | =Note= | ||
+ | [1] Vedere anche la seguente pagina: [[Ottenere il puntatore di una variabile di tipo Struttura]] |
Versione attuale delle 18:27, 7 giu 2024
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) [nota 1] 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
Note
[1] Vedere anche la seguente pagina: Ottenere il puntatore di una variabile di tipo Struttura