Übergabe von Matrizen variabler Größe an Funktionen
-
Hallo,
dieses einfache Programm repräsentiert das Problem, das ich habe. Wie man hoffentlich schnell sieht, geht es einfach um das zufällige Erstellen einer 4x4-Matrix.#include<cstdlib> #include<ctime> using namespace std; void generate(int* matrix, int m, int n) { srand(time(0)); for(int i=0; i<m; i++) for(int j=0; j<n; j++) matrix[m][n] = rand()%10; } int main() { int matrix[4][4]; generate(matrix, 4, 4); }
Und ich weiß mir leider nicht zu helfen, wie ich das umändern muss, damit es funktioniert. Wenn sich da jemand auskennt und mir hilft, danke.
mfG,
Matthias
-
AFAIK musst du das so machen:
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; // Soweit ich weiss muessen alle Dimensionen (außer die erste) bei der // Definition des Vektors bekannt sein. Deswegen mache ich aus der Matrix // einen 1-Dimensionalen Vektor. // Ein Vektor mit den Dimensionen v[m][n] ist das kleiche wie ein // Vektor v[m * n] void generate(int matrix[], int m, int n) { srand(time(0)); for(unsigned int i = 0; i < m * n; ++i) matrix[i] = rand() % 10; // i verwenden ;-) } int main() { int matrix[4][4]; generate(&matrix[0][0], 4, 4); // Adresse des ersten Vektorelements übergeben return 0; }
Keine Garantie auf Richtigkeit
(Kann auch anders gehen, bzw. kann auch falsch sein - habe ich noch nie benötigt)
Caipi
-
Ich denke, du musst nur
void generate(int* matrix, int m, int n)
in das abändern
void generate(int** matrix, int m, int n)
Es handelt sich ja um ein 2dimensionales Feld drum brauchst du Doppelpointer.
Sollte dann eigentlich gehen.
-
Das Funktioniert??. Wenn ja, dann zeig/erklär das mir mal bitte ein wenig genauer. Würd mich echt interessieren
Caipi
-
Nach meinem Verständnis müsste hier Caipis Lösung richtig sein, da der Compiler das auf eine eindimensionale Matrix mappt. Die foo** sind eine in der C-Welt üble Lösung für das Problem, dass alle bis auf die erste Dimension bekannt sein müssen.
Man macht einfach ein Array von Arrays, auf das dan mit Arraysyntax zugegriffen werden kann.
In c++ ist aber vector<vector<foo> > üblicher, glaube ich...
-
ness hat Recht. Caipis Lösung geht unter C++ selbstverständlich.
ich war einfach zu lange auf C-Ebene unterwegs.
Da schleifen sich einfach ein paar Schreibweisen ein, die unter C++ nicht mehr nötig sind.
Aber um die Funktion von Matthias mit geringstem Änderungsaufwand zum laufen zu bringen muss man eben die unschönen Doppelpointer verwenden.