Differenze tra le versioni di "Printf ()"

Da Gambas-it.org - Wikipedia.
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. Il valore ritornato va dichiarato come tipo ''Puntatore'' e <SPAN style="text-decoration=underline">non</span> di tipo ''stringa'', altrimenti sarà sollevato un errore "''Segmentation fault (11)''".
 
<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>(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.
+
Un esempio pratico:
<BR>La dichiarazione, dunque, sarà:
+
  Private Extern printf(testo As String) As Pointer
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 Main()
 
  '''Public''' Sub Main()
 
   
 
   
   Dim p As Pointer
+
   Dim testo As String
  Dim s As String
 
 
 
  p = printf("Prova funzione 'printf'")
 
 
   
 
   
<FONT color=gray>' ''Dereferenziamo il Puntatore per ottenere il testo:''</font>
+
  testo = "Testo qualsiasi"
    s = String@(p)
 
 
   
 
   
    Print s
+
  printf(testo)
 +
 
 +
  printf("\nTesto qualsiasi")
 
   
 
   
 
  '''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. Anche in questo caso il valore ritornato va dichiarato come tipo ''Puntatore'' e <SPAN style="text-decoration=underline">non</span> di tipo ''stringa'', altrimenti sarà sollevato un errore "''Segmentation fault (11)''".
   
+
<BR>La dichiarazione, dunque, sarà:
 
+
  Private <FONT color=#B22222>Extern printf</font>(formatt$ as string, var$ As String) As Pointer
  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()
+
  Private Extern printf(formatt$ As String, var$ As String) As Pointer 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
 
 
   
 
   
 +
  testo = "Testo qualsiasi"
 
   
 
   
  <FONT color=gray>' ''Apriamo il "file-descriptor" corrispondente allo "stdout":''</font>
+
  <FONT Color=gray>' ''Con variabile di tipo stringa contenente il testo:''</font>
   fl = Open "/proc/self/fd/1" For Input
+
   printf("%s\n", testo)
 
   
 
   
   printf("Prova funzione 'printf'")
+
<FONT Color=gray>' ''Con testo direttamente espresso:''</font>
+
   printf("%s\n", "Testo qualsiasi")
  Input #fl, s
 
 
   
 
   
 
  '''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'''
 
  
  
Riga 126: Riga 82:
 
    
 
    
 
   printf("%02X\n", n)
 
   printf("%02X\n", n)
 +
 +
'''End'''
 +
 +
 +
Dovendo usare un ''Float'':
 +
Private Extern printf(formatt$ As String, fl As Float) As Float In "libc:6"
 +
 +
'''Public''' Sub Main()
 +
 
 +
  printf("%lf\n", 11 /2)
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 18:52, 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 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. Il valore ritornato va dichiarato come tipo Puntatore e non di tipo stringa, altrimenti sarà sollevato un errore "Segmentation fault (11)".
La dichiarazione, dunque, sarà:

Private Extern printf(testo As String) As Pointer


Un esempio pratico:

Private Extern printf(testo As String) As Pointer


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. Anche in questo caso il valore ritornato va dichiarato come tipo Puntatore e non di tipo stringa, altrimenti sarà sollevato un errore "Segmentation fault (11)".
La dichiarazione, dunque, sarà:

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


Un esempio pratico:

Private Extern printf(formatt$ As String, var$ As String) As Pointer 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

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


Dovendo usare un Float:

Private Extern printf(formatt$ As String, fl As Float) As Float In "libc:6"

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

End