Differenze tra le versioni di "Sprintf ()"

Da Gambas-it.org - Wikipedia.
 
(9 versioni intermedie di uno stesso utente non sono mostrate)
Riga 2: Riga 2:
 
  int sprintf (char *__restrict __s, const char *__restrict __format, ...)
 
  int sprintf (char *__restrict __s, const char *__restrict __format, ...)
 
scrive nel Puntatore "''__s''" gli argomenti passati formattati.
 
scrive nel Puntatore "''__s''" gli argomenti passati formattati.
 
+
<BR>Questa funzione viene solitamente utilizzata in C per convertire agevolmente un valore di tipo numerico in una Stringa.
Questa funzione viene solitamente utilizzata in C per convertire agevolmente un valore di tipo numerico in una Stringa.
 
  
  
 
Volendo utilizzare tale funzione in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale essa è contenuta:
 
Volendo utilizzare tale funzione in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale essa è contenuta:
 
  Private <FONT color=#B22222>Extern sprintf</font>(__s As Pointer, __format As String, valore As ...) As Integer
 
  Private <FONT color=#B22222>Extern sprintf</font>(__s As Pointer, __format As String, valore As ...) As Integer
 
 
 
Mostriamo un semplice esempio, nel quale viene convertito in stringa un valore di tipo ''Float''.
 
Mostriamo un semplice esempio, nel quale viene convertito in stringa un valore di tipo ''Float''.
 
  Library "libc:6"
 
  Library "libc:6"
Riga 18: Riga 15:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim p As Pointer
 
   Dim p As Pointer
Riga 24: Riga 21:
 
    
 
    
 
  <FONT Color=gray>' ''Allochiamo un'area di memoria adeguata a contenere la stringa finale:''</font>
 
  <FONT Color=gray>' ''Allochiamo un'area di memoria adeguata a contenere la stringa finale:''</font>
  p = Alloc(SizeOf(gb.Float), 4)
+
  p = Alloc(SizeOf(gb.Byte), 12)
 
    
 
    
  <FONT color=#B22222>sprintf</font>(p, "%f", 123.456789)
+
  <FONT color=#B22222>sprintf</font>(p, "%f", 123.456789)
 
      
 
      
  s = String@(p)
+
  s = String@(p)
 
    
 
    
  Print s
+
  Print s
 
      
 
      
 
  <FONT Color=gray>' ''Liberiamo la memoria precedentemente allocata:''</font>
 
  <FONT Color=gray>' ''Liberiamo la memoria precedentemente allocata:''</font>
  Free(p)
+
  Free(p)
 
    
 
    
  '''End'''
+
  End
 
 
 
 
 
Mostriamo un altro semplice esempio, nel quale viene convertito in stringa un valore di tipo ''Intero''.
 
Mostriamo un altro semplice esempio, nel quale viene convertito in stringa un valore di tipo ''Intero''.
 
  Library "libc:6"
 
  Library "libc:6"
Riga 46: Riga 41:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim p As Pointer
 
   Dim p As Pointer
Riga 52: Riga 47:
 
    
 
    
 
  <FONT Color=gray>' ''Allochiamo un'area di memoria adeguata a contenere la stringa finale:''</font>
 
  <FONT Color=gray>' ''Allochiamo un'area di memoria adeguata a contenere la stringa finale:''</font>
  p = Alloc(SizeOf(gb.Integer), 4)
+
  p = Alloc(SizeOf(gb.Integer), 4)
 
    
 
    
  <FONT color=#B22222>sprintf</font>(p, "%d", 123456789)
+
  <FONT color=#B22222>sprintf</font>(p, "%d", 123456789)
 
      
 
      
  s = String@(p)
+
  s = String@(p)
 
    
 
    
  Print s
+
  Print s
 
      
 
      
 
  <FONT Color=gray>' ''Liberiamo la memoria precedentemente allocata:''</font>
 
  <FONT Color=gray>' ''Liberiamo la memoria precedentemente allocata:''</font>
  Free(p)
+
  Free(p)
 
    
 
    
  '''End'''
+
  End
 
 
 
 
 
In quest'altro più breve esempio viene utilizzata una variabile vettoriale di tipo ''Byte[ ]'':
 
In quest'altro più breve esempio viene utilizzata una variabile vettoriale di tipo ''Byte[ ]'':
 
  Library "libc:6"
 
  Library "libc:6"
Riga 74: Riga 67:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim bb As New Byte[32]
 
   Dim bb As New Byte[32]
 
   Dim s As String
 
   Dim s As String
 
    
 
    
  <FONT color=#B22222>sprintf</font>(bb, "%f", 12345.6789)
