none
Aus der MSDN Hotline: Mehrdimensionale Arrays in C++ RRS feed

  • Allgemeine Diskussion

  • Hallo zusammen,
    heute wurde uns bei der MSDN Hotline unter anderem folgende Frage gestellt:
    Welche Möglichkeiten habe ich in C++ Mehrdimensionale Arrays anzulegen, und wie ist die Syntax hierfür?
    Unsere Antwort bzw. unser Lösungsvorschlag darauf war:
    In C++ gibt es zwei Arten von Arrays: statische und dynamische. Statische Arrays werden typischerweise dann eingesetzt, wenn bereits zur compile-Zeit feststeht, wie groß der Array ist. Ist dies erst zur Laufzeit bekannt muss man dynamische Arrays verwenden. Die Syntax für die Eindimensionalen Varianten, sehen wie folgt aus:
    statisch:
    int myArray [42];

    dynamisch:
    int* myArray = new int[42]; //nicht vergessen, später mit delete [] myArray; freigeben

    etwas hübscher vielleicht die Varianten aus der STL:
    statisch:

    array<int, 42> myArray;  //tr1

    dynamisch:

    vector<int> myArray (42);

    Die vector Klasse bietet gegenüber dem klassischen mit new allokiertem array zwei Vorteile. Erstens kann es seine größe zur Laufzeit ändern und zweitens allokiert und deallokiert die vector Klasse selbständig den benötigten Speicher. Auf diese Art vermeidet man typische Speicherlecks.
    Das array template ist Teil von tr1 und kann mit dem feature pack für C++ hier heruntergeladen werden: Visual C++ 2008 Feature Pack Release

    Möchte man nun einen 2D-Array anlegen muss man sich zunächst Fragen, ob es sich hierbei um ein echtes 2D Array handelt, also um ein Array, das eine rechteckige Tabelle representieren könnte (hierbei liegen alle Elemente des multidimensionalen arrays direkt hintereinander im Speicher), oder um ein Array von Zeigern auf Arrays, bei dem die einzelnen Element-Arrays unterschiedliche Längen haben können, aber nicht müssen ( jagged ).

    statisch:

    int myArray[42][5];

    oder mit der STL:

    array<array<int, 5>, 42> myArray; //nicht jagged

    dynamisch:

    int** myArray = new int*[42]; //jagged
    for ( int i = 0; i < 42; ++i ) {
         myArray[i] = new int[5];   //Achtung: müssen alle explizit deallokiert werden
    }

    oder mit STL:

    vector<vector<int> > myArray(42); //jagged

    es ist durchaus möglich, eine Dimension dynamisch festzulegen während die andere statisch ist:

    vector<array<int, 5> > myArray(42);

    Wir hoffen, vielen Besuchern der MSDN Foren durch das Posten dieses Problems und einer möglichen Lösung weiterhelfen zu können.

    Viele Grüße,
    Markus Klein
    MSDN Hotline für MSDN Online Deutschland

    Disclaimer:
    Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
    Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die MSDN Hotline: http://www.msdn-online.de/Hotline 
    MSDN Hotline: Schnelle & kompetente Hilfe für Entwickler: kostenfrei!

    Es gelten für die MSDN Hotline und dieses Posting diese Nutzungsbedingungen, Hinweise zu Markenzeichen sowie die allgemein gültigen Informationen zur Datensicherheit sowie die gesonderten Nutzungsbedingungen für die MSDN Hotline.
    • Bearbeitet Klein, Markus Mittwoch, 19. August 2009 13:09 klarere Formulierung
    • Bearbeitet Kay GizaMicrosoft employee Montag, 24. August 2009 15:11 Disclaimer eingefügt; Hyperlink korrigiert
    • Verschoben Kay GizaMicrosoft employee Freitag, 25. Juni 2010 10:19 (aus:Aus der MSDN Hotline: Häufig gestellte Fragen und deren Antworten)
    Mittwoch, 19. August 2009 12:38