Warum gibt es kein dynamisches mehrdimensionales Array in C++?



  • SeppJ schrieb:

    Nein, dies ist im Speicher eine lange, zusammenhängende Struktur. Du denkst an die schreckliche Unsitte ein 2D-Array so zu gestalten (Miner Erfahrung nach besonders in C beliebt):

    int **Array = malloc(10 * sizeof(*Array));
    for(int i = 0; i < 10; ++i)
     Array[i] = malloc(20 * sizeof(*Array[i]));
    

    Ja, du hast Recht.
    Ich habe daran gedacht, mein Fehler.

    Edit:

    Hier nochmal um keine Verwirrung aufkommen zu lassen.

    Short = 2 byte.

    short a[2][2];
    	a [1][1] = 1;
    	a [1][2] = 2;
    	a [2][1] = 3;
    	a [2][2] = 4;
    
    	cout<<	&a [1][1] << endl;
    	cout<< 	&a [1][2] << endl;
    	cout<<	&a [2][1] << endl;
    	cout<<	&a [2][2] << endl;
    

    e.g. Speicherbereich:
    0045F776 (+2)
    0045F778 (+2)
    0045F77A (+2)
    0045F77C


  • Mod

    Arcoth schrieb:

    Dann hast du das falsch verstanden.

    Nein, das hat er, soweit ich sehen kann, voellig richtig verstanden.

    int arr[8][8];
    

    Ist ein Array von 8 Arrays von int s. Jedes hat seinen eigenen Speicher; So zumindest interpretiere ich seine Aussage.

    Ich bin ziemlich sicher, dass du das falsch verstanden hast. Diese Aussage wäre trivial.

    die "verpointert" wurden.

    Was soll denn das heissen?

    Hier ist die entscheidende Erläuterung. Es handelt sich laut Ruvi um unabhängige 1D-Arrays und eine Sammlung von Pointern auf diese. Also so, wie es gerade nicht gemacht werden sollte und wie es hier auch nicht ist.

    edit: Hat sich inzwischen ja geklärt.



  • dot schrieb:

    Ein int array[42][3]; liegt zusammenhängend im Speicher, da es sich um ein Array aus 3 Arrays aus 42 int handelt.

    Fast. Es sind 42 Arrays aus 3 int. 🙂

    ~Die Vorschau spinnt bei Verwendung von Umlauten.~



  • Caligulaminus schrieb:

    dot schrieb:

    Ein int array[42][3]; liegt zusammenhängend im Speicher, da es sich um ein Array aus 3 Arrays aus 42 int handelt.

    Fast. Es sind 42 Arrays aus 3 int. 🙂

    stimmt natürlich... 🤡



  • SeppJ schrieb:

    Du denkst an die schreckliche Unsitte ein 2D-Array so zu gestalten (Miner Erfahrung nach besonders in C beliebt):

    int **Array = malloc(10 * sizeof(*Array));
    for(int i = 0; i < 10; ++i)
     Array[i] = malloc(20 * sizeof(*Array[i]));
    

    oder C++:

    vector<vector<int>> Array(10, vector<int>(20));
    

    Wieso sollte man das denn nicht so machen? 😕
    Und ich hoffe niemand ist mir böse, weil dieses Thema schon 2 Monate alt ist 🙂



  • Duji-Buji schrieb:

    SeppJ schrieb:

    Du denkst an die schreckliche Unsitte ein 2D-Array so zu gestalten (Miner Erfahrung nach besonders in C beliebt):

    int **Array = malloc(10 * sizeof(*Array));
    for(int i = 0; i < 10; ++i)
     Array[i] = malloc(20 * sizeof(*Array[i]));
    

    oder C++:

    vector<vector<int>> Array(10, vector<int>(20));
    

    Wieso sollte man das denn nicht so machen? 😕

    Kurze Antwort: Weil es ineffizient und auch semantisch verschieden von einem richtigen 2D Array ist... 😉



  • bau dir halt deine eigene array class (siehe beispiel) oder nimm std::array...

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class MyArray {
    	private:
    		vector<int> vec;
    		int size_x;
    		int size_y;
    
    	public:
    		MyArray(int dim_x, int dim_y): size_x(dim_x), size_y(dim_y) {
    			vec.resize(size_x*size_y);
    		}
    
    		void set_x_y(int x, int y, int val) {
    			int index = x * size_x + y;
    			vec[index] = val;
    		}
    
    		int get_x_y(int x, int y) {
    			int index = x * size_x + y;
    			return vec[index];
    		}
    };
    
    int main() {
    	// your code goes here
    	MyArray arr(2,2);
    
    	arr.set_x_y(1, 1, 22);
    	cout << arr.get_x_y(1, 1) << endl;
    
    	return 0;
    }
    

Anmelden zum Antworten