Zweidimensionales Array mit Pointern unklar



  • Hallo zusammen,

    ich bin gerade dabei, ein zweidimensionales Array anhand von Pointern zu erstellen.
    Dabei soll der Benutzer die Größe angeben können (Zeilen und Spalten).

    Ich habe folgends gemacht:

    int zeilen = 0;
    int spalten = 0;
    
    // Einlesen der Zeilen und Spalten:
    
    ..... (das schreibe ich jetzt nicht extra auf.)
    
    // 2D - Array erzeugen:
    
     int** twoDimArray = new int* [zeilen]; // Pointer - Array
    
      for (int i = 0; i < Zeilen; i++){ // Eigentliches Array erzeugen.
          twoDimArray[i] = new int[spalten];
     }
    

    Es scheint zu funktionieren, doch ob das so wirklich richtig ist weiß ich nicht.

    Könnt ihr mir bitte Helfen?



  • Was spricht gehen ein std::vector<int> den du mit z.B. resize auf eine Größe von zeilen*spalten bringst?



  • @C91 sagte in Zweidimensionales Array mit Pointern unklar:

    // 2D - Array erzeugen:

    int** twoDimArray = new int* [zeilen]; // Pointer - Array

    Ich weiß gar nicht, wie häufig das hier schon im Forum war. Das ist KEIN 2d-Array! Ein Pointer ist kein Array und umgekehrt.

    Wenn du nur 1d hast, dann kannst du sowohl beim Pointer als auch beim Array mit [] zugreigen und merkst dabei keinen Unterschied. Bei einem 2d-Array versus Pointer auf Pointer ist aber die Struktur im Arbeitsspeicher völlig anders. Beim Array liegen die nSpalten*nZeilen Werte direkt hintereinander im RAM, beim Pointer-Fall hast du eine Anzahl Pointer, die auf (nicht erzwungen gleichgroße) weitere Speicherbereiche zeigen.

    Aus diesem Grund ist es normalerweise ratsam, dem Rat von @TGGC zu folgen - oder hier im Forum zu suchen, denn das wurde schon unzählige Male durchgekaut.



  • Ein Codebeispiel würde mir helfen. Für mich ist das neu.



  • @C91 sagte in Zweidimensionales Array mit Pointern unklar:

    Ein Codebeispiel würde mir helfen. Für mich ist das neu.

    Die Frage ist erstmal, was du erreichen willst. Wenn dein Code eine Schulaufgabe ist, ist deine Lösung richtig und wahrscheinlich auch diejenige, die gefordert ist. Du hast ja selbst im Kommentar schon " // Pointer - Array" geschrieben. Du solltest nur wissen, dass du damit zwar mit eckigen Klammern wie auf ein 2d-Array zugreifen kannst, es aber keines ist.

    Siehe zum Beispiel hier: https://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using-new (lies auch die 2. Antwort die 3. Antwort!)



  • Wenn du std::vector nimmst kannst du das wie folgt machen (geht aber sicher noch kürzer):

    #include <vector>
    
    int main() {	
    	std::size_t x;
    	std::cin >> x;
    	
    	std::size_t y;
    	std::cin >> y;
    	
    	std::vector<std::vector<int>> vec(x);
    	for(auto& element : vec)
    		element.resize(y);
    }
    


  • Oder halt als ein Vector.

    std::vector<int> vec( zeilen * spalten );
    vec[ x + y * spalten ] = 1;
    

    Vorteil: ein großer Speicherblock anstatt möglicherweise viele einzelne. Stichwort: CacheLine-Optimization 😃

    @C91 es gibt viele Lösungen. Wenn du es privat machst, versuche die beste zu finden, wenn du es als Hausaufgabe hast, nimm die Lösung die dem Professor/Lehrer gefällt...

    @TGGC nevermind, hab erst zu spät gelesen, dass du exakt dasselbe schon vorgeschlagen hattest 😄


Log in to reply