Differenze tra le versioni di "Scrivere una libreria esterna che ritorna un puntatore ad un buffer di tipo char"
(4 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | 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 | + | 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 otto valori esadecimali corrispondenti ad alcuni caratteri ASCII stampabili) e copia i valori, in esso contenuti, all'interno di una variabile buffer di tipo ''char''. |
<BR>Il codice Gambas raccoglierà i valori del buffer attraverso il parametro della funzione stessa che invoca la corrispondente funzione esterna. | <BR>Il codice Gambas raccoglierà i valori del buffer attraverso il parametro della funzione stessa che invoca la corrispondente funzione esterna. | ||
− | + | <BR>Il ''buffer'' di tipo ''char'', passato dalla libreria C, viene recuperato e rappresentato nel codice Gambas da 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 | Private Extern prova(p As Pointer) As Integer | ||
Riga 33: | Riga 13: | ||
Dim st As Stream | Dim st As Stream | ||
Dim bb As Byte[] | Dim bb As Byte[] | ||
− | <FONT color=gray> | + | <FONT color=gray>' Dim i As Integer</font> |
− | |||
− | + | Creaso() | |
− | <FONT color=gray>' ''Allochiamo sufficiente memoria, e comunque in quantità almeno pari ai valori | + | <FONT color=gray>' ''Allochiamo sufficiente memoria, e comunque in quantità almeno pari ai valori presenti nel file da leggere:''</font> |
− | + | po = Alloc(SizeOf(gb.Byte), 8) | |
− | + | n = prova(<FONT color=#B22222>po</font>) | |
− | + | Print "Letti "; n; " byte dal file.\n" | |
− | + | bb = New Byte[n] | |
<FONT color=gray>' ''Il puntatore, contenente i valori provenienti dal buffer di tipo "char" della libreria C, viene dereferenziato con i "Memory Stream":''</font> | <FONT color=gray>' ''Il puntatore, contenente i valori provenienti dal buffer di tipo "char" della libreria C, viene dereferenziato con i "Memory Stream":''</font> | ||
− | + | st = Memory po For Read | |
− | + | bb.Read(st, 0, 8) | |
− | + | <FONT color=gray>' ''<SPAN style="text-decoration:underline">Qualora</span> il vettore contenga <SPAN style="text-decoration:underline">soltanto</span> valori corrispondenti a caratteri ASCII stampabili, si potranno vedere tali caratteri mediante la funzione ".ToString" del vettore di tipo "Byte[]":''</font> | |
− | + | Print bb.ToString() | |
− | <FONT color=gray>' ''<SPAN style="text-decoration:underline">Qualora</span> il vettore contenga <SPAN style="text-decoration:underline">soltanto</span> valori corrispondenti a caratteri ASCII stampabili, | ||
− | |||
− | |||
<FONT color=gray>' ''Nel caso in cui il vettore, invece, non contenga <SPAN style="text-decoration:underline">soltanto</span> caratteri ASCII stampabili, si potrà usare un ciclo: | <FONT color=gray>' ''Nel caso in cui il vettore, invece, non contenga <SPAN style="text-decoration:underline">soltanto</span> caratteri ASCII stampabili, si potrà usare un ciclo: | ||
− | + | ' For i = 0 To bb.Max | |
− | + | ' Print bb[i] | |
− | + | ' Next</font> | |
− | |||
<FONT color=gray>' ''Va in chiusura:''</font> | <FONT color=gray>' ''Va in chiusura:''</font> | ||
− | + | st.Close | |
− | + | Free(po) | |
+ | po = 0 | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | '''Private''' Procedure Creaso() | ||
+ | |||
+ | File.Save("/tmp/buff.c", "#include <stdio.h>\n\n" & | ||
+ | "int prova(char <FONT color=#B22222>* buffer</font>) {\n\n" & | ||
+ | " int n;\n" & | ||
+ | " FILE *fl;\n\n" & | ||
+ | " fl = fopen(\"<FONT color=green>/tmp/file_da_leggere</font>\", \"rb\");\n\n" & | ||
+ | " n = fread(<FONT color=#B22222>buffer</font>, 1, 8, fl);\n\n" & | ||
+ | " return n;\n\n}") | ||
+ | |||
+ | Shell "gcc -o /tmp/buff.so /tmp/buff.c -shared -fPIC" Wait | ||
'''End''' | '''End''' |
Versione attuale delle 18:25, 18 ago 2022
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 otto 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.
Il buffer di tipo char, passato dalla libreria C, viene recuperato e rappresentato nel codice Gambas da 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 i As Integer Creaso() ' Allochiamo sufficiente memoria, e comunque in quantità almeno pari ai valori presenti nel file da leggere: po = Alloc(SizeOf(gb.Byte), 8) 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, 8) ' Qualora il vettore contenga soltanto valori corrispondenti a caratteri ASCII stampabili, si potranno vedere tali caratteri mediante la funzione ".ToString" del vettore di tipo "Byte[]": Print bb.ToString() ' Nel caso in cui il vettore, invece, non contenga soltanto caratteri ASCII stampabili, si potrà usare un ciclo: ' For i = 0 To bb.Max ' Print bb[i] ' Next ' Va in chiusura: st.Close Free(po) po = 0 End Private Procedure Creaso() File.Save("/tmp/buff.c", "#include <stdio.h>\n\n" & "int prova(char * buffer) {\n\n" & " int n;\n" & " FILE *fl;\n\n" & " fl = fopen(\"/tmp/file_da_leggere\", \"rb\");\n\n" & " n = fread(buffer, 1, 8, fl);\n\n" & " return n;\n\n}") Shell "gcc -o /tmp/buff.so /tmp/buff.c -shared -fPIC" Wait End