Differenze tra le versioni di "Scrivere una libreria esterna che chiama una funzione puntata membro di una Struttura ed un'altra indipendente"

Da Gambas-it.org - Wikipedia.
Riga 19: Riga 19:
 
  int Chiama_Funzione(int i) {
 
  int Chiama_Funzione(int i) {
 
    
 
    
   variabile_struttura.a = af;
+
   <FONT color=#B22222>variabile_struttura.a = af</font>;   <FONT color=gray>// ''Inizializza il Puntatore a Funzione che punta alla Funzione af''</font>
 
   
 
   
 
  <FONT color=gray>/* ''Invoca la funzione puntata dal Puntatore a Funzione presente nella Struttura,''
 
  <FONT color=gray>/* ''Invoca la funzione puntata dal Puntatore a Funzione presente nella Struttura,''

Versione delle 07:37, 26 mag 2014

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