+
  <FONT color=#B22222>sprintf</font>(bb, "%f", 12345.6789)
 
        
 
        
  <FONT Color=gray>' ''Optiamo per la dereferenziazione del Puntatore ai dati dell'array,''
+
  <FONT Color=gray>' ''Optiamo per la dereferenziazione del Puntatore ai dati dell'array, poiché in tal modo non saranno stampati anche gli eventuali byte aventi valore &h00, dati dalla dimensione del vettore eventualmente superiore alla quantità di caratteri:''</font>
' ''poiché in tal modo non saranno stampati anche gli eventuali byte aventi valore &h00,''
+
  s = String@(bb.Data)
' ''dati dalla dimensione del vettore eventualmente superiore alla quantità di caratteri:''</font>
 
  s = String@(bb.Data)
 
 
    
 
    
  Print s
+
  Print s
 
          
 
          
  '''End'''
+
  End
 
+
In questo esempio si utilizzerà la funzione esterna "sprintf()" con la funzione esterna "malloc()" per convertire un valore numerico in una stringa di corrispondenti caratteri ASCII. Il risultato sarà poi mostrato con la funzione esterna "printf()".
 +
Library "libc:6"
 +
 +
<FONT Color=gray>' ''void *malloc (size_t __size)''
 +
' ''Allocate SIZE bytes of memory.''</font>
 +
Private Extern malloc(__size As Long) As Pointer
 +
 +
<FONT Color=gray>' ''int sprintf (char *__restrict __s, const char *__restrict __format, ...)''
 +
' ''Write formatted output to S.''</font>
 +
Private Extern sprintf(__s As Pointer, __format As String, i As Integer) As Integer
 +
 +
<FONT Color=gray>' ''int printf (const char *__restrict __format, ...)''
 +
' ''Write formatted output to stdout.''</font>
 +
Private Extern printf(__format As String, __s As Pointer) As Integer
 +
 +
<FONT Color=gray>' ''void free (void *__ptr)''
 +
' ''Free a block allocated by `malloc', `realloc' or `calloc'.''</font>
 +
Private Extern free_C(__ptr As Pointer) Exec "free"
 +
 +
 +
Public Sub Main()
 +
 +
  Dim c As Pointer
 +
 
 +
<FONT Color=gray>' ''Viene allocata mediante la funzione esterna "malloc()" un'area di memoria pari a 16 byte:''</font>
 +
  c = malloc(SizeOf(gb.Byte) * 16)
 +
  If c == 0 Then Error.Raise("Impossibile allocare memoria !")
 +
 
 +
<FONT Color=gray>' ''Scriviamo con la funzione esterna "sprintf()" il valore numerico nel Puntatore come stringa di singoli caratteri numerici ASCII:''</font>
 +
  sprintf(c, "%d", 12345678)
 +
 
 +
<FONT Color=gray>' ''Andiamo a vedere il risultato:''</font>
 +
  printf("%s\n", c)
 +
 
 +
<FONT Color=gray>' ''Liberiamo la memoria complessivamente allocata:''</font>
 +
  free_C(c)
 +
 
 +
<FONT Color=gray>' ''Facciamo in modo che per sicurezza il Puntatore punti all'indirizzo zero::''</font>
 +
  c = 0
 +
 
 +
End
 +
Qui invece si utilizzerà la funzione esterna "sprintf()" con le funzioni esterne "malloc()" e "realloc()" per unire due stringhe di caratteri:
 +
Library "libc:6"
 +
 +
<FONT Color=gray>' ''void *malloc (size_t __size)''
 +
' ''Allocate SIZE bytes of memory.''</font>
 +
Private Extern malloc(__size As Long) As Pointer
 +
 +
<FONT Color=gray>' ''void *realloc (void *__ptr, size_t __size)''
 +
' ''Re-allocate the previously allocated block in PTR, making the new block SIZE bytes long.''</font>
 +
Private Extern realloc_C(__ptr As Pointer, __size As Long) As Pointer Exec "realloc"
 +
 +
<FONT Color=gray>' ''int sprintf (char *__restrict __s, const char *__restrict __format, ...)''
 +
' Write formatted output to S.''</font>
 +
Private Extern sprintf(__s As Pointer, __format As String, s As String) As Integer
 +
 +
<FONT Color=gray>' ''void free (void *__ptr)''
 +
' ''Free a block allocated by `malloc', `realloc' or `calloc'.''</font>
 +
