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 relativo alle due Funzioni nel nostro esempio è contenuto tutto in una libreria esterna condivisa .so, da noi scritta e che chiameremo libadhoc.c, sarà la seguente:

#include <stdio.h>


struct STRUTTURA {
   int (*a)(int);
   char *s;
};

struct STRUTTURA variabile_struttura;


int af (int);
int bF (int);


int Chiama_Funzione(int i) {
 
  variabile_struttura.a = af;   // Inizializza il Puntatore a Funzione che punta alla Funzione af

/* Invoca la funzione puntata dal Puntatore a Funzione presente nella Struttura,
e ritorna il risultato finale delle operazioni compiute dalle due Funzioni: */
  return (*variabile_struttura.a)(i);

}


int af(int x) {

  int (*fp)();

  printf("Valore di 'x' passato dal membro puntatore 'variabile_struttura.a': %d\n", x);

  fp = bF;   // Inizializza il Puntatore a Funzione che punta alla Funzione bF
 
  return (*fp)(x + 1);   // Invoca la funzione bF puntata dal Puntatore a Funzione

}


int bF (int y){

  printf("Valore di y passato dalla funzione 'aF': %d  (x + 1)\n", y);

  return y + y;

}


L'applicativo Gambas sarà invece il seguente:

Library "/tmp/libadhoc"

Private Extern Chiama_Funzione(i As Integer) As Integer


Public Sub Main()

 Dim ris As Integer

' Genera la libreria esterna condivisa da noi scritta:
  Shell "gcc -o /tmp/libadhoc.so " & Application.Path &/ "libadhoc.c -shared  -fPIC" Wait

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

End