www.mikrocontroller.net

Forum: PC-Programmierung 3dimensionales dynamisches Array in C++


Autor: funky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Frage zur Verwendung von Matrizen in C++

Ich bin dabei mir eine kleine Matrix Klasse zu schreiben. Hier mal 
Auszüge

matrix.h
class Matrix
{
    private:
        double *matrixArr;
        int Rows, Cols, Planes;
    public:
        Matrix(int Zeilen, int Spalten, int Level);
        ~Matrix();
}; 

matrix.cpp
//Konstruktor
Matrix::Matrix(int Zeilen, int Spalten, int Level)
{
  Rows = Zeilen;
   Cols = Spalten;
  Planes = Level;
   // Array allokieren
   matrixArr = new double[Rows * Cols * Planes];
}
//Dekonstruktor        
Matrix::~Matrix(){
  delete [] matrixArr;
}

Im Konstruktor allokiere ich den Speicher als 1-dimensionales Feld 
fürdie Größe eines 3dimensionalen Arrays (korrekt so?)

Wenn ich im Hauptprogramm ein Objekt der Klasse instanziiere, würde ich 
dann gerne in der Form matrix[0][0][0] = 1;   darauf zugreifen.
Wenn ich das so hinschreibe, dann funktioniert es nicht...was sogar mir 
logisch erscheint, da das Programm ja gar keine direkten Informationen 
über die Dimensionen meines Arrays hat.
Aber wie bekomme ich denn das hin, das meine gewünschte Zugriffsform 
funktioniert?
Muss man dazu [] irgendwie überladen? Ich habe da für 2dimensionale 
Arrays
etwas gesehen, aber selbst da habe ich es nicht so ganz verstanden. ich 
überlade [] und benutze im Hauptprogramm ja [][]  oder in meinem fall 
[][][]. Wie soll denn das funktionieren?
Kann mir jemadn mal einen Tip gebenwie das funktioniert? Oder muss ich 
den Speicher für mein Array schon ganz anders allokieren?

Danke, Axel

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt eine Reihe von Gründen das genau so nicht zu machen.
Aufgeführt z.B. hier: 
http://www.parashift.com/c++-faq-lite/operator-ove... 
(bis 13.12)
Besser ist es statt [] () zu überladen.

> Kann mir jemadn mal einen Tip gebenwie das funktioniert? Oder muss ich
> den Speicher für mein Array schon ganz anders allokieren?

Wenn's kompatibel zur "normalen" Array-Syntax sein soll, kann man das 
z.B. so allozieren.
  // das Problem ist, das C/C++ keine richtigen mehrdimensionalen 
  // Arrays kennt sondern nur Array von Arrays von...
  int one[4] ...;
  int two[3][2] ...;
  int three[4][3][2] ...;

  int* oneP = one;
  int* twoP = two[0];
  int* threeP = three[0][1];

  int (*three2P)[2] = three[0];
  int (*three3P)[3][2] = three;

  // Allozierung
  int z = 5, y = 4, x = 3;

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

  a3[4][3][2] = 123;
  // ähnlich geht's auch mit std::vector
  // oder man nimmt gleich boost

A

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist so schlimm an einem MyArray->GetValue( A, B, C);, dass man sich 
das Ueberladen von Arrays antun muss? Und falls mal jemand "Fremdes" 
deinen Code liest, wird er sich freuen, wenn keine Tretminen wie 
ueberladene Operatoren drin sind - die haben naemlich die unangenehme 
Eigenschaft, wie etwas Altbekanntes auszusehen, aber gaenzlich anders zu 
funktionieren...

Autor: funky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm, da ist was dran.

solche konstrukte wie *** möchte ich nicht verwenden. da muss ich 
jedesmal nachgrübeln was es denn bedeutet(und wenn ich denkeich habs 
kapiert zerbrech ich mir nächstes mal wieder den kopp drüber :( )

@arc net: danke für den parashift link. ist sehr hilfreich die seite!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.