Differenze tra le versioni di "Scrivere una libreria esterna che chiama funzioni esterne puntate contenute in una Struttura"

Da Gambas-it.org - Wikipedia.
 
(6 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Una libreria esterna appositamente può essere scritta per utilizzare due o più funzioni esterne puntate da un ''Puntatore'' contenute in una Struttura.  |[[#Note|1]]|
+
Una libreria esterna appositamente può essere scritta per utilizzare due o più funzioni esterne puntate da un ''Puntatore'' contenute in una Struttura.  <SUP>&#091;|[[#Note|1]]&#093;</sup>
  
  
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'':
+
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'':
 
  <FONT color=B22222>struct STRUTTURA {
 
  <FONT color=B22222>struct STRUTTURA {
 
     short (*funzS)(short);
 
     short (*funzS)(short);
Riga 21: Riga 21:
 
   
 
   
 
  }
 
  }
 
 
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 <FONT color=B22222>STRUTTURA</font> variabile_struttura;
 
 
 
void Chiama_Funzione_Short(short s) {
 
 
  variabile_struttura.funzS = Funzione_Puntata_short;  <FONT color=gray>// inizializzazione del Puntatore a funzione</font>
 
 
  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;  <FONT color=gray>// inizializzazione del Puntatore a funzione</font>
 
 
  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:
 
L'applicativo Gambas sarà invece il seguente:
 
  Library "/tmp/libadhoc"
 
  Library "/tmp/libadhoc"
Riga 59: Riga 30:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
  <FONT color=gray>' ''Genera la libreria esterna condivisa da noi scritta:''</font>
+
  <FONT color=gray>' ''Va a generare la libreria esterna condivisa da noi scritta:''</font>
  Shell "gcc -o /tmp/libadhoc.so " & Application.Path &/ "libadhoc.c -shared -fPIC" Wait
+
  Creaso()
 +
 +
  Chiama_Funzione_Short(99)
 +
 +
  Chiama_Funzione_Int(99999)
 +
 +
'''End'''
 +
 +
  '''Private''' Procedure Creaso()
 
   
 
   
  Chiama_Funzione_Short(99)
+
  File.Save("/tmp/libadhoc.c", "#include <stdio.h>\n" &
 +
                              "#include \"<FONT color=green>''/percorso/del/file/sorgente_C.c''</font>\"\n\n" &
 +
                              "struct <FONT color=B22222>STRUTTURA variabile_struttura</font>;\n\n" &
 +
                              "void Chiama_Funzione_Short(short s) {\n" &
 +
                              "  variabile_struttura.funzS = Funzione_Puntata_short;  <FONT color=gray>// inizializzazione del Puntatore a funzione</font>\n" &
 +
                              "  printf(\"Valore ritornato dalla funzione-puntata 'short': %d\\n\", <FONT color=B22222>(*variabile_struttura.funzS)(s))</font>;\n}\n\n" &
 +
                              "void Chiama_Funzione_Int(int i) {\n" &
 +
                              "  variabile_struttura.funzI = Funzione_Puntata_int;  <FONT color=gray>// inizializzazione del Puntatore a funzione</font>\n" &
 +
                              "  printf(\"Valore ritornato dalla funzione-puntata 'int': %d\\n\", <FONT color=B22222>(*variabile_struttura.funzI)(i))</font>;\n}")
 
   
 
   
  Chiama_Funzione_Int(99999)
+
  Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared  -fPIC" Wait
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 71: Riga 58:
  
 
=Note=
 
=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.
+
[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.
 
<BR>Se una libreria condivisa ''.so'' intende gestire una ''Struttura'' contenente *f (''puntatori a funzioni''), può essere perché:
 
<BR>Se una libreria condivisa ''.so'' intende gestire una ''Struttura'' contenente *f (''puntatori a funzioni''), può essere perché:
<BR>* E' possibile creare più oggetti basati su quella ''Struttura'', e usarli contemporaneamente.
+
<BR>* E' possibile creare più oggetti basati su quella ''Struttura'', e usarli contemporaneamente o non.
 
<BR>* Quegli oggetti (o quelle ''Strutture'') hanno bisogno di un ''callback'' (o "''evento''") per funzionare.
 
<BR>* Quegli oggetti (o quelle ''Strutture'') hanno bisogno di un ''callback'' (o "''evento''") per funzionare.

Versione attuale delle 18:43, 18 ago 2022

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.