Matrix, Array & Klasse
-
Hallo zusammen, ich musste hier eine Matrixklasse erstellen in der m x n Matrizen definiert werden können und jeweils Funktionen für Addition Skalarmuliplikation und Matrizenmultiplikation und habe eigentlich alles fertig,
verstehe allerdings nicht wieso das Programm mir folgenden Error auswirft:
"*** Error in `./main': double free or corruption (fasttop): 0x0000000002114010 ***"Hier mal mein Code:
main.cpp
#include <iostream> #include "Matrix.h" using namespace std; int main() { char c; int m,n,l; cout << " Was möchten Sie machen? " << endl; cout << " a) Addition s) Skalar m) Multi " << endl; cin >> c; switch(c){ case 'a':{ cout << "Größe der Matrix eingeben: " << endl; cin >> m; cin >> n; matrix a(m,n); cout << "Größe der zweiten Matrix eingeben: " << endl; cin >> m; cin >> n; matrix b(m,n); if( a(m,n) != b(m,n)){return 0;} cout << " Werte für Matrix a eingeben: " << endl; a.einlesen(a); cout << " Werte für Matrix b eingeben: " << endl; b.einlesen(b); matrix c(m,n); c.add(a,b,c); c.output(c); } case 's':{double s=0; cout << " Größe der Matrix eingeben: " << endl; cin >> m; cin >> n; matrix a(m,n); matrix c(m,n); cout << " Größe des Skalar eingeben: " << endl; cin >> s; cout << " Werte für Matrix a eingeben: " << endl; c.einlesen(a); c.smult(s,a,c); c.output(a); } case 'm':{cout << "Größe der Matrix eingeben: " << endl; cin >> m; cin >> n; matrix a(m,n); cout << "Größe der zweiten Matrix eingeben: " << endl; cin >> n; cin >> l; matrix b(m,n); if( a(m,n) != b(n,l)){return 0;} cout << " Werte für Matrix a eingeben: " << endl; a.einlesen(a); cout << " Werte für Matrix b eingeben: " << endl; b.einlesen(b); matrix c(m,l); c.mmult(a,b,c); c.output(c);} default: {break;} } }Matrix.cpp
#include "Matrix.h" #include <iostream> using namespace std; matrix::matrix(int m,int n) : m(m),n(n),a(new double[n*m]) {}; matrix::~matrix(){delete [] a;} // Destruktor gibt Speicher wieder frei void matrix::output(matrix a) { cout << "Ausgabe der Matrix:" << endl; for (int i = 0; i<m; i++) for (int j = 0; j<n; j++){ cout << a(i,j) << "\t"; if(j+1 == n) {cout<<"\n"<<endl;};} ;} void matrix :: add (matrix a, matrix b, matrix c){ for (int i = 0; i<=m; i++) for (int j = 0; j<=n; j++) c (i,j) = a(i,j) + b(i,j) ;} void matrix :: smult(double s, matrix a, matrix c){ for (int i = 0; i<=m; i++) for (int j = 0; j<=n; j++) c (i,j) = a(i,j) * s ;} void matrix :: mmult(matrix a, matrix b, matrix c){ for(int i=0;i<m;++i) for(int j=0;j<b.n;++j) for(int k=0;k<=n;++k) c(i,j) = c(i,j) + a(i,k)*b(k,j) ;} void matrix::einlesen(matrix a){ for(int i=0;i<m;++i) {for(int j=0;j<n;++j) {cin >> eingabe; eingabe = a(i,j);}} }Matrix.h
#ifndef matrix_h #define matrix_h #define INDEX(i,j)((i)*n+(j)) class matrix{ public: matrix (int m,int n); ~matrix(); double& operator() (int i , int j) {return a[INDEX(i,j)];}; // Operatorüberladung void output(matrix); void add(matrix, matrix, matrix); void mmult(matrix, matrix,matrix); void smult(double , matrix , matrix ); double eingabe; void einlesen(matrix); private: double *a; int m,n; }; #endif
-
Hä??
Kam nicht exakt der Quellcode vorn paar Tagen schonmal hier rum??
Zum Fehler: Regel der großen 3 verletzt.
Was die Rule-Of-Three ist, kannst googlen :>Edit: Jo hier!
-
okay verstehe ich soweit,
matrix (int m,int n); matrix(matrix const&){} ~matrix();nur was genau gehört in den Kopierkonstruktor dann hinein ?
-
-
Hm ich kapiere wofür ich den Kopierkonstruktor brauche und dass ich damit irgendwie die m & n werte kopieren muss bzw auch das double Array, aber wie ich das genau mache entzieht sich gänzlich meiner Kenntnis...
( Tut mir leid, haben gerade erst mit Klassen angefangen )
-
huwul schrieb:
Hm ich kapiere wofür ich den Kopierkonstruktor brauche und dass ich damit irgendwie die m & n werte kopieren muss bzw auch das double Array, aber wie ich das genau mache entzieht sich gänzlich meiner Kenntnis...
( Tut mir leid, haben gerade erst mit Klassen angefangen )
Unter dem von Swordfish geposteten Link ist das doch genau beschrieben. Was willst du noch? Soll dir jemand den Popo abwischen?
-
btw schau dir mal die Zeile 48 der
Matrix.cppoben an.
-
Die Main ist schon ausgebessert.
Aber als copy Konstruktor müsste doch völlig reichen:
Matrix (const Matrix& rhs){m = New; n=New;}Mit diesen Werten muss eine neu Erstellung der Matrix doch möglich sei ...
-
huwul schrieb:
Die Main ist schon ausgebessert.
Aber als copy Konstruktor müsste doch völlig reichen:
Matrix (const Matrix& rhs){m = New; n=New;}Mit diesen Werten muss eine neu Erstellung der Matrix doch möglich sei ...
Das wird ja noch nicht einmal übersetzt.
Hoffst du darauf, dass dir jemand den Code schreibt, wenn du dich nur dumm genug anstellst?
-
huwul schrieb:
Die Main ist schon ausgebessert.
Swordfish schrieb:
btw schau dir mal die Zeile 48 der Matrix.cpp oben an.
huwul schrieb:
Aber als copy Konstruktor müsste doch völlig reichen:
Matrix (const Matrix& rhs){m = New; n=New;}Was soll "New" sein?
huwul schrieb:
Mit diesen Werten muss eine neu Erstellung der Matrix doch möglich sei ...
Wer soll denn diese "Neuerstellung" machen??
-
Ja habe das korrigiert nur nicht wieder gelistet.
Das sollte klein geschrieben sein und es soll einen neuen integer erstellen wenn eine zweite Instanz erstellt wird in der Main mit den neu ej gegebenen werten
-
huwul schrieb:
[...] wenn eine zweite Instanz erstellt wird in der Main mit den neu eingegebenen werten
Der Kopierkonstruktor wird aufgerufen, wenn du eine matrix an eine deiner Funktionen übergibst.
An deinem Code oben ist sooo viel falsch ... was macht denn
if( a(m,n) != b(m,n)){return 0;}!?