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

Da Gambas-it.org - Wikipedia.
(Creata pagina con "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-str...")
 
Riga 11: Riga 11:
 
* ''CSTREAM ob;''
 
* ''CSTREAM ob;''
 
* ''int watch_fd;''
 
* ''int watch_fd;''
<BR>Il secondo membro ''watch_fd'' è un intero che rappresenta il ''descrittore'' del file aperto.
+
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:
+
<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 30: Riga 30:
 
    
 
    
 
   fl = Open "<FONT Color=gray>''/percorso/del/file''</font>" For Read
 
   fl = Open "<FONT Color=gray>''/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 "User.Home &/ trunk/main/gbx/gbx_c_file.h"''</font>
+
  <FONT Color=gray>' ''p1 rappresenta: "struct CFILE.CSTREAM ob;" 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=red size=4><B>Pagina in costruzione !</b></font>
+
 
 +
<FONT Color=gray>' ''p2 rappresenta: "struct CLASS" in ".../main/gbx/gbx_class.h"''</font>
 +
  p2 = Pointer@(p1)
 +
<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 + 24))
 +
 
 +
  fl.Close
 +
 
 +
'''End'''

Versione delle 16:18, 27 dic 2016

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.

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:

typedef
       struct {
               CSTREAM ob;
               int watch_fd;
               }
       CFILE;

Come si può notare, tale Struttura è formata da soli due membri:

  • CSTREAM ob;
  • int watch_fd;

Il secondo membro, "watch_fd", è un intero che rappresenta il descrittore del file aperto.
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
       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_class.h" dei sorgenti di Gambas, e dalla quale potremo ottenere qualche informazione sulla variabile di tipo File utilizzata nel codice.


Per penetrare nelle suddette Strutture e leggerne alcuni valori, in esse contenuti, dovremo sevirci del Metodo .Address( ) dea 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: "struct CFILE.CSTREAM ob;" in ".../main/gbx/gbx_c_file.h"
  p1 = Object.Address(fl)
  
' 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:
  Print Int@(p1 + 56), fl.Handle
  
' p2 rappresenta: "struct CLASS" in ".../main/gbx/gbx_class.h"
  p2 = Pointer@(p1)
' 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 + 24))
  
  fl.Close
  
End