absturz wenn 2D array zu gross ist



  • wenn ich einen array mache z.b. mymatrix[100][10] (doubles), dann ist alles o.k.
    wenn aber mymatrix als [20000][10] definiert ist, compiled das programm, aber das exe stuerzt immer ab.
    wie kann man in c++ groessere matrizen erzeugen? es kann nicht von meinem system abhaengen, denn mit matlab oder so, kann ich noch groesere matrizen bearbeiten - d.h. speicher resourcen waeren vorhanden...
    kann jemand helfen?
    danke,
    duschl



  • was kommt denn für eine Fehlermeldung? Wo hast du das Array versucht anzulegen?
    Auf dem Stack?



  • hier ist der inputfile:

    #include <iostream>
    using namespace std;
    //setting the array dimensions
    const int rows=200; //wenn 200 >> 20000 : absturz
    const int columns=10;
    int main()
    {
    //creating a matrix made of doubles
    double mymatrix[rows][columns];
    //putting some numbers into the matrix:
    for (int c=0; c<columns; c++)
    for (int r=0; r<rows; r++)
    {
    mymatrix[r][c]=(r+c)+0.5;
    }
    //just checking the output:
    cout << "size: " << rows << " x " << columns << endl;
    cout << "mymatrix[" << rows <<"," << columns
    << "]=" << mymatrix[rows-1][columns-1] << endl;
    }

    die fehlermeldung sieht so aus:
    filename.exe has generated errors and will be closed by windows. you will need to restart the program.
    an error log is being created.

    ich weiss nicht, wo dieser errorlog angelegt ist... nicht in dem verzeichnis wo ich compiliere. weiss nicht nach welchem file ich suchen sollte...

    duschl


  • Mod

    Hallo

    du legst "mymatrix" auf dem Stack an
    Variablen dieser Groesse solltest du mit new erzeugen
    denn der Stack ist nicht beliebig vergroesserbar.

    MfG
    Klaus



  • int rows=1000;
      int cols=1000;
      int ** my2darray = new int*[rows];
      for(int i=0;i<rows;i++)
      my2darray[i] = new int[cols];
    

    mfG

    robi1806



  • danke, robi und klaus. es funktioniert jetzt - obwohl ich zeile 1 nicht verstehe. kann man die in 2 oder 3 zeilen die verstaendlich sind aufspalten? versteckt sich hinter dem ** irgendwas (z.b. so wie zwei if's sich hinter einem ? vestecken)

    1: double **mymatrix = new double*[rows];
    2: for (int r=0; r<rows; r++)
    3: mymatrix[r]=new double[columns];



  • Und wie deleted man den Spaß wieder?



  • mit

    delete[] *mymatrix;

    duschl



  • wohl eher in dieser Form:

    for (int i = 0; i < max_zeilen;  i++)
    	delete[] DatenMatrix[i];      // SCHRITT 1: SPALTEN LÖSCHEN
    delete[] DatenMatrix;             // SCHRITT 2: ZEILEN LÖSCHEN
    

  • Mod

    Hallo

    oder du schaust dir mal DynamicArray an

    MfG
    Klaus


Anmelden zum Antworten