Differenze tra le versioni di "Scrivere una libreria esterna che ritorna un puntatore ad un buffer di tipo char"

Da Gambas-it.org - Wikipedia.
 
(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 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''.
+
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.
Codice della libreria esterna in C:
+
  Library "/tmp/buff"
#include <stdio.h>
 
 
int prova(char <FONT color=#B22222>* buffer</font>) {
 
 
  int n;
 
 
  FILE *fl;
 
   
 
  fl = fopen("/tmp/s", "rb");
 
 
  n = fread(<FONT color=#B22222>buffer</font>, 1, 5, fl);
 
 
  return n;
 
 
   
 
   
}
 
 
 
 
Codice Gambas:
 
<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>' ''Dim i As Integer</font>
+
  <FONT color=gray>' Dim i As Integer</font>
 
 
   
 
   
  Shell "gcc -o /tmp/buff.so " & Application.path &/ "buff.c -shared -fPIC" Wait
+
  Creaso()
 
   
 
   
  <FONT color=gray>' ''Allochiamo sufficiente memoria, e comunque in quantità almeno pari ai valori prsenti nel file da leggere:''</font>
+
  <FONT color=gray>' ''Allochiamo sufficiente memoria, e comunque in quantità almeno pari ai valori presenti nel file da leggere:''</font>
  po = Alloc(5)
+
  po = Alloc(SizeOf(gb.Byte), 8)
 
   
 
   
  n = prova(<FONT color=#B22222>po</font>)
+
  n = prova(<FONT color=#B22222>po</font>)
 
   
 
   
  Print "Letti "; n; " byte dal file.\n"
+
  Print "Letti "; n; " byte dal file.\n"
 
   
 
   
  bb = New Byte[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
+
  st = Memory po For Read
   
+
  bb.Read(st, 0, 8)
  bb.Read(st, 0, 5)
+
  <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,''
 
' ''si potranno vedere tali caratteri mediante la funzione ".ToString" del vettore di tipo "Byte[]":''</font>
 
  Print bb.ToString()
 
 
      
 
      
 
  <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
+
  ' For i = 0 To bb.Max
      Print bb[i]
+
  '  Print bb[i]
    Next</font>
+
  ' Next</font>
 
 
    
 
    
 
  <FONT color=gray>' ''Va in chiusura:''</font>
 
  <FONT color=gray>' ''Va in chiusura:''</font>
  st.Close
+
  st.Close
  Free(po)
+
  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