Differenze tra le versioni di "Estrarre il valore di una costante definita in un file d'intestazione in C"

Da Gambas-it.org - Wikipedia.
Riga 74: Riga 74:
  
  
 
+
Mostriamo un possibile codice:
 
+
Library "/tmp/lib_Cost"
<FONT Color=red size=4><B>Paragrafo in costruzione !</b></font>
+
 +
<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