Private Extern free_C(__ptr As Pointer) Exec "free"
 +
 +
 +
Public Sub Main()
 +
 +
  Dim p1, p2 As Pointer
 +
  Dim s1, s2 As String
 +
  Dim st As Stream
 +
 
 +
  s1 = "abcd"
 +
  s2 = "efg"
 +
 +
<FONT Color=gray>' ''Viene allocata mediante la funzione esterna "malloc()" un'area di memoria pari a 5 byte (4 per i caratteri alfabetici + 1 per il valore &h00 di fine stringa):''</font>
 +
  p1 = malloc(SizeOf(gb.Byte) * 5)
 +
  If p1 == 0 Then Error.Raise("Impossibile allocare memoria !")
 +
 
 +
<FONT Color=gray>' ''Nell'area di memoria allocata vengono scritti i caratteri contenuti nella variabile stringa "s1":''</font>
 +
  st = Memory p1 For Write
 +
  Write #st, s1
 +
  st.Close
 +
  Print String@(p1)
 +
 
 +
<FONT Color=gray>' ''Utilizziamo, dunque, la funzione esterna "realloc()" per ridefinire la quantità di memoria riservata:''</font>
 +
  p2 = realloc_C(p1, SizeOf(gb.Byte) * 8)
 +
  If p2 == 0 Then Error.Raise("Impossibile riallocare la memoria già allocata !")
 +
 
 +
<FONT Color=gray>' ''Scriviamo questa volta con la funzione esterna "sprintf()" altri valori.''
 +
' ''In particolare, ai valori già scritti, vengono aggiunti quelli della variabile stringa "s2":''</font>
 +
  sprintf(p2 + 4, "%s", s2)
 +
 
 +
<FONT Color=gray>' ''Andiamo a vedere i valori memorizzati nella memoria allocata, sia i precedenti che quelli or ora aggiunti:''</font>
 +
  Print String@(p2)
 +
 
 +
<FONT Color=gray>' ''Liberiamo la memoria complesivamente allocata:''</font>
 +
  free_C(p2)
 +
<FONT Color=gray>' ''Facciamo in modo che per sicurezza il Puntatore punti all'indirizzo zero::''</font>
 +
  p2 = 0
 +
 +
End
  
  

Versione attuale delle 15:45, 16 giu 2024

La funzione

int sprintf (char *__restrict __s, const char *__restrict __format, ...)

scrive nel Puntatore "__s" gli argomenti passati formattati.
Questa funzione viene solitamente utilizzata in C per convertire agevolmente un valore di tipo numerico in una Stringa.


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

Private Extern sprintf(__s As Pointer, __format As String, valore As ...) As Integer

Mostriamo un semplice esempio, nel quale viene convertito in stringa un valore di tipo Float.

Library "libc:6"

' int sprintf (char *__restrict __s, const char *__restrict __format, ...)
' Write formatted output to S.
Private Extern sprintf(__s As Pointer, __format As String, f As Float) As Integer


Public Sub Main()
 
 Dim p As Pointer
 Dim s As String
 
' Allochiamo un'area di memoria adeguata a contenere la stringa finale:
 p = Alloc(SizeOf(gb.Byte), 12)
 
 sprintf(p, "%f", 123.456789)
   
 s = String@(p)
  
 Print s
   
' Liberiamo la memoria precedentemente allocata:
 Free(p)
  
End

Mostriamo un altro semplice esempio, nel quale viene convertito in stringa un valore di tipo Intero.

Library "libc:6"

' int sprintf (char *__restrict __s, const char *__restrict __format, ...)
' Write formatted output to S.
Private Extern sprintf(__s As Pointer, __format As String, i As Integer) As Integer


Public Sub Main()
 
 Dim p As Pointer
 Dim s As String
 
' Allochiamo un'area di memoria adeguata a contenere la stringa finale:
 p = Alloc(SizeOf(gb.Integer), 4)
 
 sprintf(p, "%d", 123456789)
   
 s = String@(p)
  
 Print s
   
' Liberiamo la memoria precedentemente allocata:
 Free(p)
  
End

In quest'altro più breve esempio viene utilizzata una variabile vettoriale di tipo Byte[ ]:

Library "libc:6"

' int sprintf (char *__restrict __s, const char *__restrict __format, ...)
' Write formatted output to S.
Private Extern sprintf(__s As Byte[], __format As String, f As Float) As Integer


Public Sub Main()
 
 Dim bb As New Byte[32]
 Dim s As String
 
 sprintf(bb, "%f", 12345.6789)
      
