2012-04-01 7 views
0

Ich arbeite an einem Projekt, von dem ich konstante multidimensionale Arrays speichern sollte. Ich würde es gerne mit einem Zeiger tun, der auf mehrdimensionale Arrays zeigt. Aber ich konnte nicht erfolgreich sein. Ich schreibe diesen Code, aber es hat nicht kompiliert.C++: konstante multidimensionale Arrays in einem Zeiger speichern

int darray[1][2]; 
    int darray2[2][3]; 
    int (*p)[1][2]; 
    p= new int[2]; 
    p[0] = darray; 
    p[1] = darray2; 
+0

Ich würde empfehlen, eine 'struct' für die Konstanten multidimensionalen Arrays und dann einen Zeiger für diese' struct' machen – twain249

+0

Es ist nicht klar, was Sie diesen Code zu tun haben. Willst du 'p' auf' darray' zeigen? Was ist der Zweck von 'darray2'? –

+0

sorry es war darray2 was bei p [1] gespeichert ist – berkay

Antwort

2

Nun, lassen Sie uns für Zeile Code Zeile durchlaufen (OK, ich werde die ersten beiden Zeilen zusammen Klumpen)

int darray[1][2]; 
int darray2[2][3]; 

OK, das definiert zwei zweidimensionale Arrays in genau der Art und Weise Sie (wahrscheinlich) erwarten. Beachten Sie, dass dies formal Arrays von Arrays von Ints sind. Genauer gesagt, darray vom Typ „Array von 1-Array von 2 ints jeden“ und darray2 ist vom Typ „Array von 2 Arrays von 3 ints jeden“

int (*p)[1][2]; 

Dies definiert einen Zeiger auf eine zweidimensionale Anordnung von int oder dem ersten Element eines Arrays solcher Arrays. Das heißt, der Typ ist "Zeiger auf Array von 1 Array von je 2 Ints".

p= new int[2]; 

Hier Sie Zuweisen von Speicherplatz für zwei ints (dh ein eindimensionales Array von ints, der Länge zwei) und new gibt einen Zeiger auf das erste Element dieses Arrays, dh einen Zeiger auf int . Sie versuchen, diesen Zeiger auf zu Int zu weisen, der wie oben erwähnt ein Zeiger auf Array von 1 Array mit je 2 Ints ist. Dies führt zu einem Typenkonflikt und sollte nicht kompiliert werden.

Es ist nicht ganz klar, was Sie an diesem Punkt wollen, aber wenn man bedenkt, dass Sie Zuordnungen zu p[0] und p[1] nachher tun, und da der Rückgabewert p zugeordnet ist, die vom Typ würde int (*)[1][2] die offensichtliche Wahl ist sein p = new int[2][1][2];

Dies funktioniert wieder nicht, da Arrays in C++ keine erstklassigen Objekte sind. Das heißt, statt den Wert von darray zu p[0] Zuordnung wie die Linie vorschlagen würde (und p[0] Tat hätte den richtigen Typ für das) die Regeln von C++ sagen, dass das Array darray ist an einen Zeiger auf das erste Element gefördert. Das ist, was dieser Code eigentlich versucht zu tun ist, einen Zeiger auf das erste Element von darray (vom Typ int (*)[2]) zu p[0] (vom Typ int[1][2]) zuzuweisen, was natürlich fehlschlägt. In C++ sind Arrays einfach nicht zuweisbar.

p[1] = darray2; 

Diese leiden unter dem gleichen Problem beachten Sie jedoch, dass selbst wenn Arrays erste Klasse sind, zuweisbare Objekte in C++, dies immer noch ein Typenkonflikt sein würde, weil p[1] vom Typ int[1][2] während darray2 vom Typ int[2][3].

Beachten Sie, dass Sie rund um die meisten dieser Einschränkungen erhalten (außer der letzten) durch Sie nur Einwickeln Array in eine Klasse C++ 11 tatsächlich eine Standardklasse Vorlage std::array für diesen Zweck genannt):

struct array12 { int data[1][2]; }; 
array12 darray; 
array12* p; 
p = new array12[2]; 
p[0] = darray; 

Mit ein wenig mehr Programmierung könnten Sie auch die Zuordnung von größeren zu kleineren Arrays (Ihre darray2 Fall) durch Kopieren nur eines Teils der Daten von Hand.

+0

vielen Dank, das hat mein Problem gelöst – berkay