Differenze tra le versioni di "Scrivere una libreria esterna che ritorna una Struttura"

Da Gambas-it.org - Wikipedia.
Riga 35: Riga 35:
 
   
 
   
 
   Dim nst As New Nome_Struttura
 
   Dim nst As New Nome_Struttura
 +
 +
  Shell "gcc -o /tmp/libprovaC.so " & Application.Path & "/libprovaC.c -shared -fPIC" Wait
 
    
 
    
 
   nst = prova()
 
   nst = prova()
 
   
 
   
 
   Print nst.a, String@(nst.b)
 
   Print nst.a, String@(nst.b)
 +
 +
'''End'''
 +
 +
 +
 +
===Caso in cui la funzione esterna ritorna una ''Struttura'' avente tra i suoi membri uno o più ''vettori'' di tipo "''char''"===
 +
Codice della libreria esterna in C:
 +
struct nome_struttura {
 +
  char b[4];
 +
  int a;
 +
};
 +
 +
struct nome_struttura variabile_struttura;
 +
 +
 +
struct nome_struttura *prova() {
 +
 +
    variabile_struttura.b[0] = 'p';  <FONT color=blue>//assegna un carattere per ciascun elemento del vettore di tipo "chr"</font>
 +
    variabile_struttura.b[1] = 'e';
 +
    variabile_struttura.b[2] = 'r';
 +
    variabile_struttura.b[3] = 'a';
 +
 +
    variabile_struttura.a = 99;
 +
 +
    return &variabile_struttura;      <FONT color=blue>// ritorna l'indirizzo di "variabile_struttura"</font>
 +
 +
};
 +
 +
 +
Codice Gambas
 +
 +
Se un membro della ''Struttura'', presente nella libreria esterna in C, è dichiarato come un vettore di tipo "''char''", allora il corrispondente membro della rispettiva ''Struttura'' in Gambas potrà essere dichiarato come vettore di tipo ''Byte[]''. I valori ASCII di tale vettore di tipo ''Byte[]'' potranno essere recuperati, ai fini della ricomposizione dell'intera stringa di caratteri, con il metodo ''.ToString()''.
 +
 +
Public Struct Nome_Struttura
 +
  b[4] As Byte
 +
  a As Integer
 +
End Struct
 +
 +
 +
Library "/tmp/libprovaC"
 +
Private Extern prova() 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
 +
 +
  nst = prova()
 +
 +
  Print nst.b.ToString()
 +
  Print nst.a
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 03:52, 11 mar 2014

Di seguito è mostrato un esempio, nel quale la funzione esterna della libreria in C ritorna una Struttura.


Codice della libreria esterna in C:

struct nome_struttura {
  int a;
  char *b;
};

struct nome_struttura variabile_struttura;</font>


struct nome_struttura *prova() {

   variabile_struttura.a = 99;    // Assegna i valori ai membri della Struttura
   variabile_struttura.b = "prova";

   return &variabile_struttura;

}


Codice Gambas:

Public Struct Nome_Struttura
  a As Integer
  b As Pointer
End Struct


Library "/tmp/libprovaC"
Private Extern prova() 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
 
  nst = prova()

  Print nst.a, String@(nst.b)

End


Caso in cui la funzione esterna ritorna una Struttura avente tra i suoi membri uno o più vettori di tipo "char"

Codice della libreria esterna in C:

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

struct nome_struttura variabile_struttura;


struct nome_struttura *prova() {

   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';

   variabile_struttura.a = 99;

   return &variabile_struttura;       // ritorna l'indirizzo di "variabile_struttura"

};


Codice Gambas

Se un membro della Struttura, presente nella libreria esterna in C, è dichiarato come un vettore di tipo "char", allora il corrispondente membro della rispettiva Struttura in Gambas potrà essere dichiarato come vettore di tipo Byte[]. I valori ASCII di tale vettore di tipo Byte[] potranno essere recuperati, ai fini della ricomposizione dell'intera stringa di caratteri, con il metodo .ToString().

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


Library "/tmp/libprovaC"
Private Extern prova() 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

 nst = prova()

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

End