Übergabe von Feldern
-
Ich habe versucht ein Programm zu schreiben das Matritzen multipliziert. Im Endeffekt ist dies aber nebensächlich da ich ein Grundlegendes Problem habe. Die Übergabe von Array bzw. Feldern.
Als erstes der Funktionsaufruf meine Funktion die rechnen soll.
Was ist daran falsch?matrix3[][] = multmatrix(matrix1[][], matrix2[][]);
Hier die Funktion selbst:
Was ist daran falsch?double multmatrix(double m1[][], double m2[][]) { double m3[3][3]; //Diese MAtrix wird zurückgegeben int i,j,k; //Schleifenvariablen //hier wird ganz viel gerechnet...... return m3[][]; }
Mal danke im Voraus für die Hilfe
------------------------------------------------------------------------Zum Schluss nochmal das ganze Programm bis jetzt...
#include <stdio.h> double multmatrix(double m1[][], double m2[][]) { double m3[3][3]; //Return Matrix int i,j,k; //Schleifenvariablen while (i<3) { j=0; while (j<3) { k=0; m3[i][j]=0; while (k<3) { m3[i][j]=m3[i][j]+(m1[i][k]*m2[k][j]); /*Ausgabe der Feldelemente*/ printf("\ni:%d j:%d k:%d m3:%.4f m1:%.4f m2:%.4f",i,j,k,m3[i][j],m1[i][k],m2[k][j]); k++; } j++; } i++; } return m3[][]; } void main() { double matrix1[3][3]; //erste Matrix double matrix2[3][3]; //zweite Matrix double matrix3[3][3]; //Ergebnis Matrix int i, j; //Schleifenvariablen printf("\nGeben Sie bitte die 3*3 Elemente der 1. Matrix ein: "); for(i=0; i<3; i++){ scanf("%lf %lf %lf", &matrix1[i][1], &matrix1[i][2], &matrix1[i][3]); } printf("\nGeben Sie bitte die 3*3 Elemente der 2. Matrix ein: "); for(i=0; i<3; i++){ scanf("%lf %lf %lf", &matrix2[i][1], &matrix2[i][2], &matrix2[i][3]); } matrix3[][] = multmatrix(matrix1[][], matrix2[][]); printf("\n\nErgebnismatrix ist: "); for(i=0; i<3; i++) { for(j=0; j<3; j++) { printf("%5.2lf ", matrix3[i][j]); } printf("\n"); } }
-
hmm.. würde ich so ähnlich machen:
void multmatrix(const double m1[3][3], const double m2[3][3],double result[3][3]) { int i=0,j=0,k=0; //Schleifenvariablen while (i<3) { j=0; while (j<3) { k=0; result[i][j]=0; while (k<3) { result[i][j]=result[i][j]+(m1[i][k]*m2[k][j]); /*Ausgabe der Feldelemente*/ printf("\ni:%d j:%d k:%d m3:%.4f m1:%.4f m2:%.4f",i,j,k,result[i][j],m1[i][k],m2[k][j]); k++; } j++; } i++; } }
-
@CMatt
Bist du dir sicher, dass das so dann funktioniert, wie es sollte?Ich würde es eher so machen:
double **multmatrix(const double **matrix1, const double **matrix2); //oder void multmatrix(const double **matrix1, const double **matrix2, double **ergebnis); //das sollte auch kein Problem geben void multmatrix(const double matrix1[][], const double matrix2[][], double ergebnis[][]);
-
double **multmatrix(const double **matrix1, const double **matrix2);
aber dann bitte kein:
double* bla() { dobule f[3][3]; ... return f; }
wie oben
-
Also, der Aufruf muss dann schonmal anders lauten, denn der Name eines Arrays (in deinem Fall also matrix1 und matrix2) ist bereits ein (konstanter!) Zeiger auf das Array.
Arrays als Rückgabewerte sind schwierig zu handhaben. Du musst entweder deine Ergebnismatrix bereits vor dem Funktionsaufruf mit
double ergebnismatrix[3][3];
angelegt haben oder in deiner Funktion mit
malloc()
anlegen. In letzterem Fall solltest Du hinterher auf jeden Fall auch den angeforderten Speicher mit
free()
wieder freigeben.
Die Funktion würde ich dann so schreiben:void mmult(const double matrix1[][3], const double matrix2[][3], double ergmatrix[][3]) { int i, j, k; for (i = 0;i < 3;i++) { for (j = 0;j < 3;j++) { ergmatrix[i][j] = 0.0; for (k = 0;k < 3;k++) { ergmatrix[i][j] += matrix1[i][k] * matrix2[k][j]; } } } }
Funktioniert so, allerdings eben nur für 3x3-Matrizen
Alles andere muss man wohl dynamisch machen
-
CMatt schrieb:
double **multmatrix(const double **matrix1, const double **matrix2);
aber dann bitte kein:
double* bla() { dobule f[3][3]; ... return f; }
wie oben
Sicherlich nicht
-
Danke erstmal für die ganze Hilfe. Ich denk ich hab das einigermassen begriffen. Mit Zeigern hab ich mich bisher leider noch nicht auseinandersetzen können, aber ich seh das es ohne das Wissen nicht mehr geht.