Gambas-it

Programmazione => Progetti degli utenti => Topic aperto da: vuott - 17 Maggio 2017, 01:29:33

Titolo: Usare senza errori la funzione esterna ldiv( )
Inserito da: vuott - 17 Maggio 2017, 01:29:33
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:

Codice: [Seleziona]
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