' Optiamo per la dereferenziazione del Puntatore ai dati dell'array, poiché in tal modo non saranno stampati anche gli eventuali byte aventi valore &h00, dati dalla dimensione del vettore eventualmente superiore alla quantità di caratteri:
 s = String@(bb.Data)
  
 Print s
       
End

In questo esempio si utilizzerà la funzione esterna "sprintf()" con la funzione esterna "malloc()" per convertire un valore numerico in una stringa di corrispondenti caratteri ASCII. Il risultato sarà poi mostrato con la funzione esterna "printf()".

Library "libc:6"

' void *malloc (size_t __size)
' Allocate SIZE bytes of memory.
Private Extern malloc(__size As Long) As Pointer

' int sprintf (char *__restrict __s, const char *__restrict __format, ...)
' Write formatted output to S.
Private Extern sprintf(__s As Pointer, __format As String, i As Integer) As Integer

' int printf (const char *__restrict __format, ...)
' Write formatted output to stdout.
Private Extern printf(__format As String, __s As Pointer) As Integer

' void free (void *__ptr)
' Free a block allocated by `malloc', `realloc' or `calloc'.
Private Extern free_C(__ptr As Pointer) Exec "free"


Public Sub Main()

 Dim c As Pointer
 
' Viene allocata mediante la funzione esterna "malloc()" un'area di memoria pari a 16 byte:
 c = malloc(SizeOf(gb.Byte) * 16)
 If c == 0 Then Error.Raise("Impossibile allocare memoria !")
  
' Scriviamo con la funzione esterna "sprintf()" il valore numerico nel Puntatore come stringa di singoli caratteri numerici ASCII:
 sprintf(c, "%d", 12345678)
 
' Andiamo a vedere il risultato:
 printf("%s\n", c)
  
' Liberiamo la memoria complessivamente allocata:
 free_C(c)
  
' Facciamo in modo che per sicurezza il Puntatore punti all'indirizzo zero::
 c = 0
  
End

Qui invece si utilizzerà la funzione esterna "sprintf()" con le funzioni esterne "malloc()" e "realloc()" per unire due stringhe di caratteri:

Library "libc:6"

' void *malloc (size_t __size)
' Allocate SIZE bytes of memory.
Private Extern malloc(__size As Long) As Pointer

' void *realloc (void *__ptr, size_t __size)
' Re-allocate the previously allocated block in PTR, making the new block SIZE bytes long.
Private Extern realloc_C(__ptr As Pointer, __size As Long) As Pointer Exec "realloc"

' int sprintf (char *__restrict __s, const char *__restrict __format, ...)
' Write formatted output to S.
Private Extern sprintf(__s As Pointer, __format As String, s As String) As Integer

' void free (void *__ptr)
' Free a block allocated by `malloc', `realloc' or `calloc'.
Private Extern free_C(__ptr As Pointer) Exec "free"


Public Sub Main()

 Dim p1, p2 As Pointer
 Dim s1, s2 As String
 Dim st As Stream
 
 s1 = "abcd"
 s2 = "efg"

' Viene allocata mediante la funzione esterna "malloc()" un'area di memoria pari a 5 byte (4 per i caratteri alfabetici + 1 per il valore &h00 di fine stringa):
 p1 = malloc(SizeOf(gb.Byte) * 5)
 If p1 == 0 Then Error.Raise("Impossibile allocare memoria !")
  
' Nell'area di memoria allocata vengono scritti i caratteri contenuti nella variabile stringa "s1":
 st = Memory p1 For Write
 Write #st, s1
 st.Close
 Print String@(p1)
  
' Utilizziamo, dunque, la funzione esterna "realloc()" per ridefinire la quantità di memoria riservata:
 p2 = realloc_C(p1, SizeOf(gb.Byte) * 8)
 If p2 == 0 Then Error.Raise("Impossibile riallocare la memoria già allocata !")
  
' Scriviamo questa volta con la funzione esterna "sprintf()" altri valori.
' In particolare, ai valori già scritti, vengono aggiunti quelli della variabile stringa "s2":
 sprintf(p2 + 4, "%s", s2)
 
' Andiamo a vedere i valori memorizzati nella memoria allocata, sia i precedenti che quelli or ora aggiunti:
 Print String@(p2)
  
' Liberiamo la memoria complesivamente allocata:
 free_C(p2)
' Facciamo in modo che per sicurezza il Puntatore punti all'indirizzo zero::
 p2 = 0

End


Riferimenti