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

Da Gambas-it.org - Wikipedia.
 
(13 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per la creazione di un vettore (''array''), non v'è la sola e semplice allocazione di memoria per la memorizzazione dei dati contenuti negli cosiddetti ''elementi'' del vettore medesimo, ma, essendo anche il vettore 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. <SUP>[[#Note|nota 1]]</sup>
+
Per la creazione di un vettore (''array''), non v'è la sola e semplice allocazione di memoria per la memorizzazione dei dati contenuti negli cosiddetti ''elementi'' del vettore medesimo, ma, essendo anche il vettore 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. <SUP>&#91;[[#Note|nota 1]]&#93;</sup>
  
Tali risorse, insomma, servono per definire sia le caratteristiche generali del vettore, sia dei dati che esso contiene.
+
Tali risorse, insomma, servono sia per definire le caratteristiche generali del vettore, sia per memorizzare i dati che esso contiene e riportarne le caratteristiche.
  
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 un vettore.
+
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 un vettore. <SUP>&#91;[[#Note|nota 2]]&#93;</sup>
  
 
La memorizzazione, dunque, dei dati caratterizzanti il vettore e dei dati, e loro caratteristiche (come ad esempio il ''tipo'' di valori), contenuti dal vettore, avviene attraverso l'utilizzo di una ''Struttura'', costituita a sua volta da due ''Strutture'':
 
La memorizzazione, dunque, dei dati caratterizzanti il vettore e dei dati, e loro caratteristiche (come ad esempio il ''tipo'' di valori), contenuti dal vettore, avviene attraverso l'utilizzo di una ''Struttura'', costituita a sua volta da due ''Strutture'':
* la Struttura chiamata ''ARRAY'' e contenuta nel file sorgente "''.../main/share/gb_array.h''";
+
* la Struttura chiamata ''ARRAY'' e contenuta nel file sorgente "''.../main/share/gb_array.h'' ";
* la Struttura chiamata ''OBJECT'' e contenuta nel file sorgente "''...main/gbx/gbx_object.h''" dell'Interprete.
+
* la Struttura chiamata ''OBJECT'' e contenuta nel file sorgente "''...main/gbx/gbx_object.h'' " dell'Interprete.
Questa unica ''Struttura'', scritta in C, utile per la memorizzazione dei dati in genere del vettore, è chiamata ''CARRAY'' ed è contenuta nel file sorgente "''.../main/gbx/gbx_c_array.h''" dell'Interprete.
+
Questa unica ''Struttura'', scritta in C, utile per la memorizzazione dei dati in genere del vettore, è chiamata ''CARRAY'' ed è contenuta nel file sorgente "''.../main/gbx/gbx_c_array.h'' " dell'Interprete.
  
 
Essa è lì così dichiarata:
 
Essa è lì così dichiarata:
Riga 23: Riga 23:
 
         CARRAY;
 
         CARRAY;
 
Laddove, con riferimento ai membri che ci interessano, abbiamo:
 
Laddove, con riferimento ai membri che ci interessano, abbiamo:
* ''OBJECT object'', rappresenta la predetta 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 object''''', rappresenta la predetta 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''".
* ''int size'', è un Intero che rappresenta la quantità di memoria in byte del ''tipo'' dei valori contenuti nel vettore.
+
* '''''int size''''', è un Intero (''Integer'') che rappresenta la quantità di memoria in byte del ''tipo'' dei valori contenuti nel vettore.
* ''int count'', è un Intero che rappresenta la quantità di dati/elementi contenuti dal vettore.
+
* '''''int count''''', è un Intero che rappresenta la quantità di dati/elementi contenuti dal vettore.
* ''TYPE type'', è un Intero Lungo (''Long'') che rappresenta il ''tipo'' dei dati contenuti nel vettore, secondo i valori definiti nel "''Gambas datatypes identifiers''" del file sorgente "''.../main/share/gambas.h''".
+
* '''''TYPE type''''', è un Intero Lungo (''Long'') che rappresenta il ''tipo'' dei dati contenuti nel vettore, secondo i valori definiti nel "''Gambas datatypes identifiers''" del file sorgente "''.../main/share/gambas.h''".
* ''void *data'', è un ''Puntatore'' all'area riservata ove sono memorizzati i dati contenuti dal vettore.
+
* '''''void *data''''', è un ''Puntatore'' all'area riservata ove sono memorizzati i dati contenuti dal vettore.
  
  
Riga 35: Riga 35:
 
===Utilizzare solo ''Puntatori''===
 
===Utilizzare solo ''Puntatori''===
 
Questa prima modalità prevede l'uso dei soli ''Puntatori'' per accedere e muoversi all'interno dell'area di memoria della Struttura ''CARRAY'', e dunque leggere i dati contenuti nei suoi membri.
 
Questa prima modalità prevede l'uso dei soli ''Puntatori'' per accedere e muoversi all'interno dell'area di memoria della Struttura ''CARRAY'', e dunque leggere i dati contenuti nei suoi membri.
 +
<BR>(L'esempio seguente funziona con sistema a 64-bit !)
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
  Dim bb As Byte[]
+
  Dim bb As Byte[]
  Dim p1, p2, p3 As Pointer
+
  Dim p1, p2, p3 As Pointer
  Dim s As String
+
  Dim s As String
  Dim i As Integer
+
  Dim i As Integer
  Dim l As Long
+
  Dim l As Long
 
+
 
   bb = [11, 22, 33, 44]
 
   bb = [11, 22, 33, 44]
 
      
 
      
Riga 62: Riga 63:
 
        
 
        
 
       p2 = Pointer@(p1 + 32)    <FONT Color=gray>' ''Accede al membro "void *data"''</font>
 
       p2 = Pointer@(p1 + 32)    <FONT Color=gray>' ''Accede al membro "void *data"''</font>
        For i = 0 To bb.Max   <FONT Color=gray>' ''Mostra i dati contenuti nell'area di memoria puntata dal membro "void *data"''</font>
+
      For i = 0 To bb.Max       <FONT Color=gray>' ''Mostra i dati contenuti nell'area di memoria puntata dal membro "void *data"''</font>
          Print Byte@(p2 + i),
+
        Print Byte@(p2 + i),
        Next
+
      Next
 
        
 
        
 
  '''End'''
 
  '''End'''
Riga 71: Riga 72:
 
===Utilizzare anche una ''Struttura'' dichiarata in Gambas===
 
===Utilizzare anche una ''Struttura'' dichiarata in Gambas===
 
La seconda modalità prevede, invece, l'uso di un ''Puntatore'' per il solo accesso all'area di memoria della ''Struttura'', e la successiva assegnazione di tale ''Puntatore'' ad una ''Struttura'' dichiarata nel progetto Gambas di dimensioni e configurazione simili alla Struttura ''CARRAY''.
 
La seconda modalità prevede, invece, l'uso di un ''Puntatore'' per il solo accesso all'area di memoria della ''Struttura'', e la successiva assegnazione di tale ''Puntatore'' ad una ''Struttura'' dichiarata nel progetto Gambas di dimensioni e configurazione simili alla Struttura ''CARRAY''.
 +
Public Struct OBJECTs      <FONT Color=gray>' ''Riproduce la Struttura annidata 'OBJECT' dichiarata nel file sorgente 'gbx_object.h'''</font>
 +
  class_ As Pointer
 +
  ref As Long
 +
End Struct
 +
 +
Public Struct CARRAY      <FONT Color=gray>' ''Riproduce la Struttura 'CARRAY' dichiarata nel file sorgente 'gbx_c_array.h'''</font>
 +
  object_ As Struct OBJECTs
 +
  size As Integer
 +
  count As Integer
 +
  type As Long
 +
  data As Pointer
 +
  dim_ As Pointer
 +
  ref As Pointer
 +
End Struct
 +
 +
 +
'''Public''' Sub Main()
 +
 
 +
  Dim bb As Byte[]
 +
  Dim p1 As Pointer
 +
  Dim carr As New CARRAY
 +
  Dim i As Integer
 +
 
 +
  bb = [11, 22, 33, 44, 55]
 +
 +
<FONT Color=gray>' ''Accede alla Struttura "CARRAY":''</font>
 +
  p1 = Object.Address(bb)
 +
   
 +
<FONT Color=gray>' ''Assegna l'indirizzo di memoria della Struttura 'CARRAY' all'omonima Struttura scritta in Gambas:''</font>
 +
  carr = p1
 +
 
 +
<FONT Color=gray>' ''Mostra i valori presenti nella Struttura dichiarata in Gambas:''</font>
 +
  With carr
 +
    Print "Byte occupati dal tipo di valore dell'array: "; .size; " byte"
 +
    Print "Quantità di elementi presenti nell'array:    "; .count
 +
    Print "Tipo dei valori contenuti dall'array        "; .type
 +
    Print "Il vettore contiene i seguenti valori:"
 +
    For i = 0 to bb.Max
 +
      Print Byte@(.data + i),
 +
    Next     
 +
  End With
 +
   
 +
'''End'''
 +
  
  
  
 
----
 
----
 
  
 
=Note=
 
=Note=
[1] Un oggetto Gambas non è soltanto un'astrazione, un elemento generico di un Classe, né soltanto un'immagine di un aggeggio (widget) virtuale. Esso è innanzitutto memoria allocata, debitamente e coerentemente, secondo i tipi dichiarati in alcune Strutture, previste dai sorgenti di Gambas, che lo specificano come  un Oggetto ben determinato appartenente ad una Classe specifica.
+
[1] Un oggetto Gambas non è soltanto un'astrazione, un elemento generico di un Classe, né soltanto un'immagine di un aggeggio (widget) virtuale. Esso è innanzitutto memoria allocata, debitamente e coerentemente, secondo i tipi dichiarati in alcune Strutture, previste dai sorgenti di Gambas, che lo caratterizzano come  un Oggetto ben determinato appartenente ad una Classe specifica.
 
 
 
 
 
 
 
 
 
 
 
 
  
<FONT Color=red size=4><B>Pagina in costruzione !</b></font>
+
[2] La descrizione esposta in questa pagina vale anche per le matrici annidate ( ''matrice[rig, col]'' ).

Versione attuale delle 08:32, 21 ago 2022

Per la creazione di un vettore (array), non v'è la sola e semplice allocazione di memoria per la memorizzazione dei dati contenuti negli cosiddetti elementi del vettore medesimo, ma, essendo anche il vettore 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. [nota 1]

Tali risorse, insomma, servono sia per definire le caratteristiche generali del vettore, sia per memorizzare i dati che esso contiene e riportarne le caratteristiche.

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 un vettore. [nota 2]

La memorizzazione, dunque, dei dati caratterizzanti il vettore e dei dati, e loro caratteristiche (come ad esempio il tipo di valori), contenuti dal vettore, avviene attraverso l'utilizzo di una Struttura, costituita a sua volta da due Strutture:

  • la Struttura chiamata ARRAY e contenuta nel file sorgente ".../main/share/gb_array.h ";
  • la Struttura chiamata OBJECT e contenuta nel file sorgente "...main/gbx/gbx_object.h " dell'Interprete.

Questa unica Struttura, scritta in C, utile per la memorizzazione dei dati in genere del vettore, è chiamata CARRAY ed è contenuta nel file sorgente ".../main/gbx/gbx_c_array.h " dell'Interprete.

Essa è lì così dichiarata:

typedef
       struct {
               OBJECT object;
               int size;
               int count;
               TYPE type;
               void *data;
               int *dim;
               void *ref;
               }
       CARRAY;

Laddove, con riferimento ai membri che ci interessano, abbiamo:

  • OBJECT object, rappresenta la predetta 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".
  • int size, è un Intero (Integer) che rappresenta la quantità di memoria in byte del tipo dei valori contenuti nel vettore.
  • int count, è un Intero che rappresenta la quantità di dati/elementi contenuti dal vettore.
  • TYPE type, è un Intero Lungo (Long) che rappresenta il tipo dei dati contenuti nel vettore, secondo i valori definiti nel "Gambas datatypes identifiers" del file sorgente ".../main/share/gambas.h".
  • void *data, è un Puntatore all'area riservata ove sono memorizzati i dati contenuti dal vettore.


Accedere e leggere nella Struttura CARRAY

E' possibile da un progetto Gambas penetrare nella Struttura CARRAY e leggere i dati contenuti nei suoi membri mediante due modalità che mostriamo di seguito.

Utilizzare solo Puntatori

Questa prima modalità prevede l'uso dei soli Puntatori per accedere e muoversi all'interno dell'area di memoria della Struttura CARRAY, e dunque leggere i dati contenuti nei suoi membri.
(L'esempio seguente funziona con sistema a 64-bit !)

Public Sub Main()
 
  Dim bb As Byte[]
  Dim p1, p2, p3 As Pointer
  Dim s As String
  Dim i As Integer
  Dim l As Long

  bb = [11, 22, 33, 44]
   
  p1 = Object.Address(bb)      ' Accede alla Struttura "CARRAY"
  
     p2 = Pointer@(p1)         ' Accede alla Struttura "CLASS"
        p3 = Pointer@(p2 + 24) ' Accede al membro "char *name"
        s = String@(p3)        ' Dereferenzia il membro "char *name"
        Print s                ' Mostra il dato contenuto dal membro "char *name"
  
     i = int@(p1 + 16)         ' Dereferenzia il membro "int size"
     Print i                   ' Mostra il dato contenuto dal membro "int size"
     
     i = int@(p1 + 20)         ' Dereferenzia il membro "int count"
     Print i                   ' Mostra il dato contenuto dal membro "int count"
     
     l = int@(p1 + 24)         ' Dereferenzia il membro "TYPE type"
     Print l                   ' Mostra il dato contenuto dal membro "TYPE type"
     
     p2 = Pointer@(p1 + 32)    ' Accede al membro "void *data"
     For i = 0 To bb.Max       ' Mostra i dati contenuti nell'area di memoria puntata dal membro "void *data"
       Print Byte@(p2 + i),
     Next
     
End


Utilizzare anche una Struttura dichiarata in Gambas

La seconda modalità prevede, invece, l'uso di un Puntatore per il solo accesso all'area di memoria della Struttura, e la successiva assegnazione di tale Puntatore ad una Struttura dichiarata nel progetto Gambas di dimensioni e configurazione simili alla Struttura CARRAY.

Public Struct OBJECTs      ' Riproduce la Struttura annidata 'OBJECT' dichiarata nel file sorgente 'gbx_object.h'
  class_ As Pointer
  ref As Long
End Struct

Public Struct CARRAY      ' Riproduce la Struttura 'CARRAY' dichiarata nel file sorgente 'gbx_c_array.h'
  object_ As Struct OBJECTs
  size As Integer
  count As Integer
  type As Long
  data As Pointer
  dim_ As Pointer
  ref As Pointer
End Struct


Public Sub Main()
 
  Dim bb As Byte[]
  Dim p1 As Pointer
  Dim carr As New CARRAY
  Dim i As Integer
 
  bb = [11, 22, 33, 44, 55]

' Accede alla Struttura "CARRAY":
  p1 = Object.Address(bb)
   
' Assegna l'indirizzo di memoria della Struttura 'CARRAY' all'omonima Struttura scritta in Gambas:
  carr = p1
  
' Mostra i valori presenti nella Struttura dichiarata in Gambas:
  With carr
    Print "Byte occupati dal tipo di valore dell'array: "; .size; " byte"
    Print "Quantità di elementi presenti nell'array:    "; .count
    Print "Tipo dei valori contenuti dall'array         "; .type
    Print "Il vettore contiene i seguenti valori:"
    For i = 0 to bb.Max
      Print Byte@(.data + i),
    Next       
  End With
   
End




Note

[1] Un oggetto Gambas non è soltanto un'astrazione, un elemento generico di un Classe, né soltanto un'immagine di un aggeggio (widget) virtuale. Esso è innanzitutto memoria allocata, debitamente e coerentemente, secondo i tipi dichiarati in alcune Strutture, previste dai sorgenti di Gambas, che lo caratterizzano come un Oggetto ben determinato appartenente ad una Classe specifica.

[2] La descrizione esposta in questa pagina vale anche per le matrici annidate ( matrice[rig, col] ).