Differenze tra le versioni di "Realloc ()"

Da Gambas-it.org - Wikipedia.
(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...")
 
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
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 a ''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''.
  
  
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()''" è <SPAN style="text-decoration:underline">omonima</span> alla funzione di Gambas "''Realloc()''", bisognerà assegnarle un nome a piacere, ma si dovrà anche richiamare il suo vero nome con il comando ''Exec''.
+
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()" è <SPAN style="text-decoration:underline">omonima</span> alla funzione di Gambas "Realloc()", bisognerà assegnarle un nome a piacere, ma si dovrà anche richiamare il suo vero nome con il comando ''Exec''.
 
<BR>Dunque avremo ad esempio:
 
<BR>Dunque avremo ad esempio:
 
  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 solo per attribuire una nuova dimensione ad una area di memoria precedentemente dimensionata 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 27: Riga 25:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim p1, p2 As Pointer
 
   Dim p1, p2 As Pointer
Riga 33: Riga 31:
 
    
 
    
 
  <FONT color=Gray>' ''Viene allocata mediante la funzione esterna "malloc()" un'area di memoria pari a 4 byte:''</font>
 
  <FONT color=Gray>' ''Viene allocata mediante la funzione esterna "malloc()" un'area di memoria pari a 4 byte:''</font>
  p1 = malloc(4)
+
  p1 = malloc(4)
  If p1 = 0 Then Error.Raise("Impossibile allocare memoria !")
+
  If p1 == 0 Then Error.Raise("Impossibile allocare memoria !")
 
      
 
      
 
  <FONT color=Gray>' ''Nell'area di memoria allocata vengono scritti alcuni valori:''</font>
 
  <FONT color=Gray>' ''Nell'area di memoria allocata vengono scritti alcuni valori:''</font>
  st = Memory p1 For Write
+
  st = Memory p1 For Write
  Write #st, 11 As Byte
+
  Write #st, 11 As Byte
  Write #st, 22 As Byte
+
  Write #st, 22 As Byte
  Write #st, 33 As Byte
+
  Write #st, 33 As Byte
  Write #st, 44 As Byte
+
  Write #st, 44 As Byte
  st.Close
+
  st.Close
 
      
 
      
 
  <FONT color=Gray>' ''Dereferenziamo il "Puntatore" alla'area di memoria allocata, per vedere i valori or ora memorizzati:''</font>
 
  <FONT color=Gray>' ''Dereferenziamo il "Puntatore" alla'area di memoria allocata, per vedere i valori or ora memorizzati:''</font>
  Print Byte@(p1)
+
  Print Byte@(p1)
  Print Byte@(p1 + 1)
+
  Print Byte@(p1 + 1)
  Print Byte@(p1 + 2)
+
  Print Byte@(p1 + 2)
  Print Byte@(p1 + 3)
+
  Print Byte@(p1 + 3)
 
+
   
   
 
 
  <FONT color=Gray>' ''Utilizziamo, dunque, la funzione esterna "realloc()" per ridefinire la quantità di memoria riservata:''</font>
 
  <FONT color=Gray>' ''Utilizziamo, dunque, la funzione esterna "realloc()" per ridefinire la quantità di memoria riservata:''</font>
  p2 = <FONT color=#B22222>realloc_C(p1, 8 * SizeOf(gb.Byte))</font>
+
  p2 = <FONT color=#B22222>realloc_C(p1, 8 * SizeOf(gb.Byte))</font>
  If p2 = 0 Then Error.Raise("Impossibile riallocare la memoria già allocata !")
+
  If p2 == 0 Then Error.Raise("Impossibile riallocare la memoria già allocata !")
 
    
 
    
 
  <FONT color=Gray>' ''Scriviamo alcuni valori nei byte aggiunti alla memoria allocata:''</font>
 
  <FONT color=Gray>' ''Scriviamo alcuni valori nei byte aggiunti alla memoria allocata:''</font>
  st = Memory p2 For Write
+
  st = Memory p2 For Write
  Seek #st, 4
+
  Seek #st, 4
  Write #st, 55 As Byte
+
  Write #st, 55 As Byte
  Write #st, 66 As Byte
+
  Write #st, 66 As Byte
  Write #st, 77 As Byte
+
  Write #st, 77 As Byte
  Write #st, 88 As Byte
+
  Write #st, 88 As Byte
  st.Close
+
  st.Close
 
   
 
   
 
  <FONT color=Gray>' ''Andiamo a vedere i valori or ora memorizzati nei byte di memoria allocata aggiunti:''</font>
 
  <FONT color=Gray>' ''Andiamo a vedere i valori or ora memorizzati nei byte di memoria allocata aggiunti:''</font>
  Print Byte@(p2 + 4)
+
  Print Byte@(p2 + 4)
  Print Byte@(p2 + 5)
+
  Print Byte@(p2 + 5)
  Print Byte@(p2 + 6)
+
  Print Byte@(p2 + 6)
  Print Byte@(p2 + 7)
+
  Print Byte@(p2 + 7)
 
    
 
    
 
  <FONT color=Gray>' ''Liberiamo la memoria complesivamente allocata. Dovremo utilizzare la funzione esterna "free()" !''</font>
 
  <FONT color=Gray>' ''Liberiamo la memoria complesivamente allocata. Dovremo utilizzare la funzione esterna "free()" !''</font>
   free_C(p2)
+
  free_C(p2)
 +
    
 +
End
 +
In quest'altro esempio di allocazione dinamica di un'area di meoria si utilizzeranno le seguenti funzioni esterne:
 +
<BR>- ''malloc( )'', per allocare inizialmente un'area di memoria;
 +
<BR>- ''memset( )'', per scrivere un dato all'interno della memoria allocata;
 +
<BR>- ''realloc( )'', per allocare una nuova quantità dell'area memoria precedentemente riservata;
 +
<BR>- ''free( )'', per liberare la memoria allocata.
 +
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 * 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.''</font>
 +
Private Extern memset(dest As Pointer, c As Integer, count 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>' ''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 p As Pointer
 +
  Dim all, i As Integer
 +
 
 +
  all = 1
 +
 
 +
<FONT Color=gray>' ''Effettua una prima allocazione dell'area di memoria necessaria:''</font>
 +
  p = malloc(all * SizeOf(gb.Byte))
 +
  If p == 0 Then Error.Raise("Impossibile allocare un'area di memoria !")
 +
 
 +
  While i < 20
 +
<FONT Color=gray>' ''Scrive un dato nell'area di memoria riservata:''</font>
 +
    memset(p + i, i * 10, 1)  <SUP>&#91;[[#Note|Nota 1]]&#93;</sup>
 +
    Inc all
 +
<FONT Color=gray>' ''Alloca una nuova quantità di memoria:''</font>
 +
    p = realloc_C(p, all)
 +
    If p == 0 Then Error.Raise("Impossibile riallocare l'area di memoria !")
 +
    Inc i
 +
  Wend
 
    
 
    
  '''End'''
+
  <FONT Color=gray>' ''Verifica il risultato:''</font>
 +
  For i = 0 To 19
 +
    Print Byte@(p + i)
 +
  Next
 +
 
 +
<FONT Color=gray>' ''Liberia la memoria allocata:''</font>
 +
  free_C(p)
 +
<FONT Color=gray>' ''Si assicura che il Puntatore non punti più ad alcun indirizzo rilevante di memoria:''</font>
 +
  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);
 +
 
 +
 
 +
 
 +
=Riferimenti=
 +
* https://linux.die.net/man/3/realloc

Versione attuale delle 13:57, 13 giu 2024

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 alcun indirizzo rilevante 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);


Riferimenti