Differenze tra le versioni di "Caricare i dati di un vettore scritto in C in un vettore di un'applicazione Gambas"
Riga 4: | Riga 4: | ||
Mostriamo di seguito un semplice esempio. | Mostriamo di seguito un semplice esempio. | ||
− | + | Poniamo il caso che i dati della variabile vettoriale del codice sorgente C siano i seguenti: | |
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 | ||
}; | }; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Dal codice sorgente, nel quale è presente il predetto vettore, si genererà un'apposita libreria esterna dinamica condivisa .so . L'area di memoria del vettore, poi, sarà puntata in Gambas con il meotodo ''GetExternSymbol()'' della Classe ''System''. Ottenuto il relativo ''Puntatore'' a quell'area di memoria, poiché nel nostro caso non esistono valori uguali a zero, si leggerà all'interno dell'area medesima sino a quando non si giungerà al primo valore pari a zero, che rappresenta così l'uscita dall'area di memoria del vettore. | |
− | |||
− | |||
− | |||
− | |||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
Dim p As Pointer | Dim p As Pointer | ||
− | Dim | + | Dim i As Integer |
Dim bb As New Byte[] | Dim bb As New Byte[] | ||
<FONT Color=gray>' ''Generiamo l'apposita libreria dinamica condivisa .so:''</font> | <FONT Color=gray>' ''Generiamo l'apposita libreria dinamica condivisa .so:''</font> | ||
− | + | CreaSo() | |
<FONT Color=gray>' ''Puntiamo all'area di memoria della variabile vettoriale ora contenuta dall'apposita libreria dinamica .so:''</font> | <FONT Color=gray>' ''Puntiamo all'area di memoria della variabile vettoriale ora contenuta dall'apposita libreria dinamica .so:''</font> | ||
p = System.GetExternSymbol("/tmp/Lib_C", "vettore_C") | p = System.GetExternSymbol("/tmp/Lib_C", "vettore_C") | ||
If IsNull(p) Then Error.Raise("Puntatore NULLO !") | If IsNull(p) Then Error.Raise("Puntatore NULLO !") | ||
− | + | ||
− | + | <FONT Color=gray>' ''Leggiamo dall'area di memoria della variabile vettoriale contenuta dallalibreria dinamica .so, fino a che il valore letto non sia zero'' | |
− | |||
− | |||
− | <FONT Color=gray>' ''Leggiamo dall'area di memoria della variabile vettoriale contenuta dallalibreria dinamica .so,'' | ||
' ''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> | ||
− | + | While Byte@(p + i) > 0 | |
− | bb.Push(Byte@(p)) | + | bb.Push(Byte@(p + i)) |
− | + | Inc i | |
− | + | Wend | |
− | + | ||
<FONT Color=gray>' ''Vediamo semplicemente in console la quantità di elementi del vettore istanziati:''</font> | <FONT Color=gray>' ''Vediamo semplicemente in console la quantità di elementi del vettore istanziati:''</font> | ||
Print bb.Count | Print bb.Count | ||
Riga 51: | Riga 37: | ||
− | '''Private''' Procedure | + | '''Private''' Procedure CreaSo() |
+ | |||
+ | File.Save("/tmp/Lib_C.c", "unsigned char vettore_C[] = {" & | ||
+ | "0x70, 0x7d, 0x86, 0x9a, 0xac, 0xb8, 0xbc, 0xc5," & | ||
+ | "\n0x9d, 0xba, 0xd5, 0xe9, 0xf7, 0xfd, 0xfd, 0xf2\n};") | ||
Shell "gcc -o /tmp/Lib_C.so /tmp/Lib_C.c -shared" Wait | Shell "gcc -o /tmp/Lib_C.so /tmp/Lib_C.c -shared" Wait | ||
− | + | ||
'''End''' | '''End''' |
Versione delle 18:14, 27 ago 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.
Poniamo il caso che i dati della variabile vettoriale del codice sorgente C siano i seguenti:
unsigned char vettore_C[] = { 0x70, 0x7d, 0x86, 0x9a, 0xac, 0xb8, 0xbc, 0xc5, 0x9d, 0xba, 0xd5, 0xe9, 0xf7, 0xfd, 0xfd, 0xf2 };
Dal codice sorgente, nel quale è presente il predetto vettore, si genererà un'apposita libreria esterna dinamica condivisa .so . L'area di memoria del vettore, poi, sarà puntata in Gambas con il meotodo GetExternSymbol() della Classe System. Ottenuto il relativo Puntatore a quell'area di memoria, poiché nel nostro caso non esistono valori uguali a zero, si leggerà all'interno dell'area medesima sino a quando non si giungerà al primo valore pari a zero, che rappresenta così l'uscita dall'area di memoria del vettore.
Public Sub Main() Dim p As Pointer Dim 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 !") ' Leggiamo dall'area di memoria della variabile vettoriale contenuta dallalibreria dinamica .so, fino a che il valore letto non sia zero ' ed assegnamo i valori, così letti, alla variabile vettoriale dell'applicazione Gambas: While Byte@(p + i) > 0 bb.Push(Byte@(p + i)) Inc i Wend ' Vediamo semplicemente in console la quantità di elementi del vettore istanziati: Print bb.Count End Private Procedure CreaSo() File.Save("/tmp/Lib_C.c", "unsigned char vettore_C[] = {" & "0x70, 0x7d, 0x86, 0x9a, 0xac, 0xb8, 0xbc, 0xc5," & "\n0x9d, 0xba, 0xd5, 0xe9, 0xf7, 0xfd, 0xfd, 0xf2\n};") Shell "gcc -o /tmp/Lib_C.so /tmp/Lib_C.c -shared" Wait End