Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C++] Problema con array di grandi dimensioni

    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;
    }

  2. #2
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    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...

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


  3. #3
    ecco io non sono praticissimo di c++.. so fare poche cose, quelle che insegnano ai fisici, non ai programmatori quale potrebbe essere una soluzione al problema? avevo letto di array dichiarati fuori dalla main per avere piu memoria, ma non sta funzionando..

  4. #4
    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?

  5. #5
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    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!


  6. #6
    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).
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    L'array in questione è grande 80 MB, quindi nulla di sconvolgente.
    E' vero! Chissà che calcoli avevo fatto...


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.