Gambas-it

Gambas dal mondo esterno => Mailing List => Topic aperto da: vuott - 18 Febbraio 2021, 20:17:20

Titolo: CallBack di una Funzione di Gambas da una libreria esterna scritta in C
Inserito da: vuott - 18 Febbraio 2021, 20:17:20
https://lists.gambas-basic.org/pipermail/user/2021-February/072135.html


Titolo: Re:CallBack di una Funzione di Gambas da una libreria esterna scritta in C
Inserito da: vuott - 20 Febbraio 2021, 01:20:09
Bravissimo Martin P. Cristia (tercoide) nel aver trovato la soluzione con il Puntatore a Funzione in C.

Vi mostro una semplificazione/precisazione dei suoi due codici:
Codice: [Seleziona]
Library "/tmp/libesterna"

' int funz_C(int n, void (*cbGambas) (int))
Private Extern funz_C(num As Integer, CallbackFunction As Pointer) As Integer


Public Sub Main()

  Dim p As Pointer
  Dim err As Integer
 
  creaso()
 
' Assegna l'indirizzo di memoria della funzione "cbGambas" del progetto ad una variabile di tipo Puntatore:
  p = cbGambas
 
' Invoca la funzione "funz_C" presente nel codice della ibreria esterna scritta in C:
  err = funz_C(10, p)
  If err <> 0 Then Error.Raise("Errore !")

End


Public Function cbGambas(num As Integer)
 
  Print num
 
End


Private Procedure creaso()
 
  File.Save("/tmp/libesterna.c", "int funz_C(int n, void (*cbGambas) (int)) {   /* il 2° parametro è un Puntatore a Funzione ! */\n\n" &
  "   int i;\n\n" &
  "   for (i=1;i<=n;i++)\n" &
  "      cbGambas(i);   /* Invoca la funzione del progetto Gambas */\n\n" &
  "   return 0;\n\n}")
 
  Shell "gcc -o /tmp/libesterna.so /tmp/libesterna.c -shared" Wait
 
End
Titolo: Re:CallBack di una Funzione di Gambas da una libreria esterna scritta in C
Inserito da: vuott - 20 Febbraio 2021, 16:06:41
...comunque, ho scoperto che la soluzione era già stata data 4 anni fa dalla nostra wiki:  :D

   https://www.gambas-it.org/wiki/index.php?title=Scrivere_una_libreria_esterna_contenente_una_Funzione_di_Callback_che_chiama_una_Funzione_Callback_in_Gambas