Differenze tra le versioni di "L'oggetto File secondo i sorgenti di Gambas"
(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;'' | ||
− | + | 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 | + | If IsNull(fl) Then Error.Raise("Impossibile aprire il file !") |
− | <FONT Color=gray>' ''p1 rappresenta: "struct CFILE.CSTREAM ob;" in " | + | <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= | + | |
+ | <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 15: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