Differenze tra le versioni di "Sprintf ()"
Riga 88: | Riga 88: | ||
Print s | Print s | ||
+ | '''End''' | ||
+ | |||
+ | |||
+ | In questo esempio, invece, si utilizzerà la funzione esterna ''sprintf( )'' unitamente alle 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\x00" | ||
+ | |||
+ | <FONT Color=gray>' ''Viene allocata mediante la funzione esterna "malloc()" un'area di memoria pari a 4 byte:''</font> | ||
+ | p1 = malloc(4) | ||
+ | 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, 8 * SizeOf(gb.Byte)) | ||
+ | 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> | ||
+ | p2 = p2 + 4 | ||
+ | sprintf(p2, "%s", s2) | ||
+ | |||
+ | <FONT Color=gray>' ''Andiamo a vedere i valori memorizzati nella memoria allocata, sia i precedenti che quelli or ora aggiunti:''</font> | ||
+ | p2 = p2 - 4 | ||
+ | Print String@(p2) | ||
+ | |||
+ | <FONT Color=gray>' ''Liberiamo la memoria complesivamente allocata:''</font> | ||
+ | free_C(p2) | ||
+ | |||
'''End''' | '''End''' | ||
Versione delle 08:00, 9 gen 2017
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.Float), 4) 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, invece, si utilizzerà la funzione esterna sprintf( ) unitamente alle 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\x00" ' Viene allocata mediante la funzione esterna "malloc()" un'area di memoria pari a 4 byte: p1 = malloc(4) 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, 8 * SizeOf(gb.Byte)) 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": p2 = p2 + 4 sprintf(p2, "%s", s2) ' Andiamo a vedere i valori memorizzati nella memoria allocata, sia i precedenti che quelli or ora aggiunti: p2 = p2 - 4 Print String@(p2) ' Liberiamo la memoria complesivamente allocata: free_C(p2) End