Differenze tra le versioni di "Printf ()"

Da Gambas-it.org - Wikipedia.
 
(10 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
La funzione della libreria di C
 
La funzione della libreria di C
  int printf(const char *format, ...)
+
  int printf (const char *__restrict __format, ...)
 
scrive su ''stdout'' gli argomenti stringa passati.
 
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.
+
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.
 
Vanno considerati almeno due casi: uso della funzione ''printf()'' con le stringhe di caratteri, ed uso con valori numerici.
Riga 10: Riga 10:
  
 
===Uso di ''printf()'' con le stringhe di caratteri===
 
===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 <SPAN style="text-decoration=underline">non</span> di tipo ''stringa'', altrimenti sarà sollevato un errore "''Segmentation fault (11)''". Vanno inoltre considerati due sottocasi:
+
Nel caso si debba utilizzare la funzione ''printf()'' con le stringhe di caratteri, ai fini della sua dichiarazione con ''Extern'' in Gambas 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.
+
1) senza uso del parametro di formattazione. 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à:
 
<BR>La dichiarazione, dunque, sarà:
  Private <FONT color=#B22222>Extern printf</font>(testo As String) As Pointer
+
  Private <FONT color=#B22222>Extern printf</font>(__format As String) As Integer
  
  
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.
+
Un esempio pratico:
<BR>La dichiarazione, dunque, sarà:
+
<FONT Color=gray>' ''int printf (const char *__restrict __format, ...)''
  Private <FONT color=#B22222>Extern printf</font>(formatt$ as string, var$ As String) As Pointer
+
  ' ''Write formatted output to stdout.''</font>
 
+
  Private Extern printf(__format As String) As Integer In "libc:6"
 
 
Alcuni esempi con il primo caso:
 
  Private <FONT color=#B22222>Extern printf</font>(testo As String) As Pointer In "libc:6"
 
 
   
 
   
 
   
 
   
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
   Dim p As Pointer
+
   Dim testo As String
  Dim s As String
 
 
   
 
   
 +
  testo = "Testo qualsiasi"
 
   
 
   
   p = printf("Prova funzione 'printf'")
+
   printf(testo)
+
 
<FONT color=gray>' ''Dereferenziamo il Puntatore per ottenere il testo:''</font>
+
  printf("\nTesto qualsiasi")
    s = String@(p)
 
 
    Print s
 
 
   
 
   
 
  '''End'''
 
  '''End'''
  
Si potrà, però, ottenere più velocemente il medesimo risultato ponendo un semplice ''Print'' dopo la funzione ''Printf'':
+
 
  '''Public''' Sub Main()
+
2) uso del parametro di formattazione. 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, potrà essere:
 
+
  Private <FONT color=#B22222>Extern printf</font>(__format as string, param As String) As Integer
  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'':
+
Un esempio pratico:
  '''Public''' Sub Main()
+
<FONT Color=gray>' ''int printf (const char *__restrict __format, ...)''
 +
' ''Write formatted output to stdout.''</font>
 +
  Private Extern printf(__format As String, param As String) As Integer In "libc:6"
 
   
 
   
  Dim fl As File
 
  Dim s As String
 
 
   
 
   
 
<FONT color=gray>' ''Apriamo il "file-device pts". <FONT color=#B22222>n</font> rappresenta e deve quindi ovviamente essere sostituito''
 
' ''con il file-device "pts" corrispondente allo "stdout":''</font>
 
  fl = Open "/dev/pts/<FONT color=#B22222>n</font>" For Input
 
 
  printf("Prova funzione 'printf'")
 
 
  Input #fl, s
 
 
'''End'''
 
oppure leggendo il ''file-descriptor'' corrispondente allo "stdout":
 
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
   Dim fl As File
+
   Dim testo As String
  Dim s As String
 
 
 
   
 
   
<FONT color=gray>' ''Apriamo il "file-descriptor" corrispondente allo "stdout":''</font>
+
   testo = "Testo qualsiasi"
   fl = Open "/proc/self/fd/1" For Input
 
 
   
 
   
   printf("Prova funzione 'printf'")
+
<FONT Color=gray>' ''Con variabile di tipo stringa contenente il testo:''</font>
 +
   printf("%s\n", testo)
 
   
 
   
   Input #fl, s
