STL: 2d-Array im Stack

Hallo,

ich probiere, in einem STL-stack ein zweidimensionales Array mit fester Größe zu speichern. Der Code sieht so aus:

#include 
#include 

using namespace std;

stack foo;

void bar(char a[2][2]){
 foo.push(a);
}

int main(void){
 char a[2][2] = {{'a', 'b'}, {'c', 'd'}};
 bar(a);
 return 0;
}

Jetzt bekomme ich beim kompilieren die Fehlermeldung

test.cpp: In function `void bar(char (\*)[2])':
test.cpp:9: error: no matching function for call to `std::stack \> \>::stuck\_out\_tongue:ush(char (\*&amp:wink:[2])'
/usr/include/c++/3.3/bits/stl\_stack.h:175: error: candidates are: void 
 std::stack::stuck\_out\_tongue:ush(typename \_Sequence::value\_type&amp:wink: [with \_Tp 
 = char[2][2], \_Sequence = std::deque 
 \>]

Offensichtlich beschwert sich der Kompiler (g++ aus der GNU Compiler Collection, version 3.3.5 (Debian 1:3.3.5-13), mit den Optionen -Wall -ansi), dass die Typen von a und char[2][2] nicht zusammenpassen. Was mache ich falsch, und wie mache ich es richtig?

Nur so am Rande: auf zweidimensionale Arrays zu verzichten ist für mich kaum möglich…

Grüße,
Moritz

Wenn du mit Arrays rumspielst musst du sowieso die Speicherverwaltung selber machen, es wird also nicht viel komplexter wenn du den Stack gleich für char* auslegst:

#include 
#include 

using namespace std;

stack foo;

void bar( char (\*a)[2] ){
 foo.push(\*a);
}

int main(void){
 char a[2][2] = {{'a', 'b'}, {'c', 'd'}};
 bar(a);
 return 0;
}

Hallo,

vielen Dank für die schnelle Antwort.

Wie bekomme ich denn jetzt ein Element aus dem Stack wieder in ein 2dimensionales Array zurück?

Mit

char (\*fee)[2];
(\*fee) = foo.top();

bekomme ich den Fehler

test.cpp: In function `int main()':
test.cpp:16: error: incompatible types in assignment of `char*' to `char[2]'

.

Irgendwie finde ich mehrdimensionale Arrays in C++ nicht gerade intuitiv :frowning:.

Grüße,
Moritz

Wie bekomme ich denn jetzt ein Element aus dem Stack wieder in
ein 2dimensionales Array zurück?

Du musst den Zeiger aus dem Stack in was brauchbares casten, also irgendwas wie zB

char \*\*ret = (char\*\*)foo.top();

Irgendwie finde ich mehrdimensionale Arrays in C++ nicht
gerade intuitiv :frowning:.

Mehrdimensionale Arrays waren nie intuitiv… Ich habe das immer so gemacht, dass ich eindimensionale Arrays mit Indexfunktionen adressiert habe (allerdings waren die Arrays normalerweise größer als 2x2).

const int array\_breite = 2;
const int array\_hoehe = 2;

inline int array\_address( int zeile, int spalte ) {
 return zeile\*breite+spalte;
}

Viel anders sieht der generierte Code für den Zugriff auf ein mehrdimensionales Array auch nicht aus.

Zugriff sieht dann zB so aus:

char a[array\_breite\*array\_hoehe];

// ...

char val = a[array\_address(0,1)];

Wenn man das Array gleich komplett in einer Klasse kapselt und den ()-Operator als Indexfunktion benutzt bekommt man durchaus flotten und gut lesbaren Code und muss sich nur noch an wenigen Stellen mit einer einzigen Zeiger-Ebene rumschlagen. Das macht Sachen wie Initialisierung und Speicherverwaltung um Längen einfacher.