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 1: Riga 1:
 
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 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 Gambas passa alla funzione principale della libreria esterna condivisa un valore di tipo ''Intero'' che sarà subito passato alla funzione puntata dal ''Puntatore'' membro della Struttura. In tale funzione avverrà una prima manipolazione del dato numerico, e il risultato dell'operazione sarà passato alla seconda Funzione, quella indipendente, puntata da una variabile libera anch'essa di tipo ''Puntatore''. Questa seconda Funzione effettuerà sul valore passatole un'ulteriore operazione, il cui risultato tornerà alla Funzione principale iniziale della Libreria esterna, da noi scritta, la quale a sua volta ritornerà detto valore finale alla funzione chimante del codice Gambas.
  
 
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:
 
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:

Versione delle 07:44, 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 Gambas passa alla funzione principale della libreria esterna condivisa un valore di tipo Intero che sarà subito passato alla funzione puntata dal Puntatore membro della Struttura. In tale funzione avverrà una prima manipolazione del dato numerico, e il risultato dell'operazione sarà passato alla seconda Funzione, quella indipendente, puntata da una variabile libera anch'essa di tipo Puntatore. Questa seconda Funzione effettuerà sul valore passatole un'ulteriore operazione, il cui risultato tornerà alla Funzione principale iniziale della Libreria esterna, da noi scritta, la quale a sua volta ritornerà detto valore finale alla funzione chimante del codice Gambas.

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