Differenze tra le versioni di "Realloc ()"
(5 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 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''. |
− | 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 " | + | 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 | + | 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() | |
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) | |
− | + | 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 | |
− | + | Write #st, 11 As Byte | |
− | + | Write #st, 22 As Byte | |
− | + | Write #st, 33 As Byte | |
− | + | Write #st, 44 As Byte | |
− | + | 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 + 1) | |
− | + | Print Byte@(p1 + 2) | |
− | + | 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> | |
− | + | 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 | |
− | + | 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 | |
<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 + 5) | |
− | + | Print Byte@(p2 + 6) | |
− | + | 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( | + | 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>[[[#Note|Nota 1]]]</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 | ||
− | ''' | + | <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);