Differenze tra le versioni di "Scrivere una libreria esterna che ritorna un valore attraverso un parametro di una sua funzione"

Da Gambas-it.org - Wikipedia.
Riga 12: Riga 12:
 
  }
 
  }
 
   
 
   
  <FONT color=gray>' ''Qualora debba essere passato da Gambas un valore alla libreria C attraverso un parametro di una sua funzione,''
+
  <FONT color=gray>/* ''Qualora debba essere passato da Gambas un valore alla libreria C attraverso un parametro di una sua funzione,''
  ' ''e che sarà dunque utilizzato nella funzione medesima, avremo:''</font>
+
  ''e che sarà dunque utilizzato nella funzione medesima, avremo: */''</font>
  void prova2 (int *a) {
+
  int prova2 (int *a) {
 
    
 
    
 
   int t = 99;
 
   int t = 99;
 
      
 
      
 
   *a = *a + t;
 
   *a = *a + t;
 +
 +
<FONT color=gray>/* ''Dopo la variabile, da passare attraverso il parametro della funzione, può seguire senza problemi anche altro codice.''
 +
  '' In questo caso saranno passati sia la varibile attraverso il parametro che il valore terminale di ritorno della funzione: */''</font>
 +
  Return (0);
 
   
 
   
 
  }
 
  }
Riga 27: Riga 31:
 
   
 
   
 
  Private Extern prova1(pro As Pointer)
 
  Private Extern prova1(pro As Pointer)
  Private Extern prova2(pro As Pointer)
+
  Private Extern prova2(pro As Pointer) As Integer
 
   
 
   
 
   
 
   
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
   Dim i1, i2 As Integer
+
   Dim i1, i2, rit As Integer
 
   
 
   
 
   Shell "gcc -o /tmp/libprovaC.so " & Application.Path & "/libprovaC.c -shared -fPIC" Wait
 
   Shell "gcc -o /tmp/libprovaC.so " & Application.Path & "/libprovaC.c -shared -fPIC" Wait
Riga 39: Riga 43:
 
    
 
    
 
   i2 = 1
 
   i2 = 1
   prova2(VarPtr(i2))
+
   rit = prova2(VarPtr(i2))
 
   
 
   
   Print i1, i2
+
   Print i1, i2, rit
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 21:44, 1 nov 2014

Di seguito vengono mostrati alcuni esempi, nei quali viene recuperato nel codice Gambas un valore da un parametro della funzione che invoca una funzione esterna presente in una libreria da noi scritta in C. Il codice C passerà il valore per indirizzo.


Caso generale in cui viene recuperato un Intero

Codice della libreria esterna in C:

void prova1 (int *a) {
 
  int t = 99;
   
  *a = t;

}

/* Qualora debba essere passato da Gambas un valore alla libreria C attraverso un parametro di una sua funzione,
e che sarà dunque utilizzato nella funzione medesima, avremo: */
int prova2 (int *a) {
 
  int t = 99;
   
  *a = *a + t;

/* Dopo la variabile, da passare attraverso il parametro della funzione, può seguire senza problemi anche altro codice.
   In questo caso saranno passati sia la varibile attraverso il parametro che il valore terminale di ritorno della funzione: */
  Return (0);

}


Codice Gambas:

Library "/tmp/libprovaC"

Private Extern prova1(pro As Pointer)
Private Extern prova2(pro As Pointer) As Integer


Public Sub Main()

 Dim i1, i2, rit As Integer

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

  prova1(VarPtr(i1))
 
  i2 = 1
  rit = prova2(VarPtr(i2))

  Print i1, i2, rit

End


Caso in cui viene recuperato un Vettore di tipo "char"

Codice della libreria esterna in C:

char a[4];


void prova(char *b[4]) {   // oppure:  void prova(char *b[]) {

  a[0] = 'p';   // assegna un carattere per ciascun elemento del vettore di tipo "chr"
  a[1] = 'e';
  a[2] = 'r';
  a[3] = 'a';

  *b = a;

}


Codice Gambas:

Library "/tmp/libprovaC"
Private Extern prova(po As Pointer)


Public Sub Main()

 Dim p As Pointer

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

 prova(VarPtr(p))

 Print string@(p)

End


Caso in cui viene recuperata una Struttura

Codice della libreria esterna in C:

struct nome_struttura {
  int a;
  char b[4];
};


struct nome_struttura variabile_struttura;


void prova(struct nome_struttura *p) {

  variabile_struttura.a = 99;   // assegna un valore intero alla struttura */

  variabile_struttura.b[0] = 'p'; // assegna un carattere per ciascun elemento del vettore di tipo "chr"
  variabile_struttura.b[1] = 'e';
  variabile_struttura.b[2] = 'r';
  variabile_struttura.b[3] = 'a';

  *p = variabile_struttura;

}


Codice Gambas:

Public Struct Nome_Struttura
  a As Integer
  b[4] As Byte
End Struct


Library "/tmp/libprovaC"
Private Extern prova(nomenStru as Nome_Struttura)


Public Sub Main()

 Dim nst As New Nome_Struttura

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

 prova(nst)

 Print nst.a
 Print nst.b.ToString()

End