Differenze tra le versioni di "Ottenere la descrizione del tipo di errore dai file header "errno-base.h" e "errno.h""

Da Gambas-it.org - Wikipedia.
Riga 10: Riga 10:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
   Dim s, err As String
+
   Dim err As Integer
 
   Dim fl As File
 
   Dim fl As File
 +
  Dim s As String
 
   
 
   
 
  <FONT Color=gray>' ''Va a creare la libreria condivisa esterna, che simulerà la sollevazione di un errore "9":''</font>
 
  <FONT Color=gray>' ''Va a creare la libreria condivisa esterna, che simulerà la sollevazione di un errore "9":''</font>
Riga 21: Riga 22:
 
  <FONT Color=gray>' ''Raccoglie l'errore:''</font>
 
  <FONT Color=gray>' ''Raccoglie l'errore:''</font>
 
   err = System.Error
 
   err = System.Error
 +
 +
<FONT Color=gray>' ''Per intercettare l'errore può usare anche il Metodo "System.GetExternSymbol()":''
 +
' '''Dim p As Pointer'''
 +
' '''p = System.GetExternSymbol("/tmp/liberrore", "errno")'''
 +
' '''err = Int@(p)'''</font>
 
   
 
   
 
   fl = Open "/usr/include/asm-generic/errno-base.h"
 
   fl = Open "/usr/include/asm-generic/errno-base.h"
 
   
 
   
 
   For Each s In fl.Lines
 
   For Each s In fl.Lines
     If s Like "* " & err & " *" Then Print "Errore n. "; err; ": "; Scan(s, "*/*/*")[1]
+
     If s Like "* " & CStr(err) & " *" Then Print "Errore n. "; CStr(err); ": "; Scan(s, "*/*/*")[1]
 
   Next
 
   Next
 
   fl.Close
 
   fl.Close
Riga 31: Riga 37:
 
   fl = Open "/usr/include/asm-generic/errno.h"
 
   fl = Open "/usr/include/asm-generic/errno.h"
 
   For Each s In fl.Lines
 
   For Each s In fl.Lines
     If s Like "* " & err & " *" Then Print "Errore n. "; err; ": "; Scan(s, "*/*/*")[1]
+
     If s Like "* " & CStr(err) & " *" Then Print "Errore n. "; CStr(err); ": "; Scan(s, "*/*/*")[1]
 
   Next
 
   Next
 
   fl.Close
 
   fl.Close

Versione delle 17:37, 5 ott 2022

Molte funzioni esterne in caso errore ritornano tipi di errore contenuti e descritti nei file header errno-base.h e errno.h.

Essendo tali file header sostanzialmente dei file di testo, è abbastanza agevole, volendo, estrarre da essi sulla base del valore di errore, ritornato dalla funzione esterna, la descrizione di questo presente nel file header.

Nell'esempio che segue, avremo una libreria condivisa esterna, da noi scritta in C, con la quale fingiamo di provocare un errore "9", che sarà successivamente raccolto dal nostro codice Gambas mediante il Metodo ".Error" della Classe nativa System.

' void simula_errore()
Private Extern simula_errore() In "/tmp/liberrore"


Public Sub Main()

 Dim err As Integer
 Dim fl As File
 Dim s As String

' Va a creare la libreria condivisa esterna, che simulerà la sollevazione di un errore "9":
 Creaso()

' Simula la sollevazione di un errore "9":
 simula_errore()

' Raccoglie l'errore:
 err = System.Error

' Per intercettare l'errore può usare anche il Metodo "System.GetExternSymbol()":
' Dim p As Pointer
' p = System.GetExternSymbol("/tmp/liberrore", "errno")
' err = Int@(p)

 fl = Open "/usr/include/asm-generic/errno-base.h"

 For Each s In fl.Lines
   If s Like "* " & CStr(err) & " *" Then Print "Errore n. "; CStr(err); ": "; Scan(s, "*/*/*")[1]
 Next
 fl.Close

 fl = Open "/usr/include/asm-generic/errno.h"
 For Each s In fl.Lines
   If s Like "* " & CStr(err) & " *" Then Print "Errore n. "; CStr(err); ": "; Scan(s, "*/*/*")[1]
 Next
 fl.Close

End

Private Procedure Creaso()

 File.Save("/tmp/liberrore.c", "#include <errno.h>\n\n" &
                               "void simula_errore() {\n" &
                               "   errno = 9;\n}")

 Shell "gcc -o /tmp/liberrore.so /tmp/liberrore.c -shared -fPIC" Wait

End