Differenze tra le versioni di "Estrarre il valore di una costante definita in un file d'intestazione in C"
Riga 74: | Riga 74: | ||
− | + | Mostriamo un possibile codice: | |
− | + | Library "/tmp/lib_Cost" | |
− | <FONT Color= | + | |
+ | <FONT Color=gray>' ''double Estrae_Costante(void)'' | ||
+ | ' ''Ritorna il valore della costante prescelta.''</font> | ||
+ | Private Extern Estrae_Costante() As Float | ||
+ | |||
+ | |||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | Dim cost As Float | ||
+ | Dim parametri As String[] | ||
+ | |||
+ | <FONT Color=gray>' ''Nel primo elemento è presente il file header contenente la costante prescelta.'' | ||
+ | ' ''Nel secondo elemento è presente il tipo di valore restituito dalla funzione esterna della libreria .so .'' | ||
+ | ' ''Nel terzo elemento è presente l'identificatore della Costante, di cui intendiamo ottenere il valore.''</font> | ||
+ | parametri = ["math.h", "double", "M_E"] | ||
+ | |||
+ | <FONT Color=gray>' ''Va a creare l'apposita libreria esterna dinamica condivisa .so:''</font> | ||
+ | CreaSo(parametri) | ||
+ | |||
+ | <FONT Color=gray>' ''Richiama la funzione esterna contenuta nell'apposita libreria esterna dinamica condivisa .so:''</font> | ||
+ | cost = Estrae_Costante() | ||
+ | |||
+ | <FONT Color=gray>' ''Mostra in fine il valore della Costante richiesta:''</font> | ||
+ | Print "Il valore della Costante '"; parametri[2]; "', contenuta nel file header '"; parametri[0]; "', è:\n\n"; cost | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | '''Private''' Procedure CreaSo(prm As String[]) | ||
+ | |||
+ | <FONT Color=gray>' ''Imposta il codice sorgente in C dell'apposita libreria esterna dinamica condivisa .so:''</font> | ||
+ | File.Save("/tmp/lib_Cost.c", "#include <" & prm[0] & ">" & | ||
+ | "\n\n" & | ||
+ | prm[1] & " Estrae_Costante() {" & | ||
+ | "\n\n" & | ||
+ | " return " & prm[2] & ";" & | ||
+ | "\n\n}") | ||
+ | |||
+ | <FONT Color=gray>' ''Genera l'apposita libreria esterna dinamica condivisa .so:''</font> | ||
+ | Shell "gcc -o /tmp/lib_Cost.so /tmp/lib_Cost.c -shared -fPIC" Wait | ||
+ | |||
+ | '''End''' |
Versione delle 16:02, 18 ago 2016
Per estrarre il valore di una Costante eventualmente presente in un file d'intestazione (header file), e definita con la parola #define o Const, oppure il valore esplicitamente assegnato ad un elemento di unaEnumerazione, evitando così di dichiarane una identica anche nel codice Gambas, si potranno utilizzare un paio di codici esemplificativi.
1° esempio
In questo esempio i due parametri di tipo stringa della funzione rappresentano rispettivamente:
- "fileh" = il percorso del file d'intestazione scritto in C;
- "costante" = il preprocessore "#define" seguito dal nome identificativo della costante di cui si intende estrarre il valore definito.
Private Function RicavaCostante(fileh As String, costante As String) As String Dim fl As File Dim s As String fl = Open fileh While True s = fl.ReadLine() If s Begins costante Then s = Replace$(s, costante, Null) ' Elimina un eventuale commento alla destra del valore della costante: If s Like "*/*" Then s = Trim(Left(s, InStr(s, "/") - 1)) ' Adatta un eventuale valore esadecimale per una sua corretta gestione nel codice Gambas: If s Begins "0x" Then s = Trim(Replace(s, "0x", "00")) Break Endif Wend fl.Close() Return s End
2° esempio
In quest'altro esempio si intende cercare il valore della costante M_PI dichiarata ed istanziata nel file d'intestazione "math.h":
Public Sub Main() Dim percorso_file, obiettivo, ris As String percorso_file = "/usr/include/math.h" If Not Exist(percorso_file) Then Error.Raise("Percorso o file Errato !") obiettivo = "# define M_PI" ris = Estrai_valore(percorso_file, obiettivo) Print ris End Private Function Estrai_valore(percorso As String, ob As String) As String Dim s As String s = File.Load(percorso) If InStr(s, ob) = 0 Then Error.Raise("Definizione '" & ob & "' inesistente in: " & percorso) s = Scan(s, "*" & ob & "*\n*")[1] If InStr(s, "/") > 0 Then s = Scan(s, "*/*")[0] Endif s = Trim(s) If Right(s, 1) = "," Then s = Left(s, Len(s) - 1) Return s End
3° esempio
In questo esempio verrà estratto il valore della Costante prescelta mediante la creazione di un'apposita libreria dinamica condivisa .so, che restituirà il predetto valore.
Mostriamo un possibile codice:
Library "/tmp/lib_Cost" ' double Estrae_Costante(void) ' Ritorna il valore della costante prescelta. Private Extern Estrae_Costante() As Float Public Sub Main() Dim cost As Float Dim parametri As String[] ' Nel primo elemento è presente il file header contenente la costante prescelta. ' Nel secondo elemento è presente il tipo di valore restituito dalla funzione esterna della libreria .so . ' Nel terzo elemento è presente l'identificatore della Costante, di cui intendiamo ottenere il valore. parametri = ["math.h", "double", "M_E"] ' Va a creare l'apposita libreria esterna dinamica condivisa .so: CreaSo(parametri) ' Richiama la funzione esterna contenuta nell'apposita libreria esterna dinamica condivisa .so: cost = Estrae_Costante() ' Mostra in fine il valore della Costante richiesta: Print "Il valore della Costante '"; parametri[2]; "', contenuta nel file header '"; parametri[0]; "', è:\n\n"; cost End Private Procedure CreaSo(prm As String[]) ' Imposta il codice sorgente in C dell'apposita libreria esterna dinamica condivisa .so: File.Save("/tmp/lib_Cost.c", "#include <" & prm[0] & ">" & "\n\n" & prm[1] & " Estrae_Costante() {" & "\n\n" & " return " & prm[2] & ";" & "\n\n}") ' Genera l'apposita libreria esterna dinamica condivisa .so: Shell "gcc -o /tmp/lib_Cost.so /tmp/lib_Cost.c -shared -fPIC" Wait End