Differenze tra le versioni di "Scrivere una libreria esterna che ritorna un puntatore ad un buffer di tipo char"
(Creata pagina con 'Di seguito è mostrato un esempio, nel quale la funzione esterna della libreria in C ritorna un ''Puntatore'' ad una variabile di tipo "''char''" mediante un proprio parametro...') |
|||
Riga 41: | Riga 41: | ||
po = Alloc(5) | po = Alloc(5) | ||
− | n = | + | n = prova(<FONT color=#B22222>po</font>) |
+ | |||
Print "Letti "; n; " byte dal file.\n" | Print "Letti "; n; " byte dal file.\n" | ||
Versione delle 16:49, 20 mar 2014
Di seguito è mostrato un esempio, nel quale la funzione esterna della libreria in C ritorna un Puntatore ad una variabile di tipo "char" mediante un proprio parametro. In particolare, la funzione, presente nella libreria C esterna da noi scritta, apre un semplice file (che supponiamo contenga dei valori esadecimali corrispondenti ad alcuni caratteri ASCII stampabili) e copia i valori, in esso contenuti, all'interno di una variabile buffer di tipo char.
Il codice Gambas raccoglierà i valori del buffer attraverso il parametro della funzione stessa che invoca la corrispondente funzione esterna.
Codice della libreria esterna in C:
#include <stdio.h> int prova(char * buffer) { int n; FILE *fl; fl = fopen("/tmp/s", "rb"); n = fread(buffer, 1, 5, fl); return n; }
Codice Gambas:
il buffer di tipo char, passato dalla libreria C, viene recuperato e rappresentato nel odice Gambasda una variabile di tipo Puntatore, che andrà poi dereferenziato al fine di recuperare i valori passati.
Library "/tmp/buff" Private Extern prova(p As Pointer) As Integer Public Sub Main() Dim n As Integer Dim po As Pointer Dim st As Stream Dim bb As Byte[] ' Dim j, b As Byte Shell "gcc -o /tmp/buff.so " & Application.path &/ "buff.c -shared -fPIC" Wait ' Allochiamo sufficiente memoria, e comunque in quantità almeno pari ai valori prsenti nel file da leggere: po = Alloc(5) n = prova(po) Print "Letti "; n; " byte dal file.\n" bb = New Byte[n] ' Il puntatore, contenente i valori provenienti dal buffer di tipo "char" della libreria C, viene dereferenziato con i "Memory Stream": st = Memory po For Read bb.Read(st, 0, 5) Print bb.ToString() ' Oppure si potrà usare il ciclo con la funzione "Read()": For j = 0 To n - 1 Read #st, b Print b, Chr(b) Next ' Va in chiusura: st.Close Free(po) End