Problem mit Matrix
-
Hallo, wie kann ich einer Funktion eine Matrix mit beliebiger Größer übergeben?
Fehlermeldungen:
[C++ Fehler] Unit1.cpp(4): E2453 Größe des Typs 'int[]' unbekannt oder Null
[C++ Fehler] Unit1.cpp(17): E2313 Konstantenausdruck erforderlich
[C++ Fehler] Unit1.cpp(17): E2313 Konstantenausdruck erforderlich
[C++ Fehler] Unit1.cpp(25): E2453 Größe des Typs 'int[]' unbekannt oder Null
[C++ Fehler] Unit1.cpp(27): E2453 Größe des Typs 'int[]' unbekannt oder Null#include <iostream> using namespace std; void mat ( int matrix[] [] ); int main() { int zeilen; int spalten; cout<<"Matrix Zeilen Anzahl "; cin>>zeilen; cout<<"Matrix Spalten Anzahl: "; cin>>spalten; int matrix[ zeilen ][ spalten]; mat ( matrix ); return 0; } void mat ( int matrix[][] ) { matrix[0][0]=1; }Wenn ich die Größen vorher festlege dann funktioniert alles:
#include <iostream> using namespace std; void mat ( int matrix[2] [2] ); int main() { const zeilen=2; const spalten=2; int matrix[ zeilen ][ spalten]; mat ( matrix ); system("PAUSE"); return 0; } void mat ( int matrix[2][2] ) { matrix[0][0]=1; }Oder kann man das nicht dynamisch machen?
-
Garnicht. Für bessere Lösungen guckst du hier Dynamische Matrix
-
m_a_t schrieb:
Oder kann man das nicht dynamisch machen?
Nein. Zumindest nicht so. Die Funktion kann nicht wissen, was sie später übergeben bekommt und das Array trägt keine Größeninformation über sich selbst. Daher kann der Compiler in der Funktion keinen korrekten Code erzeugen, wenn er ausrechnen soll, an welcher Stelle ein Element relativ zur Anfangsposition des Arrays ist.
Alternativen:
- Eine Lösung über Doppelzeiger. Sehr C-ig und sehr frickelig.
- Eine Lösung mit verschachtelten std::vector-en. Dies kann mehr als die Lösung die du derzeit anstrebst und ist daher ein bisschen langsamer.
- Nimm ein eindimensionales Array/Vector und rechne den Index selber aus. Eine gute Lösung, aber etwas umkonfortabel
- Die obige Lösung, mit einem Komfortwrapper drum.

- Mach die Größe der inneren Dimension einen Templateparameter. Mit std::array lässt sich dass sogar einigermaßen lecker hinschreiben.
-
Da man extrem selten wirklich dynamische Matrizen braucht, hier die einfache Lösung mit Templates, die SeppJ erwähnt hat (ohne std::array):
#include <iostream> using namespace std; template<size_t n, size_t m, typename c> void test(c (&mat_)[n][m]) { cout << typeid(mat_).name() << endl; } int main() { double m[4][3]; test(m); // Gibt hier double[4][3] aus. }