mehrdimensionales array



  • heda,

    class Calculation { 
    private: int Unit[23][7] // z.Z. noch 2-dimensional 
    public: void init(); }
    

    also, ich hab eine klasse mit dem mehrdimenionalem array Unit. die werte 23 und 7 sind konstant, aber ich brauche noch einen 3. wert: Unit[23][7][anzahl()] quasi der returnwert von int anzahl()...
    sollte das nicht gehen, wär ich für andere vorschläge natürlich dankbar.
    Geht bloß darum dass der benutzer den 3. wert selbst bestimmt oder vllt. anzahl = 0xffffffff ist und er immernur bis \0 guckt, ist aber nicht sehr edel !?
    wie sieht das also in der praxis aus?
    benutze code::blocks ...
    mfg



  • Ungetestet, aber so in etwa sollte das aussehen:

    int dim1 = 2;
    int dim2 = 5;
    int dim3 = anzahl();
    
    int*** a = new int**[dim1];
    for(int i=0; i < dim1; i++) {
    	a[i] = new int*[dim2];
    	for(int j=0; j < dim2; j++)
    		a[i][j] = new int[dim3];
    }
    
    for(int i=0; i < dim1; i++) {
    	for(int j=0; j < dim2; j++) 
    		delete[] a[i][j];
    	delete[] a[i];
    }
    delete[] a;
    

    Alternativ könntest du natürlich auch ne Struktur wie std::vector< std::vector< std::vector<int> > > foo; nehmen und entsprechend resizen.



  • Warum ein Dreifachzeiger mit so einer komplizierten initialisierung?
    Soweit ich weiß gibts sowas wie

    int (*a)[23][7] = new int[23][7][mySize];
    //hier kann man ganz normal mit array-syntax arbeiten
    
    //nicht vergessen:
    delete[] a;
    

    @array: da die Länge des äussersten Arrays nicht feststeht, kann man es nur dynamisch alloziieren. Die normale Definition eines Arrays braucht eine compiletime-konstante, um zu wissen wieviel Speicher es für das Objekt reservieren muss.



  • pumuckl schrieb:

    Warum ein Dreifachzeiger mit so einer komplizierten initialisierung?
    Soweit ich weiß gibts sowas wie

    int (*a)[23][7] = new int[23][7][mySize];
    //hier kann man ganz normal mit array-syntax arbeiten
    
    //nicht vergessen:
    delete[] a;
    

    @array: da die Länge des äussersten Arrays nicht feststeht, kann man es nur dynamisch alloziieren. Die normale Definition eines Arrays braucht eine compiletime-konstante, um zu wissen wieviel Speicher es für das Objekt reservieren muss.

    Fehler	3	error C2440: 'Initialisierung': 'int (*)[7][1]' kann nicht in 'int (*)[23][7]' konvertiert werden	e:\c++\main.cpp	278
    


  • int (*a)[23][7] = new int[mySize][23][7];
    //hier kann man ganz normal mit array-syntax arbeiten:
    for (int i = 0; i < mySize; ++i) {
      a[i][22][6] = i;
    }  
    
    //nicht vergessen:
    delete[] a;
    

    Hatte das falschrum gemacht...



  • Das ist aber nach wie vor nicht exakt das, was der Fred-Starter haben wollte;)


Anmelden zum Antworten