View Single Post
Old 08-03-2010, 14:48   #1
Etchelon
Bannato
 
Iscritto dal: May 2004
Messaggi: 2343
[C++] namespace, vettori e matrici

Ciao a tutti,
ho appena cominciato a convertire un programma da FORTRAN a C++ (serve a fare i conti, sono un ingegnere chimico ). Ho cercato un pochettino in internet informazioni riguardo alle variabili globali, visto che il programma è pieno di COMMON condivisi tra le molte subroutine, ed ho realizzato che "namespace" è la esatta controparte C++ del COMMON. Ho quindi provato a utilizzarlo per condividere dei vettori e delle matrici tra due funzioni che utilizzano lo stesso namespace, ma ho un problema:
il vettore viene dimensionato nel main, ma tale dimensione varia ad ogni loop. La dichiarazione del vettore nel namespace però avviene senza dimensionamento, e sembra che dentro al main io non possa cambiare la dimensione. Scritto in codice:
*PREMESSA: uso delle librerie di calcolo numerico create da un mio professore. Nel seguente codice BzzVector è semplicemente una classe creata per gestire vettori. Scrivere BzzVector f0(int i) equivale a scrivere double f0[i], niente di che*
Codice:
namespace tsteep
{ BzzVector f0; }
void main(void)
{ using namespace tsteep; for(i = 3; i <= 16; i++)
{ BzzVector f0(i); }
}
La compilazione avviene senza errori ma l'exe dà errore: class BzzVector: index out of range, come se non potessi dire a f0, solo dichiarato fino a quel momento, di aumentare di dimensione. Riesco ad aggirare il problema semplicemente definendo nel main un altro vettore, e poi uguagliando f0 a questo vettore "ausiliario":

Codice:
namespace tsteep
{ BzzVector f0; }
void main(void)
{ using namespace tsteep; for(i = 3; i <= 16; i++)
{ BzzVector aus(i); f0 = aus; }
}
allora sì che f0 ad ogni loop cambia ed aumenta di dimensione.

Il problema è che vorrei capire se si può andare a manipolare direttamente f0 senza dover dimensionare un vettore extra, per risparmiare memoria (che in questo caso è niente, ma nel programma principale che si trova a maneggiare più vettori di 5000 elementi penso inizi a pesare...).

Grazie!
Etchelon è offline   Rispondi citando il messaggio o parte di esso