Matrixmultiplikation
-
Hallo liebe Community, ich habe die Matrixmultiplikation in C inplementiert, bekomme aber immer denselben unverständlichen Fehler.
Code:
#include <iostream> #define size 1000 using namespace std; void matrixmult(int Ma[size][size], int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb); int main(int argc, char **argv) { int z = 1000; int z1 = 1000; int z2 = 1000; int m1[1000][1000]; int m2[1000][1000]; matrixmult(m1[1000][1000], m2[1000][1000], z, z1, z2); } void matrixmult(int Ma[size][size], int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb) { int Em[0][0]; for (int i = 0; i< zeilenmc; ++i) { for (int j = 0; j < zeilenmb; ++j) { for (int k = 0; k < spaltenmc; ++k) { Em[i][k] += Ma[i][j] * Mb[j][k]; } } } std::cout << Em[zeilenmc][spaltenmc] << endl; }Der Compilererror:
Quelle1.cpp:8:5: warning: second argument of ‘int main(int, char*)’ should be ‘char **’ [-Wmain]
int main(int argc, char argv)
^
Quelle1.cpp: In function ‘int main(int, char)’:
Quelle1.cpp:17:26: error: invalid conversion from ‘int’ to ‘int ()[1000]’ [-fpermissive]
matrixmult(m1[1000][1000], m2[1000][1000], z, z1, z2);
^
Quelle1.cpp:6:6: error: initializing argument 1 of ‘void matrixmult(int ()[1000], int ()[1000], int, int, int)’ [-fpermissive]
void matrixmult(int Ma[size][size], int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb);
^
Quelle1.cpp:17:42: error: invalid conversion from ‘int’ to ‘int ()[1000]’ [-fpermissive]
matrixmult(m1[1000][1000], m2[1000][1000], z, z1, z2);
^
Quelle1.cpp:6:6: error: initializing argument 2 of ‘void matrixmult(int ()[1000], int ()[1000], int, int, int)’ [-fpermissive]
void matrixmult(int Ma[size][size], int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb);Vielen Dank im Voraus
Count Omega
-
Dann überlege dir, was du dort übergeben willst und was du tatsächlich übergibst.
int Em[0][0];Was soll das sein?
-
Die Ergebnismatrix(mit 0 initialisiert).
-
[quote="manni66"]Dann überlege dir, was du dort übergeben willst und was du tatsächlich übergibst.
Ja ich übergebe 2 Matrizen m1 und m2.
-
mannis frage nach dem int Em[0][0] bezieht sich auf den Typ, nicht auf das, was du dir dabei denkst. Was soll das für eine Art Objekt sein, wie groß ist es? Ein Array der Länge 0?
Count_Omega schrieb:
Ja ich übergebe 2 Matrizen m1 und m2.
Nein, tust du nicht.
-
em soll ein leeres Feld vom Typ int sein.
Wie würde ich dann die Felder richtig übergeben?
-
Count_Omega schrieb:
em soll ein leeres Feld vom Typ int sein.
Wie groß ist das "Feld"?
Wie würde ich dann die Felder richtig übergeben?
manni66 schrieb:
Dann überlege dir, was du dort übergeben willst und was du tatsächlich übergibst.
-
Tut mir leid, ich verstehe nicht, was ihr meint. Em soll ein Feld Mit Größe 1000x1000 sein und nur Nullen beeinhalten(anfangs).
-
Und der Compiler soll die Größe automatisch erraten oder was?
Wenn int a[7] ein Feld der Länge 7 ist, warum soll int a[0] dann die Länge 1000 haben?
-
wie fülle ich dann int em[1000][1000] mit nullen?
-
Du könntest z.B. mal eine Suchmaschine deiner Wahl bemühen.
Da kommt das sowas raus wie https://de.wikibooks.org/wiki/C-Programmierung:_Arrays
-
Ok danke und was ist jetzt der Fehler bei der Übergabe?
-
#include <cstddef> //für den Datentyp 'size_t' #include <array> //für den Datentyp 'array' im Namensraum 'std' int main() { int b[10][12] = {0}; //jedes Element auf 0 setzen int c[10][12] = {6}; //erstes Element auf 6 setzen. int g[2][3] = { {1,2,3}, {4,5,6} }; //...oder jedes Einzeln. //statt auf rohe Arrays kann man auch auf 'std::array' setzen, was //unter anderem davor warnen kann, wenn ungültige //Indizes verwendet werden. std::array<int, 10> d1, d2; //2 Arrays mit jeweils 10 ints. std::array<std::array<int, 12>, 10> m; //Array von 10 Arrays mit jeweils 12 ints. //Bietet auch andere nette Sachen an, z.B. //lässt sich so ein std::array kopieren: d1 = d2; //funktioniert super. //b = c //funktioniert leider nicht... //mit einer Schleife initialisieren: for(size_t row = 0; row < 10; ++row) { for(size_t col = 0; col < 12; ++col) b[row][col] = 1; } //...oder: for(int (&row)[12] : b) //heißt: gehe jedes Element (=Array von 12 ints) durch und lass 'row' //dieses referenzieren (=Referenz auf Array von 12 ints). { for(int &cell : row) //gehe jedes Element durch (=ints) durch und lass 'cell' //dieses referenzieren (=Referenz auf int) cell = 2; //den int, den 'cell' referenziert, auf 2 setzen. } }Upsi, kam wohl etwas zu spät. Aber die std::array-Klasse ist ziemlich super.
-
Techel schrieb:
int c[10][12] = {6}; //jedes Element auf 6 setzen.Nein. Erstes Element (c[0][0]) auf 6, alle anderen auf 0 setzen.
-
Count_Omega schrieb:
Tut mir leid, ich verstehe nicht, was ihr meint. Em soll ein Feld Mit Größe 1000x1000 sein und nur Nullen beeinhalten(anfangs).
Jemandem, der nach nicht einmal 10 Minuten mit "verstehe ich nicht" kommt, ohne auch nur im Ansatz auf dei gestellten Fragen einzugehen, helfe ich nicht.
-
wob schrieb:
Techel schrieb:
int c[10][12] = {6}; //jedes Element auf 6 setzen.Nein. Erstes Element (c[0][0]) auf 6, alle anderen auf 0 setzen.
Da hast du recht, mein Fehler. Ist nun korrigiert.
-
He ich habe die Fragen beantwortet. Ich habe 3h vorher bereits zu meinem Fehler recherchiert und bin zu keinem ERgebnis gekommen. Nun wäre ich froh wenn mir jemand helfen würde.
-
Für 2D-Arrays siehe auch hier: https://www.c-plusplus.net/forum/39489-full
-
Sorry, aber was genau ist der Fehler bei der Übergabe(oder Nichtübergabe) der Arrays?
-
so wie du es machst, ist es falsch.
so ist es richtig: http://stackoverflow.com/questions/8767166/passing-a-2d-array-to-a-c-function
-
manni66 schrieb:
so wie du es machst, ist es falsch.
so ist es richtig: http://stackoverflow.com/questions/8767166/passing-a-2d-array-to-a-c-functionUnd schon wieder eine Schnapsnase mit geklautem Namen