Differenze tra le versioni di "Printf ()"

Da Gambas-it.org - Wikipedia.
Riga 4: Riga 4:
  
  
Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché bisognerà dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta:
+
Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché bisognerà dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta.
Private <FONT color=#B22222>Extern printf</font>(testo As String, ....) As Pointer
 
Per ottenere il risultato in console, bisognerà far ritornare dalla funzione una variabile di tipo ''puntatore'' e <SPAN style="text-decoration=underline">non</span> di tipo ''stringa'', altrimenti sarà sollevato un errore "''Segmentation fault (11)''" !
 
  
 +
Vanno considerati almeno due casi: uso della funzione ''printf()'' con le stringhe di caratteri, ed uso con valori numerici.
  
  
Semplice esempio uso in Gambas:
+
===Uso di ''printf()'' con le stringhe di caratteri===
'''Private''' <FONT color=#B22222>Extern printf</font>(testo As String) As Pointer In "libc:6"
+
Nel caso si debba utilizzare la funzione ''printf()'' con le stringhe di caratteri, ai fini della sua dichiarazione con ''Extern'' in Gambas il valore di ritorno va dichiarato come tipo ''Puntatore'' che andrà poi dereferenziato, e <SPAN style="text-decoration=underline">non</span> di tipo ''stringa'', altrimenti sarà sollevato un errore "''Segmentation fault (11)''". Vanno inoltre considerati due sottocasi:
 +
 
 +
1) uso di una stringa esplicita. In questo caso l'argomento all'interno della funzione ovviamente sarà la sola stringa di caratteri da scrivere in console.
 +
<BR>La dichiarazione, dunque, sarà:
 +
Private <FONT color=#B22222>Extern printf</font>(testo As String) As Pointer
 +
 
 +
 
 +
2) uso di una varibile di tipo stringa. In questo altro caso la funzione ''fprint()'' avrà almeno due argomenti, entrambi di tipo stringa, il primo rappresentato dalla stringa di formattazione, ed il secondo dalla variabile contenente la stringa di caratteri da mostrare in console.
 +
<BR>La dichiarazione, dunque, sarà:
 +
Private <FONT color=#B22222>Extern printf</font>(formatt$ as string, var$ As String) As Pointer
 +
 
 +
 
 +
Alcuni esempi con il primo caso:
 +
Private <FONT color=#B22222>Extern printf</font>(testo As String) As Pointer In "libc:6"
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  '''Public''' Sub Main()
 
   
 
   
 
   Dim p As Pointer
 
   Dim p As Pointer
Riga 30: Riga 42:
  
 
Si potrà, però, ottenere più velocemente il medesimo risultato ponendo un semplice ''Print'' dopo la funzione ''Printf'':
 
Si potrà, però, ottenere più velocemente il medesimo risultato ponendo un semplice ''Print'' dopo la funzione ''Printf'':
  '''Public''' Sub Button1_Click()
+
  '''Public''' Sub Main()
 
   
 
   
 
    
 
    
Riga 41: Riga 53:
  
 
ed in modo più complesso leggendo dal file-device ''pts'' con l'istruzione ''Input'' o anche ''Input Line'':
 
ed in modo più complesso leggendo dal file-device ''pts'' con l'istruzione ''Input'' o anche ''Input Line'':
  '''Public''' Sub Button1_Click()
+
  '''Public''' Sub Main()
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
Riga 57: Riga 69:
 
  '''End'''
 
  '''End'''
 
oppure leggendo il ''file-descriptor'' corrispondente allo "stdout":
 
oppure leggendo il ''file-descriptor'' corrispondente allo "stdout":
  '''Public''' Sub Button1_Click()
+
  '''Public''' Sub Main()
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
Riga 69: Riga 81:
 
   
 
   
 
   Input #fl, s
 
   Input #fl, s
 +
 +
'''End'''
 +
 +
 +
Un esempio con il secondo caso:
 +
Private <FONT color=#B22222>Extern printf</font>(formatt$ As String, var$ As String) As Pointer In "libc:6"
 +
 +
 +
'''Public''' Sub Main()
 +
 +
  Dim s As String
 +
  Dim p As Pointer
 +
 +
  s = "Testo qualsiasi"
 +
 +
  p = printf("%s\n", testo)
 +
 +
  Print String@(p)
 +
 +
'''End'''
 +
 +
 +
===Uso di ''printf()'' con valori numerici===
 +
Nel caso si debba utilizzare la funzione ''printf()'' con le stringhe di caratteri, ai fini della sua dichiarazione con ''Extern'' in Gambas il valore di ritorno va dichiarato con il tipo di variabile numerica che si intende ritornare (Byte, Short, Integer, etc.). La funzione, inoltre, avrà due argomenti: uno relativo alla stringa di formattazione, l'altro relativo al valore numerico o alla variabile.
 +
