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 (n
    x-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 Probleme 😞

    OK, 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 mit

    int** 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() */
    }
    
    [
    

Anmelden zum Antworten