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

Da Gambas-it.org - Wikipedia.
Riga 52: Riga 52:
 
   bb.Read(st, 0, 5)
 
   bb.Read(st, 0, 5)
 
      
 
      
  <FONT color=gray>' ''<SPAN style="text-decoration:underline">Qualora</span> il buffer del codice C contenga - come già detto sopra - <SPAN style="text-decoration:underline">soltanto</span> valori corrispondenti a caratteri ASCII stampabili,''
+
  <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,''
  ' ''possiamo vedere tali caratteri mediante la funzione ".ToString" del vettore di tipo "Byte[]":''</font>
+
  ' ''si potranno vedere tali caratteri mediante la funzione ".ToString" del vettore di tipo "Byte[]":''</font>
 
   Print bb.ToString()
 
   Print bb.ToString()
 
      
 
      
  <FONT color=gray>' ''Oppure si potrà usare il ciclo con la funzione "Read()":
+
  <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 j = 0 To n - 1'''
 
     '''For j = 0 To n - 1'''
      '''Read #st, b'''
+
       '''Print b
       '''Print b, Chr(b)'''
 
 
     '''Next'''</font>
 
     '''Next'''</font>
 
   
 
   

Versione delle 05:06, 21 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)
   
' 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 j = 0 To n - 1
     Print b
   Next

  
' Va in chiusura:
  st.Close
  Free(po)

End