Realloc ()

Da Gambas-it.org - Wikipedia.
Versione del 10 mar 2016 alle 10:09 di Vuott (Discussione | contributi) (Creata pagina con "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...")

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

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