2-dimensionales array und new-Operator Hilfe!!



  • Hallo,
    bin noch dabei, C++ zu lernen und habe hier ein (für mich) großes Problem:

    Ich will ein 2-dimensionales array erzeugen, und will dabei dem User ermöglichen, dass er die Dimensionen des arrays beliebig wählen kann.

    Ich dachte an folgenden Code:

    int zeile,spalte;
    cout<<"Zeilen eingeben: ";
    cin>>zeile;
    cout<<"Spalten eingeben: ";
    cin>>spalte;
    
    int *A=new int[zeile][spalte]; //A soll meine Matrix sein
    
    for(int i=0;i<zeile;i++)
    {
       for(int j=0;j<spalte;j++)
       {
         A[i][j]=1;
       }
    }
    
    .
    .
    .
    

    Das nur als Beispiel, um die Matrix danach komplett mit Einsen zu füllen.

    Leider mag der Compiler meinen Code ganz u garnicht u ich kann machen was ich will. Denke, es hängt mit der Speicherallokierung zusammen.

    Hat jemand eine Idee, wie man das besser, bzw. richtig machen kann?

    Danke vielmals,
    Greetz Mati



  • Nutze std::vector aus vector

    EDIT: wichtigen Fehler korrigiert (hatte vector.h geschrieben)



  • Bei mehreren Dimensionen kannst du nur die äußerste Dimension dynamisch festlegen - alle anderen müssen zur Compile-Zeit feststehen. Aber du könntest mit geeigneter Index-Umrechnung ein zweidimensinales Array auf einem eindimensionalen Feld umsetzen:

    int* A = new int[zeile*spalte];
    for(i=0;i<zeile;++i)
      for(j=0;j<spalte;++j)
        A[i+j*zeile]=1;
    


  • Wenns nich ganz so "basic" sein muss kannst du boost::multi_array verwenden.

    Shinja schrieb:

    Nutze std::vector aus vector.h

    std::vectr aus vector. 😛

    grüße



  • Ok, andere Frage von mir dann: auch wenn man <vector> inkludiert steht die Klasse doch imemr noch in der vector.h oder nicht? Habe das h extra deswegen wieder angefügt.



  • Hat zwar nichts mit dem Thema zu tun, aber nein. Tut sie nicht (zwangsläufig).

    grüße



  • Danke, dann korrigier ich das gleich mal.

    Sorry fürs OT



  • #include <vector> 
    #include <iostream>
    using namespace std; 
    
    int main() 
    { 
        int zeile = 5, spalte; 
        //Wenn die zweite Dimension zur Compilezeit bekannt ist, macht man das so
        int(*D2)[10] = new int [zeile][10];  
        //  new liefert hier nicht int* sondern int(*)[10] !
        //  D2[3][5] = 1; usw.
            delete[] D2;
    
            cout<<"Zeilen eingeben: "; 
            cin>>zeile; 
            cout<<"Spalten eingeben: "; 
            cin>>spalte; 
        //  Wenn die zweite Dimension nicht bekannt ist, so wie von CStoll gezeigt.
        //  Es sollten jedoch Arrays entstehen, die genauso organisiert sind wie die, die der Compiler generieren würde
        //  wenn er die zweite Dimension kennt, also A[i*spalte+j]=1; 
    
        vector<vector<int> > A(zeile, vector<int>(spalte));
    
            for(int i = 0; i < zeile; i++) 
                    for(int j=0;j<spalte;j++) 
                            A[i][j]=1; 
    
            return 0;
    }
    

    :xmas1:


  • Mod

    Dann aber gleich

    vector<vector<int> > A(zeile, vector<int>(spalte,1));
    

    :xmas1:


Anmelden zum Antworten