Differenze tra le versioni di "Scrivere una libreria esterna contenente una Funzione di Callback che chiama una Funzione Callback in Gambas"

Da Gambas-it.org - Wikipedia.
Riga 4: Riga 4:
  
  
Facciamo due esempi.
+
Facciamo qualche esempio.
  
  
Riga 93: Riga 93:
 
   Print ris
 
   Print ris
 
   
 
   
 +
'''End'''
 +
 +
 +
 +
===Terzo esempio===
 +
In quest'altro esempio la ''Funzione di Callback'', presente nella libreria esterna ''ad hoc'', non ritornerà alcun dato alla ''funzione callback'' presente in Gambas.
 +
<BR>Il codice in linguaggio C della ''funzione di callback'' sarà inserito, per maggiore praticità, nel programma principale di Gambas.
 +
Library "/tmp/libadhoc"
 +
 +
<FONT Color=gray>' ''void Funzione_di_Callback(<FONT Color=#B22222>void *fp(void)</font>)''
 +
' ''Funzione di callback.''</font>
 +
Private Extern Funzione_di_Callback(fp As Pointer)
 +
 +
 +
'''Public''' Sub Main()
 +
 
 +
<FONT Color=gray>' ''Crea la libreria esterna contenente la "funzione di callback":''</font>
 +
  CreaSo()
 +
 
 +
<FONT Color=gray>' ''Invoca la "funzione di callback", contenuta nella libreria esterna da noi generata,''
 +
' ''e le passa la "funzione callback" presente di seguito in questo progetto Gambas:''</font>
 +
  Funzione_di_Callback(<FONT Color=#B22222>riceve</font>)
 +
 
 +
'''End'''
 +
 +
 +
'''Private''' Procedure CreaSo()
 +
 
 +
  File.Save("/tmp/libadhoc.c", "void Funzione_di_Callback(<FONT Color=#B22222>void *fp(void)</font>) {\n" &
 +
            "  <FONT Color=#B22222>fp()</font>;\n}")
 +
           
 +
  Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared" Wait
 +
 
 +
'''End'''
 +
 +
 +
'''Private''' Function riceve()  <FONT Color=gray>' ''Funzione Callback''</font>
 +
 +
  Print "Ricevuto !"
 +
 
 
  '''End'''
 
  '''End'''

Versione delle 09:03, 23 mag 2016

La "Funzione Callback" è una funzione, della quale viene passato mediante una variabile di tipo Puntatore l'indirizzo ad una funzione di libreria (Funzione di Callback) in modo tale che al momento previsto questa Funzione di Callback della libreria possa chiamare la Funzione Callback, eventualmente anche passandole dei parametri.

Come sappiamo è possibile passare l'indirizzo di una Funzione CallBack di Gambas ad una Funzione di Callback presente in una libreria esterna. In questa pagina vedremo come scrivere un'apposita libreria esterna contenente una Funzione di Callback, alla quale viene passato l'indirizzo di una Funzione Callback presente nel codice dell'applicativo Gambas.


Facciamo qualche esempio.


Primo esempio

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

#include <unistd.h>


int (*po)(int);   // Dichiarazione del "Puntatore a Funzione"


void invia(void (*fp)) {    // Funzione di Callback

  int i = 0;

  po = fp;   // Inizializzazione del "Puntatore a Funzione"
  
  while (i < 100) {
  
/* Invoca la funzione callback di Gambas mediante il "Puntatore a Funzione"
   e le passa il valore della variabile intera "i": */
    if ((i % 10) == 0)  (*po)(i);

    usleep(50000);
    
    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:

Private Extern invia(ricP As Pointer) In "/tmp/libadhoc"


Public Sub Main()

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

' Invoca la "Funzione di Callback" della libreria esterna,
' passandole l'indirizzo della "Funzione Callback" di Gambas:
  invia(riceve)

End



Private Function riceve(i As Integer)   ' Funzione Callback
 
  Print "Ricevuto: "; i
 
End


Secondo esempio

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

void Funzione_C(int i, void (*Funzione_Gambas)(int)) {

  int n = 100;
  int a;
 
  for (i = 0; i < n ; i++) {
     a = i * n;
     Funzione_Gambas(a);
  }
 
}


L'applicativo Gambas sarà invece il seguente:

Public Extern Funzione_C(i As Integer, FunzioneCallback As Pointer) In "/tmp/libadhoc"


Public Sub Main()

 Shell "gcc -o /tmp/libadhoc.so " & Application.Path &/ "libadhoc.c -shared -fPIC" Wait
 
 Funzione_C(10, Funzione_Callback)

End


Private Sub Funzione_Callback(ris As Integer)
    
 Print ris

End


Terzo esempio

In quest'altro esempio la Funzione di Callback, presente nella libreria esterna ad hoc, non ritornerà alcun dato alla funzione callback presente in Gambas.
Il codice in linguaggio C della funzione di callback sarà inserito, per maggiore praticità, nel programma principale di Gambas.

Library "/tmp/libadhoc"

' void Funzione_di_Callback(void *fp(void))
' Funzione di callback.
Private Extern Funzione_di_Callback(fp As Pointer)


Public Sub Main()
 
' Crea la libreria esterna contenente la "funzione di callback":
 CreaSo()
 
' Invoca la "funzione di callback", contenuta nella libreria esterna da noi generata,
' e le passa la "funzione callback" presente di seguito in questo progetto Gambas:
 Funzione_di_Callback(riceve)
  
End


Private Procedure CreaSo()
 
 File.Save("/tmp/libadhoc.c", "void Funzione_di_Callback(void *fp(void)) {\n" &
           "  fp();\n}")
           
 Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared" Wait
 
End


Private Function riceve()   ' Funzione Callback

 Print "Ricevuto !"
  
End