Differenze tra le versioni di "L'oggetto File secondo i sorgenti di Gambas"

Da Gambas-it.org - Wikipedia.
 
(10 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Un ''Oggetto'' in Gambas è costituito e vive grazie ad una complessa serie di aree di memoria riservate, rappresentate solitamente da diverse ''Strutture'' e relative sub-strutture, dichiarate in uno o più file ''header'' dei sorgenti Gambas. Anche l'Oggetto di tipo ''File'' in Gambas risponde a tale caratteristica.
+
Un ''[[Gli_Oggetti_e_le_Classi|Oggetto]]'' in Gambas è costituito e vive grazie ad una complessa serie di aree di memoria riservate, rappresentate solitamente da diverse ''Strutture'' e relative sub-strutture, dichiarate in uno o più file ''header'' dei sorgenti Gambas, scritti in linguaggio C.
 +
<BR>Anche l'Oggetto di tipo ''File'' in Gambas risponde a tale caratteristica, ossia di impiegare diverse risorse di memoria allocata sotto forma di ''Strutture'' e di sub-''Strutture''.
  
L'Oggetto ''File'' in Gambas ha come primo riferimento la Struttura, denominata "''CFILE''" e presente nel file header "''.../main/gbx/gbx_c_file.h''" dei sorgenti di Gambas, ove è così dichiarata:
+
Come sappiamo un file può essere aperto in lettura e/o scrittura con la funzione ''Open'', la quale restituisce una variabile appunto di tipo "File", che rappresenta l'<I>handle</i> per gestire il file.
 +
 
 +
L'Oggetto ''File'' in Gambas ha come primo riferimento la Struttura, denominata "''CFILE''" e presente nel file header "''.../main/gbx/gbx_c_file.h'' " dei sorgenti, scritti in C, di Gambas, ove è così dichiarata:
 
  typedef
 
  typedef
 
         struct {
 
         struct {
 
                 CSTREAM ob;
 
                 CSTREAM ob;
                int watch_fd;
 
 
                 }
 
                 }
 
         CFILE;
 
         CFILE;
Come si può notare, tale Struttura è formata da soli due membri:
+
Il membro "''CSTREAM ob''" rappresenta a sua volta un'altra Struttura presente nel citato file header "''.../main/gbx/gbx_c_file.h''" dei sorgenti di Gambas, ove è così dichiarata:
* ''CSTREAM ob;''
 
* ''int watch_fd;''
 
Il secondo membro, "''watch_fd''", è un intero che rappresenta il [https://it.wikipedia.org/wiki/Descrittore_di_file descrittore]'' del file aperto.
 
<BR>Il primo membro, "''CSTREAM ob''", invece rappresenta a sua volta un'altra Struttura presente nel citato file header "''.../main/gbx/gbx_c_file.h''" dei sorgenti di Gambas, ove è così dichiarata:
 
 
  typedef
 
  typedef
 
         struct {
 
         struct {
Riga 20: Riga 18:
 
                 }
 
                 }
 
         CSTREAM;
 
         CSTREAM;
Il primo membro di quest'altra sub-Struttura è un ''Puntatore'' ad un'ulteriore Struttura di tipo ''OBJECT'', dichiarata nel file header "''.../main/gbx/gbx_class.h''" dei sorgenti di Gambas, e dalla quale potremo ottenere qualche informazione sulla variabile di tipo ''File'' utilizzata nel codice.
+
Il primo membro di quest'altra sub-Struttura è un ''Puntatore'' ad un'ulteriore Struttura di tipo ''OBJECT'', dichiarata nel file header "''.../main/gbx/gbx_object.h''" come segue:
 +
typedef
 +
        struct {
 +
                CLASS *class;
 +
                intptr_t ref;
 +
                }
 +
        OBJECT;
 +
Il primo membro di questa Struttura è a sua volta un ''Puntatore'' ad un'altra Struttura, denominata "''CLASS''" e dichiarata nel file header "''.../main/gbx/gbx_class.h''" dei sorgenti di Gambas, e dalla quale potremo ottenere qualche informazione sulla variabile di tipo ''File'' utilizzata nel codice.
  
  
Per accedere alle suddette ''Strutture'' e leggerne alcuni valori, in esse contenuti, dovremo servirci del Metodo ''.Address( )'' della Classe ''Object'', come nell'esempio seguente scritto per sistemi a ''64-bit'':
+
Per accedere alle suddette ''Strutture'' e leggerne alcuni valori, in esse contenuti, dovremo servirci del Metodo ".Address()" della Classe ''Object'', come nell'esempio seguente:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
  Dim fl As File
+
  Dim fl As File
  Dim p1, p2 As Pointer
+
  Dim p1, p2 As Pointer
 
+
 
   fl = Open "<FONT Color=gray>''/percorso/del/file''</font>" For Read
+
   fl = Open "<FONT Color=darkgreen>''/percorso/del/file''</font>" For Read
 
   If IsNull(fl) Then Error.Raise("Impossibile aprire il file !")
 
   If IsNull(fl) Then Error.Raise("Impossibile aprire il file !")
 
    
 
    
  <FONT Color=gray>' ''p1 rappresenta: "struct CFILE.CSTREAM ob;" in ".../main/gbx/gbx_c_file.h"''</font>
+
  <FONT Color=gray>' ''p1 rappresenta la Struttura: "struct CFILE" in ".../main/gbx/gbx_c_file.h"''</font>
 
   p1 = Object.Address(fl)
 
   p1 = Object.Address(fl)
 
 
<FONT Color=gray>' ''Dereferenziamo il Puntatore "p1" dal byte di indice 56, per leggere il valore che rappresenta il "descrittore" del file aperto in questione,''
 
' ''e lo confrontiamo con il valore restituito dalla proprietà ".Handle" della Classe File attraverso la rispetiva variabile "fl" corrente:''</font>
 
  Print Int@(p1 + 56), fl.Handle
 
 
    
 
    
 
  <FONT Color=gray>' ''p2 rappresenta: "struct CLASS" in ".../main/gbx/gbx_class.h"''</font>
 
  <FONT Color=gray>' ''p2 rappresenta: "struct CLASS" in ".../main/gbx/gbx_class.h"''</font>
 
   p2 = Pointer@(p1)
 
   p2 = Pointer@(p1)
  <FONT Color=gray>' ''Accediamo al membro "char *name;" della Struttura "struct CLASS", posto al byte di indice 24''
+
  <FONT Color=gray>' ''Accediamo al membro "int count;" della Struttura "struct CLASS", posto al byte di indice 12 e ne dereferenziamo il Puntatore, per ottenere il numero di "istanze" della Classe "File" esistenti nel codice:''</font>
  ' ''e ne dereferenziamo il Puntatore, per ottenere la denominazione del tipo della variabile "fl":''</font>
+
  Print Int@(p2 + (SizeOf(gb.Integer) * 3))
   Print String@(Pointer@(p2 + 24))
+
  <FONT Color=gray>' ''Accediamo al membro "char *name;" della Struttura "struct CLASS", posto al byte di indice 24 e ne dereferenziamo il Puntatore, per ottenere la denominazione del tipo della variabile "fl":''</font>
 +
   Print String@(Pointer@(p2 + (SizeOf(gb.Pointer) * 3)))
 
    
 
    
 
   fl.Close
 
   fl.Close
 
    
 
    
  '''End'''
+
  End

Versione attuale delle 14:53, 24 giu 2024

Un Oggetto in Gambas è costituito e vive grazie ad una complessa serie di aree di memoria riservate, rappresentate solitamente da diverse Strutture e relative sub-strutture, dichiarate in uno o più file header dei sorgenti Gambas, scritti in linguaggio C.
Anche l'Oggetto di tipo File in Gambas risponde a tale caratteristica, ossia di impiegare diverse risorse di memoria allocata sotto forma di Strutture e di sub-Strutture.

Come sappiamo un file può essere aperto in lettura e/o scrittura con la funzione Open, la quale restituisce una variabile appunto di tipo "File", che rappresenta l'handle per gestire il file.

L'Oggetto File in Gambas ha come primo riferimento la Struttura, denominata "CFILE" e presente nel file header ".../main/gbx/gbx_c_file.h " dei sorgenti, scritti in C, di Gambas, ove è così dichiarata:

typedef
       struct {
               CSTREAM ob;
               }
       CFILE;

Il membro "CSTREAM ob" rappresenta a sua volta un'altra Struttura presente nel citato file header ".../main/gbx/gbx_c_file.h" dei sorgenti di Gambas, ove è così dichiarata:

typedef
       struct {
               OBJECT ob;
               STREAM stream;
               GB_VARIANT_VALUE tag;
               }
       CSTREAM;

Il primo membro di quest'altra sub-Struttura è un Puntatore ad un'ulteriore Struttura di tipo OBJECT, dichiarata nel file header ".../main/gbx/gbx_object.h" come segue:

typedef
       struct {
               CLASS *class;
               intptr_t ref;
               }
       OBJECT;

Il primo membro di questa Struttura è a sua volta un Puntatore ad un'altra Struttura, denominata "CLASS" e dichiarata nel file header ".../main/gbx/gbx_class.h" dei sorgenti di Gambas, e dalla quale potremo ottenere qualche informazione sulla variabile di tipo File utilizzata nel codice.


Per accedere alle suddette Strutture e leggerne alcuni valori, in esse contenuti, dovremo servirci del Metodo ".Address()" della Classe Object, come nell'esempio seguente:

Public Sub Main()
 
  Dim fl As File
  Dim p1, p2 As Pointer
  
  fl = Open "/percorso/del/file" For Read
  If IsNull(fl) Then Error.Raise("Impossibile aprire il file !")
  
' p1 rappresenta la Struttura: "struct CFILE" in ".../main/gbx/gbx_c_file.h"
  p1 = Object.Address(fl)
  
' p2 rappresenta: "struct CLASS" in ".../main/gbx/gbx_class.h"
  p2 = Pointer@(p1)
' Accediamo al membro "int count;" della Struttura "struct CLASS", posto al byte di indice 12 e ne dereferenziamo il Puntatore, per ottenere il numero di "istanze" della Classe "File" esistenti nel codice:
  Print Int@(p2 + (SizeOf(gb.Integer) * 3))
' Accediamo al membro "char *name;" della Struttura "struct CLASS", posto al byte di indice 24 e ne dereferenziamo il Puntatore, per ottenere la denominazione del tipo della variabile "fl":
  Print String@(Pointer@(p2 + (SizeOf(gb.Pointer) * 3)))
  
  fl.Close
  
End