Realloc (): differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 1: | Riga 1: | ||
La funzione della libreria di C | La funzione della libreria di C | ||
void *realloc (void *__ptr, size_t __size) | void *realloc (void *__ptr, size_t __size) | ||
ridimensiona il blocco di memoria precedentemente dimensionato con una chiamata alle funzioni di C ''malloc()'' o a ''calloc()'' e puntato dal Puntatore ''ptr''. | ridimensiona, incrementando o riducendo, il blocco di memoria precedentemente dimensionato con una chiamata alle funzioni di C ''malloc()'' o a ''calloc()'' e puntato dal Puntatore ''ptr''. | ||
| Riga 8: | Riga 8: | ||
Private <FONT color=#B22222>Extern realloc_C</font>(__ptr As Pointer, __size As Long) As Pointer In "<FONT color=#B22222>libc:6</font>" <FONT color=#B22222>'''Exec "realloc"'''</font> | Private <FONT color=#B22222>Extern realloc_C</font>(__ptr As Pointer, __size As Long) As Pointer In "<FONT color=#B22222>libc:6</font>" <FONT color=#B22222>'''Exec "realloc"'''</font> | ||
La funzione ''realloc()'' va utilizzata in Gambas per attribuire una nuova dimensione ad una area di memoria precedentemente dimensionata soltanto con le funzioni esterni ''malloc()'' o ''calloc()'', e <SPAN style="text-decoration:underline">non</span> dalla funzione di Gambas ''Alloc()''. | La funzione ''realloc()'' va utilizzata in Gambas per attribuire una nuova dimensione ad una area di memoria precedentemente dimensionata soltanto con le funzioni esterni ''malloc()'' o ''calloc()'', e <SPAN style="text-decoration:underline">non</span> dalla funzione di Gambas ''Alloc()''. | ||
Semplice esempio di uso in Gambas: | Semplice esempio di uso in Gambas: | ||
| Riga 132: | Riga 130: | ||
'''End''' | '''End''' | ||
| Riga 139: | Riga 136: | ||
[1] Per scrivere i dati nell'area di memoria allocata, è possibile utilizzare anche la funzione esterna ''sprintf( )'' in sostituzione di ''memset( )'', come segue: | [1] Per scrivere i dati nell'area di memoria allocata, è possibile utilizzare anche la funzione esterna ''sprintf( )'' in sostituzione di ''memset( )'', come segue: | ||
sprintf(p + i, "%c", i * 10); | sprintf(p + i, "%c", i * 10); | ||
Versione delle 05:45, 22 ott 2022
La funzione della libreria di C
void *realloc (void *__ptr, size_t __size)
ridimensiona, incrementando o riducendo, il blocco di memoria precedentemente dimensionato con una chiamata alle funzioni di C malloc() o a calloc() e puntato dal Puntatore ptr.
Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta. Da sottolineare che, poiché questa funzione esterna di C "realloc()" è omonima alla funzione di Gambas "Realloc()", bisognerà assegnarle un nome a piacere, ma si dovrà anche richiamare il suo vero nome con il comando Exec.
Dunque avremo ad esempio:
Private Extern realloc_C(__ptr As Pointer, __size As Long) As Pointer In "libc:6" Exec "realloc"
La funzione realloc() va utilizzata in Gambas per attribuire una nuova dimensione ad una area di memoria precedentemente dimensionata soltanto con le funzioni esterni malloc() o calloc(), e non dalla funzione di Gambas Alloc().
Semplice esempio di uso in Gambas:
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"
' 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 st As Stream
' 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 alcuni valori:
st = Memory p1 For Write
Write #st, 11 As Byte
Write #st, 22 As Byte
Write #st, 33 As Byte
Write #st, 44 As Byte
st.Close
' Dereferenziamo il "Puntatore" alla'area di memoria allocata, per vedere i valori or ora memorizzati:
Print Byte@(p1)
Print Byte@(p1 + 1)
Print Byte@(p1 + 2)
Print Byte@(p1 + 3)
' 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 alcuni valori nei byte aggiunti alla memoria allocata:
st = Memory p2 For Write
Seek #st, 4
Write #st, 55 As Byte
Write #st, 66 As Byte
Write #st, 77 As Byte
Write #st, 88 As Byte
st.Close
' Andiamo a vedere i valori or ora memorizzati nei byte di memoria allocata aggiunti:
Print Byte@(p2 + 4)
Print Byte@(p2 + 5)
Print Byte@(p2 + 6)
Print Byte@(p2 + 7)
' Liberiamo la memoria complesivamente allocata. Dovremo utilizzare la funzione esterna "free()" !
free_C(p2)
End
In quest'altro esempio di allocazione dinamica di un'area di meoria si utilizzeranno le seguenti funzioni esterne:
- malloc( ), per allocare inizialmente un'area di memoria;
- memset( ), per scrivere un dato all'interno della memoria allocata;
- realloc( ), per allocare una nuova quantità dell'area memoria precedentemente riservata;
- free( ), per liberare la memoria allocata.
Library "libc:6"
' void *malloc (size_t __size)
' Allocate SIZE bytes of memory.
Private Extern malloc(__size As Long) As Pointer
' void * memset(void *buffer, int c, size_t count)
' Copies the character c (an unsigned char) to the first count characters of the string pointed to, by the argument buffer.
Private Extern memset(dest As Pointer, c As Integer, count 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"
' 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 p As Pointer
Dim all, i As Integer
all = 1
' Effettua una prima allocazione dell'area di memoria necessaria:
p = malloc(all * SizeOf(gb.Byte))
If p = 0 Then Error.Raise("Impossibile allocare un'area di memoria !")
While i < 20
' Scrive un dato nell'area di memoria riservata:
memset(p + i, i * 10, 1) [Nota 1]
Inc all
' Alloca una nuova quantità di memoria:
p = realloc_C(p, all)
If p = 0 Then Error.Raise("Impossibile riallocare l'area di memoria !")
Inc i
Wend
' Verifica il risultato:
For i = 0 To 19
Print Byte@(p + i)
Next
' Liberia la memoria allocata:
free_C(p)
' Si assicura che il Puntatore non punti più ad alcuna cella di memoria:
p = 0
End
Note
[1] Per scrivere i dati nell'area di memoria allocata, è possibile utilizzare anche la funzione esterna sprintf( ) in sostituzione di memset( ), come segue:
sprintf(p + i, "%c", i * 10);