Hilfe bei Matrixmultiplikation in C als Funktion



  • int **
    

    wäre dann aber der falsche Datentyp!



  • Achso, ich habe 2 Teilaufgaben, die ich lösen muss.
    Zum ersten: Die Funktion soll ohne Pointerarithmetik umgesetzt werden.
    Zum zweiten: Die Funktion soll mittels Pointerarithmetik umgesetzt werden.

    Ich glaube, den Ansatz, den ihr mir geliefert habt, ist der Ansatz mit Pointerarithmetik, oder?

    Für Teilaufgabe eins habe ich als Ansatz etwas.



  • Okay, ich habe es jetzt so weit auseinanderklamüsert.

    int multiplikation(int matrix1[10][10],int matrix2[10][10]){
    	for (h1 = 0; h1 < a1; h1++){
    				for (h2 = 0; h2 < b2; h2++){
    					for (h3 = 0; h3 < b1; h3++){
    						Summe = Summe + matrix1[h1][h3]*matrix2[h3][h2];
    					}
    				ergebnis[h1][h2] = Summe;
    				Summe = 0;
    				}
    			}
    			for (h1 = 0; h1 < a1; h1++) {
    				for (h2 = 0; h2 < b2; h2++){
    					printf("%i\t", ergebnis[h1][h2]);
    				      }
    				printf("\n");
    				}
    	return 0;
    }
    
    int main(void){
    	printf("Zeilen der ersten Matrix angeben:");
    	scanf("%i",&a1);
    	printf("Spalten der ersten Matrix angeben:");
    	scanf("%i",&a2);
    	printf("Zeilen der zweiten Matrix angeben:");
    	scanf("%i",&b1);
    	printf("Spalten der zweiten Matrix angeben:");
    	scanf("%i",&b2);
    	if (a2!=b1){
    		printf("Die Matrizen k�nnen nicht multipliziert werden");
    	}
    return 0;
    }
    

    Wie muss ich in der Hauptfunktion jetzt die multiplikation aufrufen?
    Vielen Dank schonmal



  • Das compiliert doch an allen Stellen nicht. Du musst alle Variablen die du verwendest auch vorher definieren!

    In der main Funktion erstellt du die zwei Matrizen matrix1 und matrix2,
    dann lässt du den Benutzer wie in deinem ersten Code die Werte eingeben und
    rufst so die Funktion auf:

    multiplikation(matrix1, matrix2);
    


  • Sorry, habe vergessen, die Variablen mitzukopieren. Diese sind global festgelegt.
    Nochmal das ganze :

    #include <stdio.h>
    #include <stdlib.h>
    int a1,a2,b1,b2,h1,h2,h3,Summe;
    int matrix1[10][10], matrix2[10][10], ergebnis[10][10];
    
    int multiplikation(int matrix1[10][10],int matrix2[10][10]){
    	for (h1 = 0; h1 < a1; h1++){
    				for (h2 = 0; h2 < b2; h2++){
    					for (h3 = 0; h3 < b1; h3++){
    						Summe = Summe + matrix1[h1][h3]*matrix2[h3][h2];
    					}
    				ergebnis[h1][h2] = Summe;
    				Summe = 0;
    				}
    			}
    			for (h1 = 0; h1 < a1; h1++) {
    				for (h2 = 0; h2 < b2; h2++){
    					printf("%i\t", ergebnis[h1][h2]);
    				      }
    				printf("\n");
    				}
    	return ergebnis;
    }
    
    int main(void){
    	printf("Zeilen der ersten Matrix angeben:");
    	scanf("%i",&a1);
    	printf("Spalten der ersten Matrix angeben:");
    	scanf("%i",&a2);
    	printf("Zeilen der zweiten Matrix angeben:");
    	scanf("%i",&b1);
    	printf("Spalten der zweiten Matrix angeben:");
    	scanf("%i",&b2);
    	if (a2!=b1){
    		printf("Die Matrizen k�nnen nicht multipliziert werden");
    	}
    	multiplikation(matrix1, matrix2);
    return 0;
    }
    

    Jetzt hat er aber Probleme bei "return ergebnis;" in der Nebenfunktion.



  • Oh mann, habe beim kopieren nur was vergessen.
    Alles gut, er meckert gar nicht mehr.
    Hier der fertige Code:

    #include <stdio.h>
    #include <stdlib.h>
    int a1,a2,b1,b2,h1,h2,h3,Summe;
    int matrix1[10][10], matrix2[10][10], ergebnis[10][10];
    
    int multiplikation(int matrix1[10][10],int matrix2[10][10]){
    	printf("Elemente der ersten Matrix eingeben(v.l.n.r.)");
    			for (h1 = 0; h1 < a1; h1++){
    			    for (h2 = 0; h2 < a2; h2++){
    			    	scanf("%i", &matrix1[h1][h2]);
    			    }
    			}
    			printf("Elemente der zweiten Matrix eingeben(v.l.n.r.)");
    			for (h1 = 0; h1 < b1; h1++){
    				for (h2 = 0; h2 < b2; h2++){
    					scanf("%i", &matrix2[h1][h2]);
    				}
    			}
    	for (h1 = 0; h1 < a1; h1++){
    				for (h2 = 0; h2 < b2; h2++){
    					for (h3 = 0; h3 < b1; h3++){
    						Summe = Summe + matrix1[h1][h3]*matrix2[h3][h2];
    					}
    				ergebnis[h1][h2] = Summe;
    				Summe = 0;
    				}
    			}
    			for (h1 = 0; h1 < a1; h1++) {
    				for (h2 = 0; h2 < b2; h2++){
    					printf("%i\t", ergebnis[h1][h2]);
    				      }
    				printf("\n");
    				}
    	return 0;
    }
    
    int main(void){
    	printf("Zeilen der ersten Matrix angeben:");
    	scanf("%i",&a1);
    	printf("Spalten der ersten Matrix angeben:");
    	scanf("%i",&a2);
    	printf("Zeilen der zweiten Matrix angeben:");
    	scanf("%i",&b1);
    	printf("Spalten der zweiten Matrix angeben:");
    	scanf("%i",&b2);
    	if (a2!=b1){
    		printf("Die Matrizen k�nnen nicht multipliziert werden");
    	}
    	multiplikation(matrix1, matrix2);
    return 0;
    }
    

    Vielen Dank für eure Hilfe, wieder was gelernt : )



  • Ergebnis ist ein Array und die Funktion ist vom Typ int, das passt nicht.
    Ausserdem musst du nichts returnen weil du die Bildschirmausgabe schon in der Funktion erledigst.
    Das macht in deinem Fall sowieso keinen sinn weil die Variablen (wieso auch immer) global sind und deshalb von überall darauf zugegriffen werden kann.

    int h1,h2,h3,Summe;
    int ergebnis[10][10];
    

    Gehören in die Funktion und

    int matrix1[10][10], matrix2[10][10];
    

    in die main().

    Dann musst du noch in der main() die Werte vom Benutzer einlesen.
    Wenn du es so machst wie jetzt ziehst du aus der Funktion keinen praktische Nutzen,
    die Benutzer ein- und ausgabe sollte in der main erfolgen.



  • Allerdings kennt die main Funktion ja die Variablen h1.. etc nicht, was die Eingabe in dieser Form, also mit den bisherigen for-Schleifen, nicht möglich macht.
    Dasselbe mit den a1 a2 etc in der Nebenfunktion.
    Deine Kritik ist natürlich super sinnvoll, mich ärgert nur gerade dass ich ziemlichen Mist fabriziert hab.
    Aber dann bräuchte ich doch quasi die doppelte Anzahl von Variablen, oder?



  • Broetchen93 schrieb:

    Allerdings kennt die main Funktion ja die Variablen h1.. etc nicht, was die Eingabe in dieser Form, also mit den bisherigen for-Schleifen, nicht möglich macht.
    Dasselbe mit den a1 a2 etc in der Nebenfunktion.
    Deine Kritik ist natürlich super sinnvoll, mich ärgert nur gerade dass ich ziemlichen Mist fabriziert hab.
    Aber dann bräuchte ich doch quasi die doppelte Anzahl von Variablen, oder?

    Du kannst der Funktion einfach noch weitere Parameter übergeben.
    Statt h1, h2, h3, a1, a2, b1, b2 wäre es einfacher h[3], a[2] und b[2] zu übergeben.



  • Da du wieder ein Array aus der Funktion zurück haben willst und dies in C so nicht möglich ist, übergibt man das Array mit an die Funktion.
    Zudem muss di Funktion noch die Dimensionen der Matrizen wissen.

    int multiplikation(int ergebnis[10][10], int matrix1[10][10],int matrix2[10][10], int b1, int h1, int b2, int h2){
    ....
    

    Dann gehören auch

    int h1,h2,h3,b.....;
    int ergebnis[10][10];
    

    noch mit in main .

    Genauso kannst du eine Funktion

    int matrix_eingabe(int matrix[10][10], int b, int h, char text[]){
      printf("Elemente der %s Matrix eingeben(v.l.n.r.)", text);
    ....
    

    für die Eingabe machen

    Aufruf ist einfach:

    matrix_eingabe(matrix1, b1, h1, "1.");
    matrix_eingabe(matrix2, b2, h2, "2.");
    


  • DirkB schrieb:

    Da du wieder ein Array aus der Funktion zurück haben willst und dies in C so nicht möglich ist

    Oder man definiert es in der Funktion als static und gibt die Adresse zurück.


  • Mod

    Bitmapper schrieb:

    DirkB schrieb:

    Da du wieder ein Array aus der Funktion zurück haben willst und dies in C so nicht möglich ist

    Oder man definiert es in der Funktion als static und gibt die Adresse zurück.

    😮

    Bloß nicht Zuhause nachmachen!



  • So, ich habe teil a jetzt fertig!
    Jetzt hab ich heute keine Lust mehr auf Teil B, wo ich Zugriff und durchführung der Rechnung mit Pointerarithmetik umsetzen muss.
    Das kommt dann frühestens morgen.

    Ich bedanke mich vielmals für eure Hilfe, auf jeden Fall habe ich die Geschichte mit den Funktionen verstanden.
    Programmieren ist halt echt wie ne eigene Sprache



  • Hallo nochmal, bin gerade bei Aufgabenteil b, bei dem ich nun Zuweisung und Multiplikation per Pointerarithmetik umsetzen soll.
    Hier erstmal mein fertiges Programm aus Teilaufgabe a:

    #include <stdio.h>
    #include <stdlib.h>
    
    int multiplikation(int matrix1[10][10],int matrix2[10][10],int a1, int b1, int b2){
    	int h1,h2,h3,Summe=0;
    	int ergebnis[10][10];
    	for (h1 = 0; h1 < a1; h1++){
    				for (h2 = 0; h2 < b2; h2++){
    					for (h3 = 0; h3 < b1; h3++){
    						Summe = Summe + matrix1[h1][h3]*matrix2[h3][h2];
    					}
    				ergebnis[h1][h2] = Summe;
    				Summe = 0;
    				}
    			}
    			for (h1 = 0; h1 < a1; h1++) {
    				for (h2 = 0; h2 < b2; h2++){
    					printf("%i\t", ergebnis[h1][h2]);
    				      }
    				printf("\n");
    				}
    	return 0;
    }
    
    int main(void){
    	int a1,a2,b1,b2;
    	int h1,h2;
    	int matrix1[10][10], matrix2[10][10];
    	printf("Zeilen der ersten Matrix angeben:");
    	scanf("%i",&a1);
    	printf("Spalten der ersten Matrix angeben:");
    	scanf("%i",&a2);
    	printf("Zeilen der zweiten Matrix angeben:");
    	scanf("%i",&b1);
    	printf("Spalten der zweiten Matrix angeben:");
    	scanf("%i",&b2);
    	if (a2!=b1){
    		printf("Die Matrizen k�nnen nicht multipliziert werden!\n");
    	}
    	printf("Elemente der ersten Matrix eingeben(v.l.n.r.)");
    				for (h1 = 0; h1 < a1; h1++){
    				    for (h2 = 0; h2 < a2; h2++){
    				    	scanf("%i", &matrix1[h1][h2]);
    				    }
    				}
    				printf("Elemente der zweiten Matrix eingeben(v.l.n.r.)");
    				for (h1 = 0; h1 < b1; h1++){
    					for (h2 = 0; h2 < b2; h2++){
    						scanf("%i", &matrix2[h1][h2]);
    					}
    				}
    	multiplikation(matrix1, matrix2,a1,b1,b2);
    return 0;
    }
    

    Nun das, was ich bereits für Teilaufgabe b abgeändert habe:

    #include <stdio.h>
    #include <stdlib.h>
    
    int *multiplikation(int *matrix1,int *matrix2,int *a1, int *b1, int *b2){
    	int *h1,*h2,*h3,*Summe;
    	int *ergebnis;
    	for (h1 = 0; h1 < a1; h1++){
    				for (h2 = 0; h2 < b2; h2++){
    					for (h3 = 0; h3 < b1; h3++){
    						*Summe = *Summe + *matrix1**matrix2;
    					}
    				*ergebnis = *Summe;
    				Summe = 0;
    				}
    			}
    			for (h1 = 0; h1 < a1; h1++) {
    				for (h2 = 0; h2 < b2; h2++){
    					printf("%i\t", *ergebnis);
    				      }
    				printf("\n");
    				}
    	return 0;
    }
    
    int main(void){
    	int a1,a2,b1,b2;
    	int h1,h2;
    	int matrix1[10][10], matrix2[10][10];
    	printf("Zeilen der ersten Matrix angeben:");
    	scanf("%i",&a1);
    	printf("Spalten der ersten Matrix angeben:");
    	scanf("%i",&a2);
    	printf("Zeilen der zweiten Matrix angeben:");
    	scanf("%i",&b1);
    	printf("Spalten der zweiten Matrix angeben:");
    	scanf("%i",&b2);
    	if (a2!=b1){
    		printf("Die Matrizen k�nnen nicht multipliziert werden!\n");
    	}
    	printf("Elemente der ersten Matrix eingeben(v.l.n.r.)");
    				for (h1 = 0; h1 < a1; h1++){
    				    for (h2 = 0; h2 < a2; h2++){
    				    	scanf("%i", &matrix1[h1][h2]);
    				    }
    				}
    				printf("Elemente der zweiten Matrix eingeben(v.l.n.r.)");
    				for (h1 = 0; h1 < b1; h1++){
    					for (h2 = 0; h2 < b2; h2++){
    						scanf("%i", &matrix2[h1][h2]);
    					}
    				}
    	multiplikation(*matrix1, *matrix2,*a1,*b1,*b2);
    return 0;
    }
    

    In Zeile 54 kommt nun die Fehlermeldung: "Ungültiger Argumenttyp in unärem >*<(haben int)

    Aber ich habe doch nur Pointer, die auf eine Variable mit dem Typ int zeigen.



  • Nein hast du nicht. a1 etc sind doch ints.



  • Das heisst, ich muss quasi für jede Variable noch zusätzlich Pointervariablen festlegen?



  • Broetchen93 schrieb:

    Das heisst, ich muss quasi für jede Variable noch zusätzlich Pointervariablen festlegen?

    Für Die Dimension nicht, die kannst du auch weiter als int benutzen.

    Zudem ist die Multiplikation ziemlich sinnfrei, wenn du das Ergebnis nicht aus der Funktion raus bekommst.

    Mit matrix1[h1][h3] greifst du auf die verschiedenen Elemente der Arrays zu.

    Wie machst du das in deiner Pointerversion?
    (Füge ruhig mal ein paar printf in die Schleife ein, und gib ein paar Variablen aus.



  • Zudem ist die Multiplikation ziemlich sinnfrei, wenn du das Ergebnis nicht aus der Funktion raus bekommst.

    Hast du recht, aber ich schaffe es anders nicht. Funktionieren tut es ja.
    Also für die Matrizen muss ich dann Pointer festlegen, die auf die Adresse der Matrize zeigen? z.b. sowas wie int *pM1[10] [10] ?
    Aber dann muss man den Pointer doch auch noch zusätzlich irgendwie hochzählen, oder? Und woher weiss der Pointer, dass er auf Matrix1 zeigen soll und nicht auf Matrix2?



  • Win 2D-Array ist ein zusammenhängender Speicherbereich, bei dem der ganze rechte Index am schnellsten wechselt.

    Wenn du ein 2D-Array hast (int matrix[ZEILEN][SPALTEN]), dann kannst du auf die Elemente über einen Zeiger (*int zeigeraufint) zugreifen, der auf den Anfang vom Speicher zeigt.
    Dazu musst du wissen, wieviel Spalten das Array hat:

    matrix[z][s] ist dabei äquvalent zu *(zeigeraufint + z * SPALTEN + s)



  • Okay, vielen Dank für eure Hilfestellungen, aber ich checks gerade gar nicht.
    Das, was ich davor gemacht habe, war auch nur Stückwerk, weil ich einfach überall nen Pointersymbol vorgeschrieben habe.
    Ich versuchs jetzt mal ganz von vorne, vielleicht kommt ja was dabei heraus.


Anmelden zum Antworten