Array als Funktionsrückgabe
-
Hi
Scheint ein einfaches Problem zu sein, aber ich hab den Dreh noch nicht so ganz raus. Ich bin Anfänger in C und wir beschäftigen uns mit Matrizenaddition.
Im speziellen Fall ist die Matrix kein mehrdimensionales Array, sondern eindimensional, um das alles etwas zu erleichtern nehme ich an.
Mein Code sieht in etwa so aus:
In der readMatFile Funktion wird die Matrix aus einer Textdatei eingelesen.
matA = (int*) malloc(size*sizeof(int)); matB = (int*) malloc(size*sizeof(int)); matNew = (int*) malloc(size*sizeof(int)); int i = 0; while (fgets(line, 16, matFile) != NULL && (i < 2*size)) { if (i < size) matA[i] = atoi(line); else matB[i - size] = atoi(line); i++; } fclose(matFile);
In dieser Funktion lasse ich mir die Matrix ausgeben:
void printMatrix(int size, int matr[]) { int i, s; s = size*size; for (i=0; i<s; i++) { printf("%d\n", matr[i]); } }
(Die Funktion ist ebenfalls deklariert)
Hier findet nun die Addition statt:
int *addMatrix(int size, int matA[], int matB[], int *matResult[]) { int i, j, k; int s = size*size; for (i=0; i<size; i++) { for (j=0; j<size; j++) { for (k=0; k<size; k++) { matResult[(i * size) + j] += matA[(i * size) + k] + matB[(k * size) + j]; } } } return (int*) matResult; }
(Die Funktion ist ebenfalls deklariert)
Der Programmablauf in der Main sieht nun so aus:
... readMatrixFromFile(argv[1]); printf("Size: %d\n====\n", matrixsize); printMatrix(matrixsize, matA); printf("\n====\n\n"); matNew = addMatrix(matrixsize, matA, matB, matNew); printMatrix(matrixsize, matNew);
matrixsize wird korrekt erkannt, das berechne ich anhand der Zahl, die mir in den Dateien übergeben wird. Bei einer 4x4 Matrix steht in der ersten Zeile z.B. die 4. Wir sollen nur von quadratischen Matrixen ausgehen, also AxA.
Das Problem:
Nach dem Funktionsaufruf addMatrix, der (scheinbar) problemlos durchläuft, scheitert das Programm beim ersten Zugriff auf das ArrayElement[0] mit einem Segmentation Fault.
Das erste Mal bekomme ich die MatA korrekt ausgegeben, die addMatrix Funktion scheint (auch laut gdb und stepper) durchzulaufen, bis primtMatrix eben versucht die Ergebnismatrix ebenfalls auszugeben, mit o.g. Fehler.Ich habe schon versucht nur mit Referenzen (ohne Rückgabe) der addMatrix das Array zu befüllen, mal nur mit der Rückgabe, auch den Parameter der NewMatrix als Referenz, also "&NewMatrix" zu übergeben, kein Erfolg.
Wo liegt das Problem? Wie kann ich die Matrix korrekt addieren und danach zurückgeben ohne dass es zu Fehlern kommt?
Gruß d.
-
Wenn du mit eindimensionalen Matrizen rechnen willst, musst du sie auch so verwenden, d.h. deine addMatrix-Funktion ist falsch deklariert:
int *addMatrix(int size, int *matA, int *matB, int *matResult)
matResult[(i * size) + j] += matA[(i * size) + k] + matB[(k * size) + j];
hier muss es natürlich = und nicht += heißen. Kennst du den Unterschied?
Außerdem sind deine Speicherbereiche zu gering dimensioniert/allokiert, sie sollten size*size Elementen Platz bieten und nicht size.
-
Müsste addMatrix nicht folgendermaßen definiert sein:
int *addMatrix(int size, int matA[], int matB[], int matResult[]);
Also matResult als Array (ohne * oder ohne []).
Zudem können Matrizen addiert werden, wenn sie vom selben Typ sind (also gleichgroß)
Daher kann man eine einfach Schleife nehmen:
int i, s; s = size*size; for (i=0; i<s; i++) { matResult[i] = matA[i]+ matB[i]; }
Das i,j,k wird bei der Multiplikation gebraucht.