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.
(Creata pagina con '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 un...')
 
Riga 38: Riga 38:
 
  void prova(char *b[4]) {  <FONT color=blue>// oppure:  void prova(char *b[]) {</font>
 
  void prova(char *b[4]) {  <FONT color=blue>// oppure:  void prova(char *b[]) {</font>
 
   
 
   
      a[0] = 'p';  <FONT color=blue>// assegna un carattere per ciascun elemento del vettore di tipo "chr"</font>
+
  a[0] = 'p';  <FONT color=blue>// assegna un carattere per ciascun elemento del vettore di tipo "chr"</font>
      a[1] = 'e';
+
  a[1] = 'e';
      a[2] = 'r';
+
  a[2] = 'r';
      a[3] = 'a';
+
  a[3] = 'a';
 
   
 
   
      *b = a;
+
  *b = a;
 
   
 
   
 
  }
 
  }
Riga 79: Riga 79:
 
   
 
   
 
   
 
   
  prova(struct nome_struttura *p) {
+
  void prova(struct nome_struttura *p) {
 
   
 
   
      variabile_struttura.a = 99;  // assegna un valore intero alla struttura */
+
  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[0] = 'p'; // assegna un carattere per ciascun elemento del vettore di tipo "chr"
      variabile_struttura.b[1] = 'e';
+
  variabile_struttura.b[1] = 'e';
      variabile_struttura.b[2] = 'r';
+
  variabile_struttura.b[2] = 'r';
      variabile_struttura.b[3] = 'a';
+
  variabile_struttura.b[3] = 'a';
 
   
 
   
      *p = variabile_struttura;
+
  *p = variabile_struttura;
 
   
 
   
 
  }
 
  }

Versione delle 03:07, 11 mar 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.


Caso generale in cui viene recuperato un Intero

Codice della libreria esterna in C:

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

}


Codice Gambas:

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


Public Sub Main()

 Dim i As Integer

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

  prova(VarPtr(i))

  Print i

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