PDA

View Full Version : [C++] namespace, vettori e matrici


Etchelon
08-03-2010, 15:48
Ciao a tutti,
ho appena cominciato a convertire un programma da FORTRAN a C++ (serve a fare i conti, sono un ingegnere chimico :D ). 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*
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":

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!

cionci
08-03-2010, 18:15
Senza sapere cosa sia BuzzVector è impossibile risponderti.

tomminno
08-03-2010, 19:40
Secondo me stai sbagliando nel senso che nel primo main ridichiari una variabile f0 di tipo BzzVector ad ogni iterazione, se ti capita di riutilizzarla fuori dal for la variabile f0 di tsteep è vuota, mentre nel secondo caso correttamente modifichi la f0 globale in quanto l'assegni ad ogni for.
Il fatto che tu ottenga out_of_range mi fa pensare ad una implementazione tramite vector o altri container standard, in tal caso potresti usare qualche metodo tipo resize, ma senza conoscere la definizione di BzzVector è impossibile consigliarti strade alternative.

Etchelon
09-03-2010, 01:28
Hmm grazie delle risposte, chiederò direttamente al professore se può implementare un'opzione tipo resize visto che ora manca! :D

Etchelon
09-03-2010, 01:43
E invece no! Ho trovato un tutorial che m'era sfuggito...
ChangeDimensions(nuova dimensione,&f0) funziona! Yeah :sofico:
Grazie ancora! :D

cionci
09-03-2010, 08:38
Io mi domando perché i professori si facciano spesso le loro inutili e stupide librerie invece di insegnare la libreria standard.

fero86
10-03-2010, 12:08
Io mi domando perché i professori si facciano spesso le loro inutili e stupide librerie invece di insegnare la libreria standard. quotone. questo thread é una pena... :muro:

tomminno
10-03-2010, 13:15
quotone. questo thread é una pena... :muro:

Oltretutto è tutto molto C è decisamente poco C++

banryu79
10-03-2010, 17:22
Io mi domando perché i professori si facciano spesso le loro inutili e stupide librerie invece di insegnare la libreria standard.
Perchè così fa figo :O, vuoi mettere a far vedere agli studenti che le cose te le fai da te, piuttosto che appoggiarti alla libreria standard? tzè, la libreria standard... roba da pivelli! :burp:

fero86
11-03-2010, 00:38
Perchè così fa figo :O, vuoi mettere a far vedere agli studenti che le cose te le fai da te, piuttosto che appoggiarti alla libreria standard? tzè, la libreria standard... roba da pivelli! :burp: si ma é fighetteria da quattro soldi, perché poi non é che vanno ad usare il livello di API sottostante per fare le cose, semplicemente creano uno strato totalmente inutile e ridondante.

a Roma Tre c'é un professore che spiega Java (non faccio nomi altrimenti il pupazzo rosso di Striscia si offende :asd: ) facendo usare agli studenti un package di classi penosissime scritto da lui, il package fiji, che é perfettamente inutile: reimplementa System.out al di sopra di System.out e cose del genere dandogli nomi diversi (e nomi italiani per giunta, una cosa che giá da sola fa incazzare a morte), é un pianto, é una pena vedere quante minchiate inutili e ridondanti abbia scritto quell'individuo :D :asd:
ed é ancor peggio vedere quei poveracci ignoranti* di studenti che imparano a programmare cosi!!

*ignoranti non in senso dispregiativo ma nel senso che mi pare giusto che uno che arriva li dapprima non sia tenuto a saperne una mazza di quella roba.