Scrivere una libreria esterna che chiama una funzione puntata membro di una Struttura ed un'altra indipendente

Da Gambas-it.org - Wikipedia.

Il seguente esempio è comprendia in sé il caso di una Funzione, puntata da un Puntatore a Funzione contenuto in una Struttura, e di una Funzione, puntata da un altro Puntatore a Funzione indipendente.

Il codice Gambas passa alla funzione principale della libreria esterna condivisa un valore di tipo Intero che sarà subito passato alla funzione puntata dal Puntatore membro della Struttura. In tale funzione avverrà una prima manipolazione del dato numerico, e il risultato dell'operazione sarà passato alla seconda Funzione, quella indipendente, puntata da una variabile libera anch'essa di tipo Puntatore. Questa seconda Funzione effettuerà sul valore passatole un'ulteriore operazione, il cui risultato tornerà alla Funzione principale iniziale della Libreria esterna, da noi scritta, la quale a sua volta ritornerà detto valore finale alla funzione chiamante del codice Gambas.

Mostriamo un esempio pratico.
Il codice relativo alle due Funzioni nel nostro esempio è contenuto tutto in una libreria esterna condivisa .so, da noi scritta e che chiameremo libadhoc.c.

Private Extern Chiama_Funzione(i As Integer) As Integer In "/tmp/libadhoc"


Public Sub Main()

 Dim ris As Integer

' Va a generare la libreria esterna condivisa da noi scritta:
 Creaso()

 ris = Chiama_Funzione(99)
 
 Print "\nValore ritornato all'applicativo Gambas: "; ris

End

Private Procedure Creaso()

 File.Save("/tmp/libadhoc.c", "#include <stdio.h>\n\n" &
               "struct STRUTTURA {\n" &
               "  int (*a)(int);\n" &
               "  char *s;\n};\n\n" &
               "  struct STRUTTURA variabile_struttura;\n\n" &
               "  int af (int);\n" &
               "  int bF (int);\n" &
               "int Chiama_Funzione(int i) {\n" &
               "   variabile_struttura.a = af;   // Inizializza il Puntatore a Funzione che punta alla Funzione \"af()\"\n\n" &
               "/* Invoca la funzione puntata dal Puntatore a Funzione presente nella Struttura, e ritorna il risultato finale delle operazioni compiute dalle due Funzioni: */\n" &
               "   return (*variabile_struttura.a)(i);\n}\n\n" &
               "int af(int x) {\n\n" &
               "   int (*fp)();\n" &
               "   printf(\"Valore di x passato dal membro puntatore 'variabile_struttura.a': %d\\n\", x);\n" &
               "   fp = bF;   // Inizializza il Puntatore a Funzione che punta alla Funzione \"bF()\"\n\n" &
               "   return (*fp)(x + 1);   // Invoca la funzione \"bF()\" puntata dal Puntatore a Funzione\n}\n\n" &
               "int bF (int y){\n" &
               "   printf(\"Valore di y passato dalla funzione 'aF()': %d = (x + 1)\\n\", y);\n\n" &
               "   return y + y;\n}")

 Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared  -fPIC" Wait

End