Differenze tra le versioni di "Read ()"

Da Gambas-it.org - Wikipedia.
Riga 31: Riga 31:
  
  
Un'altra modalità, per ottenere il medesimo risultato, può essere la seguente:
+
Un'altra modalità, per ottenere il medesimo risultato, può essere la seguente, nella quale in particolare si aprirà il file-device dello standard input mediante la ordinaria istruzione ''Open'' nativa di Gambas.
 
   Library "libc:6"
 
   Library "libc:6"
 
   
 
   
Riga 45: Riga 45:
 
   Dim bb As Byte[]
 
   Dim bb As Byte[]
 
    
 
    
   fl = Open "/dev/stdin" For Input
+
<FONT Color=gray>' ''Per permettere che la funzione esterna "read_C" resti in attesa dell'immissione ed invio di uno o più caratteri,''
 +
' ''è necessario utilizzare l'istruzione "For Input" (e non "For Read".''</font>
 +
   fl = Open "/dev/stdin" For <FONT color=#B22222>Input</font>
 
    
 
    
 
   bb = New Byte[16]
 
   bb = New Byte[16]
 
    
 
    
   sz = read_C(fl.Handle, bb.Data, 16)
+
   sz = <FONT color=#B22222>read_C</font>(fl.Handle, bb.Data, 16)
 
    
 
    
 
   Print
 
   Print
Riga 57: Riga 59:
 
    
 
    
 
  '''End'''
 
  '''End'''
 +
Questo codice mostra come debba essere combinata l'istruzione "''Open''" nativa di Gambas con la funzione sterna di C "''read''".
  
  

Versione delle 17:49, 4 ago 2017

La funzione read( ), dichiarata nel file header "/usr/include/unistd.h"

ssize_t read (int __fd, void *__buf, size_t __nbytes)

legge da un file usando il suo file descriptor (1° parametro) un numero di byte definito nel suo 3° parametro, memorizzandoli nel buffer stabilito nel 2° parametro.


Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta. Da sottolineare che, poiché questa funzione esterna di C "read( )" è omonima alla funzione di Gambas "Read", bisognerà assegnarle un nome a piacere, ma si dovrà anche richiamare il suo vero nome con il comando Exec.
Dunque avremo ad esempio:

Private Extern read_C(_fd As Integer, __buf As Pointer, __nbytes As Long) As Long In "libc:6" Exec "read"


Mostriamo un semplice esempio pratico, nel quale il programma leggerà quanto scritto nel Terminale dall'utente:

Private const STDIN as integer = 0


Library "libc:6"

' ssize_t read (int __fd, void *__buf, size_t __nbytes)
' Read NBYTES into BUF from FD.
Private Extern read_C(__fd As Integer, __buf As Pointer, __nbytes As Long) As Long Exec "read"


Public Sub Main()
 
 Dim bb As New Byte[16]
 
  read_C(STDIN, bb.Data, 16)
 
  Print String@(bb.Data)
  
End


Un'altra modalità, per ottenere il medesimo risultato, può essere la seguente, nella quale in particolare si aprirà il file-device dello standard input mediante la ordinaria istruzione Open nativa di Gambas.

 Library "libc:6"

' ssize_t read (int __fd, void *__buf, size_t __nbytes)
' Read NBYTES into BUF from FD.
Private Extern read_C(__fd As Integer, __buf As Pointer, __nbytes As Long) As Long Exec "read"


Public Sub Main()
 
 Dim fl As File
 Dim sz As Long
 Dim bb As Byte[]
  

' Per permettere che la funzione esterna "read_C" resti in attesa dell'immissione ed invio di uno o più caratteri,

' è necessario utilizzare l'istruzione "For Input" (e non "For Read".
  fl = Open "/dev/stdin" For Input
  
  bb = New Byte[16]
  
  sz = read_C(fl.Handle, bb.Data, 16)
  
  Print
  Print bb.ToString(0, sz - 1)
  
  fl.Close
  
End

Questo codice mostra come debba essere combinata l'istruzione "Open" nativa di Gambas con la funzione sterna di C "read".



Riferimenti