PDA

Visualizza la versione completa : [C++] Problema con array di grandi dimensioni


alvpizz95
06-02-2015, 20:49
Ciao a tutti, io sono alle prese con il seguente problema:

(xubuntu 14.04, compilatore g++)

devo scrivere un programma per il quale mi sarà necessario utilizzare un array bidimensionale di dimensione [1048576][20]. se lo dichiaro normalmente il programma compila, ma in esecuzione ricevo segmentation fault. se lo dichiaro fuori dalla main non compila. ho gia passato svariate ore a cercare di capire come risolvere aprendo i più disparati link. anche se lo dichiaro utilizzando new non funziona! qualcuno sa dirmi come fare?
inoltre non capisco perchè ciò che dichiaro fouri dalla main venga preso per inesistente...

scrivo qui sotto un estratto del programma



using namespace std;

const int Permos = pow(2, 20);
int Cifrario[Permos][20];

int main()
{
cout << "Permos = " << Permos << endl;

//DEFINISCO UN GRANDE ARRAY CHE CONTENGA TUTTE LE PERMUTAZIONI
//definisco una funzione che mi farà un certo lavoro;
//definisco il numero di cobinazioni

for(int i=0; i<Permos; i++) {for(int j=0; j<20; j++) {Cifrario[i][j] = 0;} }

//ora riempio il cifrario in modo da scrivere un array BINARIO di 20 slot
for(int i=1; i<Permos; i++) {Cifrario[i][20]++;
for(int j=20; j>0; j--) {if(Cifrario[i][j]>1) {Cifrario[i][j-1]++; Cifrario[i][j] = 0;} } //partendo dalla fine per arrivare all'inizio!
for(int j=0; j<20; j++) {Cifrario[i+1][j] = Cifrario[i][j];}
}

return 0;
}

minomic
06-02-2015, 23:12
Ciao, direi che il problema è che non hai abbastanza memoria da allocare. E in effetti è perfettamente plausibile: hai idea di quale sia la dimensione di quell'oggetto? 20971520 volte quella di un int... :D

Diciamo che dovrai trovare un diverso approccio al tuo problema, perché questo non mi sembra praticabile.

:ciauz:

alvpizz95
07-02-2015, 00:01
ecco io non sono praticissimo di c++.. so fare poche cose, quelle che insegnano ai fisici, non ai programmatori:stordita: quale potrebbe essere una soluzione al problema? avevo letto di array dichiarati fuori dalla main per avere piu memoria, ma non sta funzionando..

alvpizz95
07-02-2015, 00:10
colpo di scena. invece di scrivere pow(2, 20) ho scritto il numero così come è. (avevo fatto prima vari tentativi per vedere a quale numero avrebbe smesso di funzionare. avendo visto che non smetteva per numeri maggiori di 2^20 mi sono stupito..) quindi scrivendo il numero corretto funziona. ma perche?

minomic
07-02-2015, 08:45
Dunque, ho provato a scrivere un banale programma per farmi stampare il valore restituito da pow(2,20) ed è proprio 1048576, quindi non capisco come possa funzionare se invece della funzione pow utilizzi il valore così com'è. Comunque... meglio!

:ciauz:

MItaly
07-02-2015, 13:12
L'array in questione è grande 80 MB, quindi nulla di sconvolgente. Semplicemente non devi allocarlo direttamente come array globale, ma devi usare l'allocazione dinamica (new o std::vector).

minomic
07-02-2015, 13:14
L'array in questione è grande 80 MB, quindi nulla di sconvolgente.
E' vero! Chissà che calcoli avevo fatto...

:ciauz:

Loading