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

Da Gambas-it.org - Wikipedia.
Riga 2: Riga 2:
  
  
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 Vettore del tipo ''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 Vettore del tipo ''Puntatore a Funzione'':
 
  void fun1(int), fun2(int);
 
  void fun1(int), fun2(int);
 
   
 
   
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''"
 
 
 
void Chiamata_Funzione(int i, int n) {
 
 
  <FONT color=B22222>(*vettore[i])(n)</font>;
 
 
}
 
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:
 
  Private Extern Chiamata_Funzione(fI As Integer, vI As Integer) In "/tmp/libadhoc"
 
  Private Extern Chiamata_Funzione(fI As Integer, vI As Integer) In "/tmp/libadhoc"
Riga 42: Riga 27:
 
  '''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()
 
    
 
    
  Chiamata_Funzione(1, 80)
+
  Chiamata_Funzione(1, 80)
 
      
 
      
 +
'''End'''
 +
 +
'''Private''' Procedure Creaso()
 +
 +
  File.Save("/tmp/libadhoc.c", "#include <stdio.h>\n" &
 +
                "#include "<FONT color=gray>''/percorso/del/file/sorgente_C.c''</font>\"\n\n" &
 +
                "void Chiamata_Funzione(int i, int n) {\n" &
 +
                "  <FONT color=B22222>(*vettore[i])(n)</font>;\n}")
 +
 +
  Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared  -fPIC" Wait
 +
 
  '''End'''
 
  '''End'''

Versione delle 17:13, 6 dic 2021

Una libreria esterna appositamente può essere scritta per utilizzare due o più funzioni esterne puntate da un Puntatore contenute in un Vettore.


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 Vettore del tipo Puntatore a Funzione:

void fun1(int), fun2(int);

/* Inizializzazione esplicita del Vettore di Puntatori a Funzione */
void (*vettore[2])() = {fun1, fun2};


void fun1(int i) {

   printf("--->%d\n", i * 10);

}


void fun2(int i) {

   printf("--->%d\n", i + 10);

}

L'applicativo Gambas sarà invece il seguente:

Private Extern Chiamata_Funzione(fI As Integer, vI As Integer) In "/tmp/libadhoc"


Public Sub Main()
  
' Va a generare la libreria esterna condivisa da noi scritta:
 Creaso()
 
 Chiamata_Funzione(1, 80)
   
End

Private Procedure Creaso()

 File.Save("/tmp/libadhoc.c", "#include <stdio.h>\n" &
               "#include "/percorso/del/file/sorgente_C.c\"\n\n" &
               "void Chiamata_Funzione(int i, int n) {\n" &
               "   (*vettore[i])(n);\n}")

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

End