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

Da Gambas-it.org - Wikipedia.
Versione del 16 mag 2014 alle 18:16 di Vuott (Discussione | contributi) (Creata pagina con 'Una libreria esterna appositamente può essere scritta per utilizzare due o più funzioni esterne puntate da un ''Puntatore'' contenute in una Struttura. |1| Nel ...')

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

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;

}


La libreria esterna, da noi scritta e che chiameremo libadhoc.c, sarà la seguente:

#include <stdio.h>
#include "/percorso/del/file/sorgente_C.c"


struct STRUTTURA variabile_struttura;


void Chiama_Funzione_Short(short s) {

  variabile_struttura.funzS = Funzione_Puntata_short;

  printf("Valore ritornato dalla funzione-puntata 'short': %d\n", (*variabile_struttura.funzS)(s));
 
}


void Chiama_Funzione_Int(int i) {

  variabile_struttura.funzI = Funzione_Puntata_int;

  printf("Valore ritornato dalla funzione-puntata 'int': %d\n", (*variabile_struttura.funzI)(i));

}

Il codice sorgente della libreria esterna, da noi scritta, verrà posto nella cartella Dati del progetto Gambas.


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()

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

  Chiama_Funzione_Short(99)

  Chiama_Funzione_Int(99999)

End


Note

[1] Il motivo di creare una Struttura, che contenga puntatori a funzioni, può risiedere nella necesità 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.
* Quegli oggetti (o quelle Strutture) hanno bisogno di un callback (o "evento") per funzionare.