Differenze tra le versioni di "Configurazione, organizzazione ed impostazione dell'oggetto Struttura secondo i sorgenti di Gambas"

Da Gambas-it.org - Wikipedia.
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 5: Riga 5:
 
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''.
 
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''":
+
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
 
  typedef
 
         struct {
 
         struct {
Riga 16: Riga 16:
 
* ''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''".
 
* ''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''.
 
* ''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 <SPAN Style="text-decoration:underline">tipo</span> di valori di appartenenza e nel rispetto degli eventuali ''allineamenti''.
+
* ''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 <SPAN Style="text-decoration:underline">tipo</span> di valori di appartenenza e nel rispetto degli eventuali ''allineamenti''.
  
  
 
==Accedere e leggere nella Struttura ''CSTATICSTRUCT''==
 
==Accedere e leggere nella Struttura ''CSTATICSTRUCT''==
E' possibile da un progetto Gambas penetrare nella Struttura ''CSTATICSTRUCT'' e leggere i dati contenuti in alcune suoi membri come mostriamo nel seguente semplice esempio:
+
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
 
  Public Struct STRUTTURA
 
   b As Byte
 
   b As Byte
Riga 42: Riga 42:
 
   p = Object.Address(tt)
 
   p = Object.Address(tt)
 
    
 
    
  <FONT Color=gray>' ''Accede al membro "char *addr", e lo dereferenzia:''</font>
+
  <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>
   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>
 
   Print Short@(p + 26)
 
   Print Short@(p + 26)

Versione attuale delle 07:39, 27 mar 2023

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