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 8: Riga 8:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim err As Integer
 
   Dim err As Integer
Riga 41: Riga 41:
 
   fl.Close
 
   fl.Close
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Private''' Procedure Creaso()
+
   
 +
Private Procedure Creaso()
 
   
 
   
 
   File.Save("/tmp/liberrore.c", "#include <errno.h>\n\n" &
 
   File.Save("/tmp/liberrore.c", "#include <errno.h>\n\n" &
Riga 51: Riga 52:
 
   Shell "gcc -o /tmp/liberrore.so /tmp/liberrore.c -shared" Wait
 
   Shell "gcc -o /tmp/liberrore.so /tmp/liberrore.c -shared" Wait
 
   
 
   
  '''End'''
+
  End
  
 
====Usando la funzione "__errno_location()"====
 
====Usando la funzione "__errno_location()"====
Riga 59: Riga 60:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim err As Pointer
 
   Dim err As Pointer
Riga 87: Riga 88:
 
   fl.Close
 
   fl.Close
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Private''' Procedure Creaso()
+
  Private Procedure Creaso()
 
   
 
   
 
   File.Save("/tmp/liberrore.c", "#include <errno.h>\n\n" &
 
   File.Save("/tmp/liberrore.c", "#include <errno.h>\n\n" &
Riga 97: Riga 99:
 
   Shell "gcc -o /tmp/liberrore.so /tmp/liberrore.c -shared" Wait
 
   Shell "gcc -o /tmp/liberrore.so /tmp/liberrore.c -shared" Wait
 
   
 
   
  '''End'''
+
  End

Versione attuale delle 05:36, 7 giu 2024

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 "EINVAL" (codice num. 22), 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 "EINVAL":
 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 = EINVAL;\n}")

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

End

Usando la funzione "__errno_location()"

Riprendendo il codice precedente, si potrà utilizzare anhe la funzione "__errno_location() per intercettare l'errore sollevato dal sistema.

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


Public Sub Main()

 Dim err As Pointer
 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 "EINVAL":
 simula_errore()

' Raccoglie l'errore:
 err = __errno_location()

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

 For Each s In fl.Lines
   If s Like "* " & CStr(Int@(err)) & " *" Then Print "Errore n. "; CStr(Int@(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(Int@(err)) & " *" Then Print "Errore n. "; CStr(Int@(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 = EINVAL;\n}")

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

End