Differenze tra le versioni di "Estrarre il valore di una costante definita in un file d'intestazione in C"
Riga 4: | Riga 4: | ||
===1° esempio=== | ===1° esempio=== | ||
In questo esempio i due parametri di tipo stringa della funzione rappresentano rispettivamente: | In questo esempio i due parametri di tipo stringa della funzione rappresentano rispettivamente: | ||
− | - "fileh" = il percorso del file d'intestazione scritto in C; | + | <BR>- "fileh" = il percorso del file d'intestazione scritto in C; |
<BR>- "costante" = il preprocessore "#define" seguito dal nome identificativo della costante di cui si intende estrarre il valore definito. | <BR>- "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 | '''Private''' Function RicavaCostante(fileh As String, costante As String) As String | ||
Riga 11: | Riga 11: | ||
Dim s As String | Dim s As String | ||
− | + | fl = Open fileh | |
− | + | ||
− | + | While True | |
− | + | s = fl.ReadLine() | |
− | + | If s Begins costante Then | |
− | + | s = Replace$(s, costante, Null) | |
<FONT color=gray>' ''Elimina un eventuale commento alla destra del valore della costante:''</font> | <FONT color=gray>' ''Elimina un eventuale commento alla destra del valore della costante:''</font> | ||
− | + | If s Like "*/*" Then s = Trim(Left(s, InStr(s, "/") - 1)) | |
<FONT color=gray>' ''Adatta un eventuale valore esadecimale per una sua corretta gestione nel codice Gambas:''</font> | <FONT color=gray>' ''Adatta un eventuale valore esadecimale per una sua corretta gestione nel codice Gambas:''</font> | ||
− | + | If s Begins "0x" Then s = Trim(Replace(s, "0x", "00")) | |
− | + | Break | |
− | + | Endif | |
− | + | Wend | |
− | + | ||
− | + | fl.Close() | |
− | + | ||
− | + | Return s | |
− | + | ||
'''End''' | '''End''' | ||
Riga 37: | Riga 37: | ||
Dim percorso_file, obiettivo, ris As String | 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 = Estrae_valore(percorso_file, obiettivo) | |
− | + | ||
− | + | Print ris | |
− | + | ||
'''End''' | '''End''' | ||
+ | '''Private''' Function Estrae_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''' | '''End''' | ||
===3° esempio=== | ===3° esempio=== | ||
− | In questo esempio verrà estratto il valore della Costante prescelta mediante la creazione di un'apposita libreria | + | In questo esempio verrà estratto il valore della Costante prescelta mediante la creazione di un'apposita libreria condivisa .so, che restituirà il predetto valore. |
− | |||
Mostriamo un possibile codice, nel quale si otterrà - a mo' di esempio - il valore della Costante ''M_E'' definita nel file header ''/usr/include/math.h''. | Mostriamo un possibile codice, nel quale si otterrà - a mo' di esempio - il valore della Costante ''M_E'' definita nel file header ''/usr/include/math.h''. | ||
Riga 86: | Riga 84: | ||
Dim cost As Float | Dim cost As Float | ||
Dim parametri As String[] | Dim parametri As String[] | ||
− | + | ||
<FONT Color=gray>' ''Nel primo elemento è presente il file header contenente la costante prescelta.'' | <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 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> | ' ''Nel terzo elemento è presente l'identificatore della Costante, di cui intendiamo ottenere il valore.''</font> | ||
− | + | parametri = ["#include <math.h>", "double", "M_E"] | |
− | + | ||
<FONT Color=gray>' ''Va a creare l'apposita libreria esterna dinamica condivisa .so:''</font> | <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> | <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> | <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[]) | '''Private''' Procedure CreaSo(prm As String[]) | ||
Riga 116: | Riga 113: | ||
<FONT Color=gray>' ''Genera l'apposita libreria esterna dinamica condivisa .so:''</font> | <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 | Shell "gcc -o /tmp/lib_Cost.so /tmp/lib_Cost.c -shared -fPIC" Wait | ||
− | + | ||
'''End''' | '''End''' |
Versione attuale delle 11:42, 11 set 2022
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 = Estrae_valore(percorso_file, obiettivo) Print ris End Private Function Estrae_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 condivisa .so, che restituirà il predetto valore.
Mostriamo un possibile codice, nel quale si otterrà - a mo' di esempio - il valore della Costante M_E definita nel file header /usr/include/math.h.
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 = ["#include <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", 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