Differenze tra le versioni di "Caricare i dati di un vettore scritto in C in un vettore di un'applicazione Gambas"

Da Gambas-it.org - Wikipedia.
Riga 7: Riga 7:
 
  unsigned char vettore_C[] = {
 
  unsigned char vettore_C[] = {
 
     0x70, 0x7d, 0x86, 0x9a, 0xac, 0xb8, 0xbc, 0xc5,
 
     0x70, 0x7d, 0x86, 0x9a, 0xac, 0xb8, 0xbc, 0xc5,
     0x9d, 0xba, 0xd5, 0xe9, 0xf7, 0xfd, 0xfd, 0xf2,
+
     0x9d, 0xba, 0xd5, 0xe9, 0xf7, 0xfd, 0xfd, 0xf2
 
  };
 
  };
 
   
 
   

Versione delle 11:23, 27 giu 2015

Se si ha un codice sorgente, scritto in C, nel quale vi è una variabile vettoriale globale istanziata con dei valori, per assumere e caricare tali valori in una variabile vettoriale di un'applicazione Gambas senza che vengano ricopiati manualmente nel codice sorgente di tale applicazione, si potrà copiare - qualora siano presenti anche altri simboli e risorse - la variabile vettoriale del sorgente C in un nuovo sorgente scritto sempre in linguaggio C, aggiungendovi anche una semplice funzione che restituisca la dimensione del vettore (ossia la quantità di byte/valori contenuti) e finalmente trasformata in un'apposita libreria dinamica condivisa .so da richiamare nell'applicazione Gambas.


Mostriamo di seguito un semplice esempio.

Il codice sorgente in C della futura libreria dinamica condivisa sarà il seguente:

unsigned char vettore_C[] = {
   0x70, 0x7d, 0x86, 0x9a, 0xac, 0xb8, 0xbc, 0xc5,
   0x9d, 0xba, 0xd5, 0xe9, 0xf7, 0xfd, 0xfd, 0xf2
};

int Dimensione_Vettore() {

   return sizeof(vettore_C);

}

il predetto codice sorgente potrà ad esempio essere salvato come: /tmp/Lib_C.c


Quindi, il codice sorgente dell'applicativo Gambas potrà essere ad esempio:

Private Extern Dimensione_Vettore() As Integer In "/tmp/Lib_C"


Public Sub Main()

 Dim p As Pointer
 Dim d, i As Integer
 Dim bb As New Byte[]
 
' Generiamo l'apposita libreria dinamica condivisa .so:
  Creaso()

' Puntiamo all'area di memoria della variabile vettoriale ora contenuta dall'apposita libreria dinamica .so:
  p = System.GetExternSymbol("/tmp/Lib_C", "vettore_C")
  If IsNull(p) Then Error.Raise("Puntatore NULLO !")

' E' necessario conoscere la quantità di byte presenti nella variabile vettoriale contenuta dall'apposita libreria dinamica .so:
  d = Dimensione_Vettore()

' Leggiamo dall'area di memoria della variabile vettoriale contenuta dallalibreria dinamica .so,
' ed assegnamo i valori, così letti, alla variabile vettoriale dell'applicazione Gambas:
  For i = 1 To d
    bb.Push(Byte@(p))
    p = p + 1
  Next
  
' Vediamo semplicemente in console la quantità di elementi del vettore istanziati:
  Print bb.Count

End
 

Private Procedure Creaso()
   
  Shell "gcc -o /tmp/Lib_C.so /tmp/Lib_C.c -shared" Wait

End