<BR>Per la scrittura del risultato in console (o Terminale) è sufficiente la sola funzione ''printf()''.
 +
 +
La dichiarazione dunque, se ad esempio si vuol ritornare un valore di tipo ''Integer'', sarà:
 +
  Private <FONT color=#B22222>Extern printf</font>(formatt$ As String, numero As Integer) As Integer
 +
 +
 +
Esempio pratico:
 +
'''Public''' Sub Main()
 +
 
 +
  printf("%d\n", 4444 + 5555)
 +
 +
'''End'''
 +
 +
Se si vuole utilizzare la formattazione esadecimale:
 +
'''Public''' Sub Main()
 +
 +
  Dim i, n As Integer
 +
 +
  n = 11
 +
 
 +
  printf("%02X\n", n)
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 18:08, 20 gen 2015

La funzione della libreria di C

int printf(const char *format, ...)

scrive su stdout gli argomenti stringa passati.


Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché bisognerà dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta.

Vanno considerati almeno due casi: uso della funzione printf() con le stringhe di caratteri, ed uso con valori numerici.


Uso di printf() con le stringhe di caratteri

Nel caso si debba utilizzare la funzione printf() con le stringhe di caratteri, ai fini della sua dichiarazione con Extern in Gambas il valore di ritorno va dichiarato come tipo Puntatore che andrà poi dereferenziato, e non di tipo stringa, altrimenti sarà sollevato un errore "Segmentation fault (11)". Vanno inoltre considerati due sottocasi:

1) uso di una stringa esplicita. In questo caso l'argomento all'interno della funzione ovviamente sarà la sola stringa di caratteri da scrivere in console.
La dichiarazione, dunque, sarà:

Private Extern printf(testo As String) As Pointer


2) uso di una varibile di tipo stringa. In questo altro caso la funzione fprint() avrà almeno due argomenti, entrambi di tipo stringa, il primo rappresentato dalla stringa di formattazione, ed il secondo dalla variabile contenente la stringa di caratteri da mostrare in console.
La dichiarazione, dunque, sarà:

Private Extern printf(formatt$ as string, var$ As String) As Pointer


Alcuni esempi con il primo caso:

Private Extern printf(testo As String) As Pointer In "libc:6"


Public Sub Main()

 Dim p As Pointer
 Dim s As String


  p = printf("Prova funzione 'printf'")

' Dereferenziamo il Puntatore per ottenere il testo:
    s = String@(p)

    Print s

End

Si potrà, però, ottenere più velocemente il medesimo risultato ponendo un semplice Print dopo la funzione Printf:

Public Sub Main()

 
  p = printf("Prova funzione 'printf'")

  Print

End


ed in modo più complesso leggendo dal file-device pts con l'istruzione Input o anche Input Line:

Public Sub Main()

 Dim fl As File
 Dim s As String


' Apriamo il "file-device pts". n rappresenta e deve quindi ovviamente essere sostituito
' con il file-device "pts" corrispondente allo "stdout":
  fl = Open "/dev/pts/n" For Input

  printf("Prova funzione 'printf'")

  Input #fl, s

End

oppure leggendo il file-descriptor corrispondente allo "stdout":

Public Sub Main()

 Dim fl As File
 Dim s As String


' Apriamo il "file-descriptor" corrispondente allo "stdout":
  fl = Open "/proc/self/fd/1" For Input

  printf("Prova funzione 'printf'")

  Input #fl, s

End


Un esempio con il secondo caso:

Private Extern printf(formatt$ As String, var$ As String) As Pointer In "libc:6"


Public Sub Main()

 Dim s As String
 Dim p As Pointer

  s = "Testo qualsiasi"

  p = printf("%s\n", testo)

  Print String@(p)

End


Uso di printf() con valori numerici

Nel caso si debba utilizzare la funzione printf() con le stringhe di caratteri, ai fini della sua dichiarazione con Extern in Gambas il valore di ritorno va dichiarato con il tipo di variabile numerica che si intende ritornare (Byte, Short, Integer, etc.). La funzione, inoltre, avrà due argomenti: uno relativo alla stringa di formattazione, l'altro relativo al valore numerico o alla variabile.
Per la scrittura del risultato in console (o Terminale) è sufficiente la sola funzione printf().

La dichiarazione dunque, se ad esempio si vuol ritornare un valore di tipo Integer, sarà:

 Private Extern printf(formatt$ As String, numero As Integer) As Integer


Esempio pratico:

Public Sub Main()
 
 printf("%d\n", 4444 + 5555)

End

Se si vuole utilizzare la formattazione esadecimale:

Public Sub Main()

 Dim i, n As Integer

  n = 11
 
  printf("%02X\n", n)

End