Realloc ()
La funzione della libreria di C
void *realloc (void *__ptr, size_t __size)
ridimensiona il blocco di memoria precedentemente dimensionato con una chiamata a 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 solo per attribuire una nuova dimensione ad una area di memoria precedentemente dimensionata 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