Mehrdimensionales Array AM STÜCK mit variabler Größe



  • Hallo
    Ich habe folgendes Problem

    Mein Programm liest zunächst Variabelen aus einer Datei ein. z.B x,y und z
    Dann möchte ich ein 3 dimensionales Array mit den Größen x, y und z erstellen.
    Da x,y,z nicht constant sind muss ich sie dynamisch erstellen:

    int ***matrix;
    matrix=new int** [x];
    for(i=0; i<x; i++)
    {
    	matrix[i]=new int* [y];
    	for(j=0; j<y; j++)
    	{
    		matrix[i][j]=new int [z];
    	}
    }
    

    Das Problem ist, dass der Speicher nicht am Stück ist und deshalb der eintrag matrix[0][1][10] nicht mit matrix[0][0][x+10] angesprochen werden kann. Dies ist aber für mein Problem notwendig.

    Nun meine Frage:
    Gibt es eine Lösung um Arrays mit variabler Größe am Stück zu erstellen?
    Oder gibt es eine Methode die eingelesenen Variablen als konstanten zu behandeln?



  • Hallo erstmal 🤡 🙂

    Nimm std::vector (oder einen anderen STL-Container), in diesem Fall std::vector<int> .
    Edit: Wenn du ein Multidimensionales Array erstellen willst, gibt's da in Boost etwas (falls du das kennst), oder (unschön aber was solls) sowas:

    std::vector<std::vector<std::vector<int> > > vec(10, std::vector<std::vector<int> >(10, std::vector<int>()));// Zwei aufeinanderfolgende Stereo-Klammern erst in C++11, hast du das?
    

    Das erzeugt einen Drei-dimensionalen vector mit 10*10*0 Elementen. Zugriff wie immer (du es gewohnt bist). ABER: Das brauchst du sehr bestimmt nicht!
    Mach doch einfach für jede Datei ein Array 😕

    Edit: Oben war was falsch, korrigiert



  • rokei schrieb:

    Das Problem ist, dass der Speicher nicht am Stück ist und deshalb der eintrag matrix[0][1][10] nicht mit matrix[0][0][x+10] angesprochen werden kann. Dies ist aber für mein Problem notwendig.

    Na dann erstell doch einen std::vector der Größe x*y*z und sprich die einzelnen Elemente mit [i*y*z + j*z + k] (oder wie auch immer du es machen möchtest) an. Die Berechnung kannst du auch noch in eine separate Funktion pos(i,j,k) auslagern.



  • rokei schrieb:

    Dies ist aber für mein Problem notwendig.

    Erklär uns mal dein Problem, ich bin sicher das kann man schöner lösen.



  • Erst mal danke für die Antworten

    Hacker schrieb:

    rokei schrieb:

    Dies ist aber für mein Problem notwendig.

    Erklär uns mal dein Problem, ich bin sicher das kann man schöner lösen.

    Ich muss die Array später durch über den letzten Index ansprechen. d.h matrix[0][0][wert]. Eine Möglichkeit wäre die Matrix so anzusprechen:
    matrix[wert/(x*y)][(wert/z)%y][wert%z].
    Allerdings habe ich festgestellt das dies mein Programm sehr stark verlangsamt.

    Ich probier jetzt mal das dreidimensionale Array in ein eindimensionales der Grße x*y*z umzuwandeln dann sollte es eigentlich funktionieren.

    Edit: bzw gibt es eine Möglichkeit der main-funktion variablen mitzugeben und diese dann wie Konstanten zu behandeln? Dann könnte ich meine array nichtdynamisch erstellen.



  • Mit dem eindimensionalen Array solltest du am performantesten sein. Achte aber auf Cachefreundlichkeit, d.h. mappe die drei Dimensionen so auf dein Array, dass du den Speicher sequentiell durchwanderst und nicht im Speicher wild umherspringen musst.



  • Danke Michael. Es klappt jetzt.
    Allerdings hab ich beim Zugriff auf das Array immer noch einen Perfomance Verlust im Vergleich zum statischen Array.
    Gibt es keine Möglichkeit meinem Main Programm die Parameter so zu übergeben, dass ich sie als Konstanten behandeln kann



  • wenn Du über die letzte Dimension zugreifst, sollte die von Hacker vorgeschlagene Version mit vector nicht langsamer sein als ein statisches Feld. Erst wenn Du im wesentlichen über die "höheren" (oder wie auch immer man das nennen mag) Dimensionen zugreifst spielt das eine Rolle, weil dann Cache Effekte zum Tragen kommen.



  • Nix für ungut, aber dieses Thema hatten wir in den letzten 2 Monaten geschätzte 400 Mal. Wenn du die Suchfunktion des Forums benutzt findest du alle wichtigen Informationen.



  • rokei schrieb:

    Allerdings hab ich beim Zugriff auf das Array immer noch einen Perfomance Verlust im Vergleich zum statischen Array.

    Dann machst du etwas falsch 😉 Hast du im Release-Modus kompiliert? Liegt die Matrix in der Reihenfolge im Speicher, wie du sie durchläufst?

    Zu den von DocShoe angesprochenen Threads: Lies dir mal http://www.c-plusplus.net/forum/298756-full durch.


Anmelden zum Antworten