Array als Rückgabewert einer Funktion!?
-
Hallo!!!
Meine Aufgabe ist es eine 8x8 Matrix zu berechnen und das mit 4 Prozessen. OK darum geht es mir nun aber gar nicht
Zur Veranschaulichung hier mein Code:#include <stdio.h> #include <stdlib.h> #define N 8 int matrix1[N][N]; int matrix2[N][N]; long int ergebnisMatrix[N][N]; int i; int j; //Berechnung einer 8x8 Matrix durch 4 Prozesse void main () { //Matrix1 mit Zufallszahlen füllen for (i=0; i<N; i++) { for (j=0; j<N; j++){ matrix1[i][j]=(rand()%9)+1; } } //Matrix2 mit Zufallszahlen füllen for (i=0; i<N; i++) { for (j=0; j<N; j++){ matrix2[i][j]=(rand()%9)+1; } } //Ergebismatrix ausrechnen ergebnisMatrix = multiply(matrix1, matrix2); return; }//main int[] getZeile(int m[N][N], int n) { int temp[N]; for (i=0; i<N; i++) temp[i] = m[n][i]; return temp; }//getZeile int[] getSpalte(int m[N][N], int n) { int temp[N]; for (i=0; i<N; i++) temp[i] = m[i][n]; return temp; }//getSpalte int Skalarprodukt(int a[N], int b[N]) { int s=0; for (i=0; i<N; i++) s=s+a[i]*b[i]; return s; }//Skalarprodukt //Berechnung der Ergebnismatrix durch die 4 Prozesse int[][] multiply(int m1[N][N], int m2[N][N]) { int resultmatrix[N][N]; int processNr[4]; int myID; //ersten Prozess erzeugen processNr[1]=fork(); myID = getPID(); //zweiten Prozess erzeugen if (myID==0) {processNr[2]=fork();} myID = getPID(); //dritten Prozess erzeugen if (myID==0) {processNr[3]=fork();} myID = getPID(); //vierten Prozess erzeugen if (myID==0) {processNr[4]=fork();} if (myID !=0){ for (j=0; i<(N/4); j++){ for (i=0; i<N; i++){ resultmatrix[i][j+(myID-1)*2]=skalarprodukt(getZeile(m1, i),getSpalte(m2, j)); }//for i }//for j }//if return resultmatrix; }//multiply
So nun hab ich das Problem, dass mein Compiler ständig wegen meiner Rückgabewerte jammert. Z.B. bei multiply. Obwohl ich beides gleich deklariert hab, ist für den Compiler die resultmatrix ein fehlerhafter Rückgabewert.
Kann mir evtl jemand helfen? Wie muss ich den Rückgabewert richtig deklarieren.
Schon mal vielen Dank. Gruß Paule!!!
-
ware diese Art der Deklaration nicht die richtige
int** multiply(int **m1, int **m2, int N)
oder
int *multiply(int *m1, int m2, int N)
Wenn man es alsw linearen Vektor auffasst ist der Zugriff etwas komlizierter weil man die
Position im Vektor von Hand als (nx-Achse + y) errechnen muss
-
könnte vielleicht die möglichkeit bestehen, dass du von den prozessen ohne IPC nichts mehr zurückbekommst? einfach return bringt nichts
-
Du lieferst nen Zeiger zurück auf ein lokales Array, was soll das bringen?
-
Hallo,
warum legst Du nicht die Matrix mit malloc() auf dem Heap an und lieferst den Pointer zurück?
Unschön wäre dann zwar, daß Du den free() außerhalb der Funktion durchführen müßtest, aber zumindest für so ein kleines Progrämmlein wäre das ein probates Vorgehen.
-
hi
vielleicht kannste den array in ner structur verpacken dann kannst es leicht zurueckliefern...
-
Hallo,
schon mal danke für die Antworten. Also mit einigen Begriffen kann ich hier leider nicht so viel anfangen. Muss dazu sagen, dass ich gerade erst anfange C zu lernen, komme mehr so aus der Java Ecke.
Mit der Syntax von C hab ich halt noch so meine ProblemeOK, das mit den Prozessen ist im Moment noch gar nicht so wichtig, mir gehts erstmal darum, dass die Funktionen syntaktisch richtig geschrieben sind. Und genau dabei komme ich einfach nicht weiter.
Habe schon die Variante mitint** multiply(int **m1, int **m2, int N)
versucht, jedoch meckert der Compiler da auch wegen dem Rückgabetyp.
Könnte mir vielleicht jemand mal ne einfache Funktion als Beispiel posten, in der ein Array als Rückgabewert auftritt?
Vielleicht hilft mir das ja weiter.
Vielen Dank Paule!!!
-
int *gimme(int len) { return (int*)malloc(sizeof(int) * len); } int main() { int *foobar; foobar = gimme(100); free(foobar); /* ganz wichtig. zu jedem malloc() ein free() */ } [