Differenze tra le versioni di "Caricare i dati di un vettore scritto in C in un vettore di un'applicazione Gambas"
(Creata pagina con '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...') |
|||
Riga 41: | Riga 41: | ||
' ''ed assegnamo i valori, così letti, alla variabile vettoriale dell'applicazione Gambas:''</font> | ' ''ed assegnamo i valori, così letti, alla variabile vettoriale dell'applicazione Gambas:''</font> | ||
For i = 1 To d | For i = 1 To d | ||
− | bb. | + | bb.Push(Byte@(p)) |
p = p + 1 | p = p + 1 | ||
Next | Next |
Versione delle 11:20, 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