Newsgroup: it.comp.lang.c++
Titolo: array

E' possibile ridimensionare un array?
es: ho un array di interi di due elementi. Ne voglio aggiungere un terzo
mantenedo i valori contenuti nei primi due. Come posso fare
Grazie per l'interessamento
Bruno La Torre

 
Puoi allocare l'array dinamicamente con malloc() e poi ridimensionarlo 
con realloc():
int *pmyarray;
int dim_small = 10;
int dim_big   = 100;
	pmyarray = (int *) malloc( dim_small * sizeof(int) );
	if (!pmyarray) ecc. ecc.
	// ...
	int *ptmp = (int *)realloc( pmyarray, dim_big*sizeof(int) );
	if (ptmp)
		pmyarray = ptmp;
La realloc() estende (se possibile) l'area di memoria passatale, senza 
alterarne il contenuto. Se non e' possibile estendere l'area, un'altra
zona di memoria viene automaticamente allocata e il contenuto viene
copiato automaticamente da una zona all'altra.
Se vuoi generalizzare puoi usare la realloc anche per la prima allocazione 
(basta inizializzare pmyarray a NULL). Stai attento pero' che realloc() e' 
una brutta bestia ;)
Antonello
-- 
// ------------------------------------------------------------
// Antonello Salvatucci
// Software Developer, Technical Writer
// LEGO A/S SPU-Darwin, Kloevermarken 120, 7190 Billund DENMARK
// 
// 
+45 75 33 22 33 ext. 5186
       antonello at digi. lego. com

mantenedo i valori contenuti nei primi due. Come posso fare
E c'e` chi dice ancora che il C++ e` piu` difficile del C...!
Usa il template standard vector<> e il problema diventa banale:
per aggiungere un terzo elemento in coda, fai una semplice 
push_back!
Con un array, puoi farlo solo se lo hai allocato con malloc() --
allora la realloc() te lo permette.
Confrontiamo dunque le due soluzioni:
in C++ standard:
#include <vector>
vector<int> array(2);
    ...
    array[0] = 23;
    array[1] = 69;
    // aggiungo un elemento:
    array.push_back(44);
in C (o C++ usato come se fosse C):
#include <stdlib.h>
int* array;
    ...
    // occorre inizializzarlo
    array = malloc(2*sizeof(int));
    array[0] = 23;
    array[1] = 69;
    // aggiungo un elemento
    array = realloc(array, 3*sizeof(int));
    array[2] = 44;
Alex

 E c'e` chi dice ancora che il C++ e` piu` difficile del C...!
IL C++ e' molto piu' comodo del C, solo che e' piu' difficile nel 
senso che i tempi di apprendimento sono piu' lunghi e il numero di 
concetti piu' ampio.
.. e anche il codice :-)
Ho usato stream e String in un mio programmino per dividere un file di
testo in file di dimensioni minori, 20-25 linee di programma, 170 KB 
sotto os2 con GCC :-?
In compenso econ 4 righe me la sono cavata, perche' se in e out sono 
stream tbuf una String fai, e numlin la lunghezza in righe dei file in
cui viene spezzato il file grosso fai:
	while (in) { // se stream in != EOF
		_itoa (filenum, temp, 10); if (filenum > 9999) exit (1);
		ofstream out (tbuf+"."+temp); // apre 1 file destinaz.
		for (int ln=0; ln < numlin; ln++) { 
			readline(in, linestr); // legge 1 riga
			if (!in) break; // se EOF termina
			out << linestr << "\n"; // scrive 1 riga
		}
		out.close(); // chiude destinaz.
		filenum++;
	}
E' questo un esempio di come la codifica in C++ possa diventare uno 
spasso con le facilities introdotte dalle classi.
Pero per 170 KB magari valeva la pena farla in C ;-)
** Email replies to 
md7...@mclink.it
 **
visit my homepage at: 
http://www.volftp.tin.it/IT/IT/ITALIANI/rullo/index.htm
 

Pero per 170 KB magari valeva la pena farla in C ;-)
O forse vale la pena di usare un compilatore meglio calibrato (e
librerie runtime dinamiche...)!
Alex

 librerie runtime dinamiche...)!
Posso convenire sull'uso delle librerie dinamiche, io ho linkato 
statico affinche potesse funzionare ovunque, sotto OS2 il compilatore 
GCC non e' parte del S.O. come Linux, quindi ce l'hanno solo i 
programmatori che si ispirano al mondo Unix.
Comuqnue potrei certamente distribuire le librerie dinamiche.
Invece la granularita' dovrebbe essere la stessa del GCC unix, anche 
perche' penso che i file siano stati banalmente ricompilati.
