Scrivere una libreria esterna che chiama funzioni esterne puntate contenute in una Struttura

Da Gambas-it.org - Wikipedia.

Una libreria esterna appositamente può essere scritta per utilizzare due o più funzioni esterne puntate da un Puntatore contenute in una Struttura. [|1]


Nel seguente esempio abbiamo un codice sorgente in linguaggio C, che chiameremo "sorgente_C.c ", nel quale sono presenti due o più funzioni da utilizzare, puntate ciascuna da un Puntatore a Funzione:

struct STRUTTURA {
   short (*funzS)(short);
   int   (*funzI)(int);
};


short Funzione_Puntata_short(short valore) {

 return valore + 1;

}


int Funzione_Puntata_int(int valore) {

 return valore + 1;

}

L'applicativo Gambas sarà invece il seguente:

Library "/tmp/libadhoc"

Private Extern Chiama_Funzione_Short(s As Short)
Private Extern Chiama_Funzione_Int(i As Integer)


Public Sub Main()

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

 Chiama_Funzione_Short(99)

 Chiama_Funzione_Int(99999)

End

Private Procedure Creaso()

 File.Save("/tmp/libadhoc.c", "#include <stdio.h>\n" &
                              "#include \"/percorso/del/file/sorgente_C.c\"\n\n" &
                              "struct STRUTTURA variabile_struttura;\n\n" &
                              "void Chiama_Funzione_Short(short s) {\n" &
                              "   variabile_struttura.funzS = Funzione_Puntata_short;   // inizializzazione del Puntatore a funzione\n" &
                              "   printf(\"Valore ritornato dalla funzione-puntata 'short': %d\\n\", (*variabile_struttura.funzS)(s));\n}\n\n" &
                              "void Chiama_Funzione_Int(int i) {\n" &
                              "   variabile_struttura.funzI = Funzione_Puntata_int;   // inizializzazione del Puntatore a funzione\n" &
                              "   printf(\"Valore ritornato dalla funzione-puntata 'int': %d\\n\", (*variabile_struttura.funzI)(i));\n}")

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

End


Note

[1] Il motivo di creare una Struttura, che contenga Puntatori a funzioni, può risiedere ad esempio nella necessità di creare una specie di oggetto che, per ogni istanza, sia in grado di chiamare un callback differente.
Se una libreria condivisa .so intende gestire una Struttura contenente *f (puntatori a funzioni), può essere perché:
* E' possibile creare più oggetti basati su quella Struttura, e usarli contemporaneamente o non.
* Quegli oggetti (o quelle Strutture) hanno bisogno di un callback (o "evento") per funzionare.