PDA

Visualizza la versione completa : C++ e dimensionamento array


ChReAn
26-08-2002, 17:38
Dovrei ridimensionare dinamicamente un array in c++.
Lo dichiaro come un puntatore, ma poi al momento di aggiungere un nuovo membro come faccio?

Ciapz!

Level
26-08-2002, 18:58
Originariamente inviato da ChReAn
Dovrei ridimensionare dinamicamente un array in c++.
Lo dichiaro come un puntatore, ma poi al momento di aggiungere un nuovo membro come faccio?

Ciapz!
Esempio:


float *p;

p = new float[20]; // array di 20 elementi float

if (!p){
cout << "Allocazione fallita";

return -1;

}



delete [] p; // svuoto l'array;


In questo codice manca ovviamente la parte in cui carichi l'array, ossia assegni ad ogni elemento dell'array un valore.

ciao.

ChReAn
27-08-2002, 11:56
Scusa, forse non mi sono spiegato bene.
Non parlavo di allocazione dinamica ma di ridimensionamento dinamico di un array. :)

Per intenderci, se ho un array di quattro elementi e voglio inserirne un quarto, come posso fare a ridimensionarlo senza ricorrere a strutture dati complesse come liste concatenate? :confused:

Molten
27-08-2002, 16:50
Devi riversare il tuo array in un altro array di dimensione maggiore, creato in un secondo momento.
Di solito questa operazione non e' molto ottimale,specialmente quando l'array incomincia ad abbondare di elementi.
A quel punto ,si deve per forza di cose utilizzare una lista dinamica (per esempio i vettori).

parente
27-08-2002, 21:47
Se ho capito bene, la tua esigenza è quella di variare la grandezza dell'array in qualsiasi momento e non di allocare memoria dinamicamente.Se così è, ti conviene usare un indice che puoi inizializzare in qualsiasi momento. Bye.

Level
27-08-2002, 21:49
Originariamente inviato da ChReAn
Scusa, forse non mi sono spiegato bene.
Non parlavo di allocazione dinamica ma di ridimensionamento dinamico di un array. :)

Per intenderci, se ho un array di quattro elementi e voglio inserirne un quarto, come posso fare a ridimensionarlo senza ricorrere a strutture dati complesse come liste concatenate? :confused:
Usa la malloc per allocare la memoria iniziale (e la free quando lo svuoti) e ogni volta che lo ridimensioni dinamicamente usa la realloc.

ciao.

ChReAn
28-08-2002, 16:14
Originariamente inviato da parente
Se ho capito bene, la tua esigenza è quella di variare la grandezza dell'array in qualsiasi momento e non di allocare memoria dinamicamente.Se così è, ti conviene usare un indice che puoi inizializzare in qualsiasi momento. Bye.

Hai capito bene :), ma per indice cosa intendi? Devo creare una struttura dati che comprenda un indice fra i suoi membri, oppure... :confused:

parente
28-08-2002, 19:08
Dichiara un indice(una lettera) ad esempio "i" come un intero
o un reale, a seconda delle tue esigenze, poi quando dichiari l'array
metti l'indice i tra le parentesi[];
Es.:
int i=100;
int mioarray[i];

i sarà la grandezza del tuo array.In questo modo potrai variare la grandezza dell'array in qualsiasi momento del programma,
inizializzando i a tuo piacimento(ES.:i=2500;).
See you next time!

n355un0
29-08-2002, 08:26
Originariamente inviato da Level

Usa la malloc per allocare la memoria iniziale (e la free quando lo svuoti) e ogni volta che lo ridimensioni dinamicamente usa la realloc.

ciao.

sinceramente, parlando di c++, opterei più volentieri per new e delete.

ChReAn
29-08-2002, 09:48
Originariamente inviato da parente
Dichiara un indice(una lettera) ad esempio "i" come un intero
o un reale, a seconda delle tue esigenze, poi quando dichiari l'array
metti l'indice i tra le parentesi[];
Es.:
int i=100;
int mioarray[i];

i sarà la grandezza del tuo array.In questo modo potrai variare la grandezza dell'array in qualsiasi momento del programma,
inizializzando i a tuo piacimento(ES.:i=2500;).
See you next time!

Scusa ma... Assegnare un nuovo valore a una variabile non ridimensiona l'array.
Io devo ridimensionare l'array piu' volte, e quindi non mi basta una sola inizializzazione.

Credo che la soluzione piu' rapida (anche se non mi piace troppo) sia quella della copia fra array, per non ricorrere alle liste.

Loading