Printf ()
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