Risulta che l'uso diretto in Gambas mediante
Extern della funzione esterna "
ldiv( )", dichiarata nel file header "
/usr/include/stdlib.h", genera inspiegabilmente un grave errore.
Per ovviare a tale problema, è necessario servirsi di una apposita libreria esterna, da noi scritta in C, con la quale richiamare ed utilizzare indirettamente la funzione esterna "
ldiv( )".
Mostriamo un esempio pratico:
Library "/tmp/libnostra"
Public Struct Ldiv_t
quot As Long
rem As Long
End Struct
' void ldivis(long int num, long int den, long int *li)
' La funzione esterna della nostra libreria per utilizzare con sicurezza la funzione esterna "ldiv( )".
Private Extern ldivis(num As Long, den As Long, li As Pointer)
Public Sub Main()
Dim ld As Ldiv_t
Dim p As Pointer
' Crea la nostra libreria esterna, scritta in C:
CreaSo()
' Allochiamo una quantità adeguata di memoria per accogliere due Puntatori:
p = Alloc(SizeOf(gb.Pointer), 2)
ldivis(100000, 30000, p) ' passa il Puntatore "p" per "Indirizzo"
' Assegnamo il Puntatore "p", restituito dalla nostra libreria esterna, alla Struttura "Ldiv_t":
ld = p
' ...vediamo i valori - quoziente e resto - nei due membri della Struttura "Ldiv_t":
Print ld.quot
Print ld.rem
' Libera la memoria anteriormente riservata:
Free(p)
End
Private Procedure CreaSo()
' Crea il file sorgente .c della nostra libreria externa:
File.Save("/tmp/libnostra.c", "#include <stdlib.h>\n\n" &
"void ldivis(long int num, long int den, long int *li) {\n\n" &
" ldiv_t res;\n\n" &
" res = ldiv(num, den);\n\n" &
" *li = res.quot;" &
" *(li+1) = res.rem;\n\n}")
' Genera la nostra apposita libreria esterna:
Shell "gcc -o /tmp/libnostra.so /tmp/libnostra.c -shared -fPIC" Wait
End