Autore Topic: Usare senza errori la funzione esterna ldiv( )  (Letto 330 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.248
  • Ne mors quidem nos iunget
    • Mostra profilo
Usare senza errori la funzione esterna ldiv( )
« il: 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



« Ultima modifica: 02 Giugno 2017, 00:15:51 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »