L'oggetto File secondo i sorgenti di Gambas: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| 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. 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: | 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: | ||
Versione delle 16:26, 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 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:
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 "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 + 12) - 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 + 24))
fl.Close
End