« Risposta #1 il: 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:
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
« Ultima modifica: 21 Febbraio 2021, 20:02:10 da vuott »
Registrato
« 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. »