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.
(Creata pagina con '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 ''P...')
 
Riga 34: Riga 34:
 
   printf("Valore di 'x' passato dal membro puntatore 'variabile_struttura.a': %d\n", x);
 
   printf("Valore di 'x' passato dal membro puntatore 'variabile_struttura.a': %d\n", x);
 
   
 
   
   fp = bF;  <FONT color=gray>// ''Inizializza il Puntatore a Funzione che punta alla Funzione bF''</font>
+
   <FONT color=blue>fp = bF</font>;  <FONT color=gray>// ''Inizializza il Puntatore a Funzione che punta alla Funzione bF''</font>
 
    
 
    
   return (*fp)(x + 1);  <FONT color=gray>// ''Invoca la funzione bF puntata dal Puntatore a Funzione''</font>
+
   return <FONT color=blue>(*fp)(x + 1)</font>;  <FONT color=gray>// ''Invoca la funzione bF puntata dal Puntatore a Funzione''</font>
 
   
 
   
 
  }
 
  }

Versione delle 07:36, 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;

/* 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