Printf ()

Da Gambas-it.org - Wikipedia.

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