+
<FONT Color=gray>' ''Con testo direttamente espresso:''</font>
 +
   printf("%s\n", "Testo qualsiasi")
 
   
 
   
 
  '''End'''
 
  '''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===
 
===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.
+
La funzione avrà due argomenti: uno relativo alla stringa di formattazione, l'altro relativo al valore numerico o alla variabile contenente detto valore. Tale valore, passato con il secondo argomento della funzione, va dichiarato con il tipo dato di appartenenza (Byte, Short, Integer, etc.).
 
<BR>Per la scrittura del risultato in console (o Terminale) è sufficiente la sola funzione ''printf()''.
 
<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à:
 
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
+
   Private <FONT color=#B22222>Extern printf</font>(__format As String, param As <FONT color=#B22222>Integer</font>) As Integer
  
  
 
Esempio pratico:
 
Esempio pratico:
 +
<FONT Color=gray>' ''int printf (const char *__restrict __format, ...)''
 +
' ''Write formatted output to stdout.''</font>
 +
Private Extern printf(__format As String, param As Integer) As Integer In "libc:6"
 +
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
  printf("%d\n", 4444 + 5555)
+
  printf("%d\n", 4444 + 5555)
 
   
 
   
 
  '''End'''
 
  '''End'''
  
 
Se si vuole utilizzare la formattazione esadecimale:
 
Se si vuole utilizzare la formattazione esadecimale:
 +
<FONT Color=gray>' ''int printf (const char *__restrict __format, ...)''
 +
' ''Write formatted output to stdout.''</font>
 +
Private Extern printf($format As String, numero As Integer) As Integer In "libc:6"
 +
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
   Dim i, n As Integer
+
   Dim i As Integer
 +
 +
  i = 1000000
 +
 
 +
  printf("%04X\n", i)
 +
 +
'''End'''
 +
 
 +
 
 +
In quest'altro esempio viene utilizzato un ''Float'' con scrittura nello standard ''output'' della parte intera e dei soli primi tre decimali:
 +
<FONT Color=gray>' ''int printf (const char *__restrict __format, ...)''
 +
' ''Write formatted output to stdout.''</font>
 +
Private Extern printf(__format As String, param As <FONT color=#B22222>Float</font>) As Integer In "libc:6"
 
   
 
   
  n = 11
+
'''Public''' Sub Main()
 
    
 
    
   printf("%02X\n", n)
+
   printf("%.3lf\n", 11 / 2)
 +
 +
'''End'''
 +
 
 +
 
 +
 
 +
==Formattazione con campo riservato di caratteri==
 +
Ponendo un numero prima del simbolo della formattazione, il valore verrà stampato in Terminale/console ad n caratteri dalla prima posizione disponibile a sinistra, occupando così n posizioni vuote alla sua sinistra.
 +
<BR>Ponendo un segno meno dinnanzi a detto numero, il valore verrà stampato ad n caratteri dalla prima posizione disponibile a destra, occupando così n posizioni vuote alla sua destra.
 +
 
 +
 
 +
Mostriamo un esempio:
 +
<FONT Color=gray>' ''int printf (const char *__restrict __format, ...)''
 +
' ''Write formatted output to stdout.''</font>
 +
Private Extern printf(__format As String, testo As String, duepunti As String, num1 As Integer, num2 As Integer, num3 As Integer) As Integer In "libc:6"
 +
 
   
 
   
 +
'''Public''' Sub Main()
 +
 
 +
  printf("%-8s%1s%6d%7d%7d\n", "Primo", ":", 1000, 10, 1)
 +
  printf("%-8s%1s%6d%7d%7d\n", "Secondo", ":", 20, 2000, 200)
 +
  printf("%-8s%1s%6d%7d%7d", "Terzo", ":", 300, 3, 30)
 +
 
 
  '''End'''
 
  '''End'''

Versione attuale delle 11:05, 15 ago 2019

La funzione della libreria di C

int printf (const char *__restrict __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 vanno inoltre considerati due sottocasi:

1) senza uso del parametro di formattazione. 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(__format As String) As Integer


Un esempio pratico:

' int printf (const char *__restrict __format, ...)
' Write formatted output to stdout.
Private Extern printf(__format As String) As Integer In "libc:6"


Public Sub Main()

 Dim testo As String

  testo = "Testo qualsiasi"

  printf(testo)
  
  printf("\nTesto qualsiasi")

End


2) uso del parametro di formattazione. 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, potrà essere:

Private Extern printf(__format as string, param As String) As Integer


Un esempio pratico:

' int printf (const char *__restrict __format, ...)
' Write formatted output to stdout.
Private Extern printf(__format As String, param As String) As Integer In "libc:6"


Public Sub Main()

 Dim testo As String

  testo = "Testo qualsiasi"

' Con variabile di tipo stringa contenente il testo:
  printf("%s\n", testo)

' Con testo direttamente espresso:
  printf("%s\n", "Testo qualsiasi")

End


Uso di printf() con valori numerici

La funzione avrà due argomenti: uno relativo alla stringa di formattazione, l'altro relativo al valore numerico o alla variabile contenente detto valore. Tale valore, passato con il secondo argomento della funzione, va dichiarato con il tipo dato di appartenenza (Byte, Short, Integer, etc.).
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(__format As String, param As Integer) As Integer


Esempio pratico:

' int printf (const char *__restrict __format, ...)
' Write formatted output to stdout.
Private Extern printf(__format As String, param As Integer) As Integer In "libc:6"

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

End

Se si vuole utilizzare la formattazione esadecimale:

' int printf (const char *__restrict __format, ...)
' Write formatted output to stdout.
Private Extern printf($format As String, numero As Integer) As Integer In "libc:6"

Public Sub Main()

 Dim i As Integer

  i = 1000000
 
  printf("%04X\n", i)

End


In quest'altro esempio viene utilizzato un Float con scrittura nello standard output della parte intera e dei soli primi tre decimali:

' int printf (const char *__restrict __format, ...)
' Write formatted output to stdout.
Private Extern printf(__format As String, param As Float) As Integer In "libc:6"

Public Sub Main()
 
  printf("%.3lf\n", 11 / 2)

End


Formattazione con campo riservato di caratteri

Ponendo un numero prima del simbolo della formattazione, il valore verrà stampato in Terminale/console ad n caratteri dalla prima posizione disponibile a sinistra, occupando così n posizioni vuote alla sua sinistra.
Ponendo un segno meno dinnanzi a detto numero, il valore verrà stampato ad n caratteri dalla prima posizione disponibile a destra, occupando così n posizioni vuote alla sua destra.


Mostriamo un esempio:

' int printf (const char *__restrict __format, ...)
' Write formatted output to stdout.
Private Extern printf(__format As String, testo As String, duepunti As String, num1 As Integer, num2 As Integer, num3 As Integer) As Integer In "libc:6"


Public Sub Main()
 
 printf("%-8s%1s%6d%7d%7d\n", "Primo", ":", 1000, 10, 1)
 printf("%-8s%1s%6d%7d%7d\n", "Secondo", ":", 20, 2000, 200)
 printf("%-8s%1s%6d%7d%7d", "Terzo", ":", 300, 3, 30)
 
End