Newsgroup: it.comp.lang.c++
Titolo: vettori con dimensione ignota. AIUTO.

Scusate la banalità, ma uso da poco il C++.
Il mio problema consiste in questo: Devo gestire un vettore, ma le
dimensioni devo comunicargliele dall'esterno, quindi dopo la compilazione.
Devo allora necessariamente utilizzare una MALLOC.
Allora, mi arriva l'intero; ne calcolo la dimensione con sizeof(int);
se definisco 
  int *pi;
faccio
 
  pi = malloc(sizeof(int));
ORA, come faccio?????
Non posso definire 
int vett[pi]
perchè è necessario una costante. Eppure so che va fatto così.
Vi prego un aiuto.
La mia e-mail è 
 
cata...@hotmail.com
saluti LUCA:

Devo allora necessariamente utilizzare una MALLOC.
In c++ e' meglio usare l'operatore new:
int pi=10; // N. di elementi da allocare
int *vett=new int[pi];	// Alloca pi elementi
.. // Uso di Vett[]
delete []vett;	// Disallocazione di vett[]
Gianpaolo Bottin
- Live Long and Prosper -

 Devo allora necessariamente utilizzare una MALLOC.


ORA, come faccio?????
Usi il tuo array.
E leggi i messaggi arretrati del gruppo...
-- 
email: 
en...@bitsmart.com

      vett = (int *)malloc(k*sizeof(int));
una precisazione: in C (a differenza del C++) il cast non solo è
facoltativo, anzi è _fortemente_ sconsigliato.
Infatti, lo standard C prevede che il cast sia gestito dal compilatore
il quale genera dei warning in caso di cast "sospetti"; se invece
specifichi esplicitamente un cast (anche errato), il compilatore assume
che "sai quello che stai facendo", quindi compila e passa oltre.
Il cast, quindi, va usato solo per operazioni fuori dall'ordinario.
Saluti, julio di egidio
ju...@webzone.it

 delete []vett;	// Disallocazione di vett[]
Una curiosita', tu per caso sai qual'e' il metodo che sta sotto 
all'allocazione di memoria per gli array in C++, ovvero come lavorano 
new e delete per gli array.
In sostanza, come fa a sapere quanta memoria liberare l'itruzione 
delete []vett ?
** Email replies to 
md7...@mclink.it
 **
visit my homepage at: 
http://www.volftp.tin.it/IT/IT/ITALIANI/rullo/index.htm
 

delete []vett ?
new T[n] alloca alcuni byte in piu` (tipicamente 4) subito *prima*
del T* ritornato, e prima di tornare copia in quei byte il valore di n
(e naturalmente esegue n volte il ctor di default T()).
delete[] recupera il valore di n dai byte immediatamente prima
in memoria dell'indirizzo che gli viene passato, esegue n volte
il dtor ~T(), poi libera i (grosso modo) sizeof(size_t)+n*sizeof(T)
byte.
(Sarebbe abbastanza facile scrivere queste funzionalita` come
template C++, a parte dettagli fastidiosi come i problemi di
allineamento che rendono difficile farlo portatilmente...).
Se internamente i vari  "operator new" chiamano malloc(), e i
vari "operator delete" chiamano free(), ci saranno ancora altri
4 byte consumati per dare a free() la dimensione esatta del
blocco da liberare (le normali implementazioni oggi non sono
infatti cosi`, bensi` new e malloc si "appoggiano" sulla stessa
funzione in comune di piu` basso livello).
Alex

delete []vett ?
e come fa la free a sapere quanta memoria ha allocato la relativa
malloc ? Semplice, la malloc alloca un blocco leggermente piu' grande
e usa la prima parte (di solito 4/8 bytes) per memorizzare le sue
cose.
