Differenze tra le versioni di "Alloca ()"

Da Gambas-it.org - Wikipedia.
Riga 19: Riga 19:
  
  
Mostriamo di seguito un esempio pratico sull'uso della funzione ''alloca()'', la quale verrà utilizzata per allocare un blocco di memoria, e che sarà puntato da un ''Puntatore'' da passare alla funzione esterna ''scanf()'':
+
Mostriamo di seguito un esempio pratico sull'uso della funzione ''alloca()'', la quale verrà utilizzata per allocare un blocco di memoria, puntato da un ''Puntatore'', nel quale sarà scritto mediante i ''Memory Stream'' un valore numerico di tip/tmp/Alloca"o Intero immesso dalla tastiera.
 +
Library "/tmp/Alloca"
 +
 
  <FONT Color=gray>' ''char * Inizializza_Alloca (size_t dimen)''
 
  <FONT Color=gray>' ''char * Inizializza_Alloca (size_t dimen)''
 
  ' ''Invoca ed utilizza la funzione 'alloca()'.''</font>
 
  ' ''Invoca ed utilizza la funzione 'alloca()'.''</font>
  Private Extern Inizializza_Alloca(dimen As Long) As Pointer In "/tmp/Alloca"
+
  Private Extern Inizializza_Alloca(dimen As Long) As Pointer
+
 
<FONT Color=gray>' ''int scanf (const char *__restrict __format, ...)''
 
' ''Read formatted input from stdin.''</font>
 
Private Extern scanf(format$ As String, argsP As Pointer) As Integer In "libc:6"
 
 
 
   
 
   
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
 
   Dim p As Pointer
 
   Dim p As Pointer
 +
  Dim i As Integer
 +
  Dim st As Stream
 
    
 
    
 
  <FONT Color=gray>' ''Crea la nostra libreria dinamica condivisa per la gestione della funzione 'alloca()':''</font>
 
  <FONT Color=gray>' ''Crea la nostra libreria dinamica condivisa per la gestione della funzione 'alloca()':''</font>
Riga 37: Riga 37:
 
      
 
      
 
  <FONT Color=gray>' ''Invoca la funzione presente nella nostra libreria dinamica condivisa contenente il codice per la gestione della funzione 'alloca()':''</font>
 
  <FONT Color=gray>' ''Invoca la funzione presente nella nostra libreria dinamica condivisa contenente il codice per la gestione della funzione 'alloca()':''</font>
   p = Inizializza_Alloca(512)
+
   p = Inizializza_Alloca(256)
 
   If p = 0 Then Error.Raise("Impossibile allocare memoria con 'alloca()' !")
 
   If p = 0 Then Error.Raise("Impossibile allocare memoria con 'alloca()' !")
 
      
 
      
 
  <FONT Color=gray>' ''Resta in attesa che sia inviato un dato numerico intero immesso dalla tastiera nello spazio sottostante la console o nel Terminale:''</font>
 
  <FONT Color=gray>' ''Resta in attesa che sia inviato un dato numerico intero immesso dalla tastiera nello spazio sottostante la console o nel Terminale:''</font>
   scanf("%d", p)
+
   Input i
 +
  st = Memory p For Write
 +
  Write #st, i As Integer
 +
  st.Close
 
      
 
      
  <FONT Color=gray>' ''Stampa in console o nel Terminale il valore numerico intero inviato mediante la precedente funzione 'scanf()':''</font>
+
  <FONT Color=gray>' ''Stampa in console o nel Terminale il valore numerico intero immesso con la tastiera:''</font>
 
   Print Int@(p)
 
   Print Int@(p)
 
    
 
    

Versione delle 17:34, 17 set 2016

La funzione alloca() dichiarata nel file header alloca.h

void *alloca (size_t __size)

alloca una porzione di memoria che verrà liberata quando si esce dalla funzione di chiamata.


Poiché detta funzione non è contenuta in alcuna libreria dinamica condivisa .so, si potrà fruire delle sue potenzialità richiamandola ed usandola all'interno di una libreria dinamica condivisa .so che dovrà essere da noi creata appositamente. Il suo codice sorgente, scritto nel progetto Gambas, potrà essere il seguente:

"/tmp/Alloca.c", "#include <alloca.h>" &
"\n\n" &
"char * Inizializza_Alloca (size_t dimen) {" &
"\n\n" &
"   char * c;" &
"\n\n" &
"   c = alloca(dimen);" &
"\n\n" &
"   return c;" &
"\n\n}"

Va sottolineato che il valore da passare alla funzione alloca(), relativo alla dimensione dell'area di memoria da allocare, non deve essere inferiore a 256 byte.


Mostriamo di seguito un esempio pratico sull'uso della funzione alloca(), la quale verrà utilizzata per allocare un blocco di memoria, puntato da un Puntatore, nel quale sarà scritto mediante i Memory Stream un valore numerico di tip/tmp/Alloca"o Intero immesso dalla tastiera.

Library "/tmp/Alloca"

' char * Inizializza_Alloca (size_t dimen)
' Invoca ed utilizza la funzione 'alloca()'.
Private Extern Inizializza_Alloca(dimen As Long) As Pointer
 

Public Sub Main()
 
 Dim p As Pointer
 Dim i As Integer
 Dim st As Stream
 
' Crea la nostra libreria dinamica condivisa per la gestione della funzione 'alloca()':
  Creaso()
   
' Invoca la funzione presente nella nostra libreria dinamica condivisa contenente il codice per la gestione della funzione 'alloca()':
  p = Inizializza_Alloca(256)
  If p = 0 Then Error.Raise("Impossibile allocare memoria con 'alloca()' !")
   
' Resta in attesa che sia inviato un dato numerico intero immesso dalla tastiera nello spazio sottostante la console o nel Terminale:
  Input i
  st = Memory p For Write
  Write #st, i As Integer
  st.Close
   
' Stampa in console o nel Terminale il valore numerico intero immesso con la tastiera:
  Print Int@(p)
  
End


Private Procedure Creaso()
 
 File.Save("/tmp/Alloca.c", "#include <alloca.h>" &
           "\n\n" &
         "char * Inizializza_Alloca (size_t dimen) {" &
           "\n\n" &
           "   char * c;" &
           "\n\n" &
           "   c = alloca(dimen);" &
           "\n\n" &
           "   return c;" &
           "\n\n}")
 
 Shell "gcc -o /tmp/Alloca.so /tmp/Alloca.c -shared" Wait
 
End



Riferimenti