Matrizenmultiplikation Error: expression cannot be evaluated



  • Hi,

    ich bekomme folgende Fehlermeldung bei der Multiplikation von Matritzen:

    Error: expression cannot be evaluated

    Wenn ich das richtig versteh, dann versucht das Programm einen Speicherbereich 2 mal freizugeben und beim 2 mal gibt er mir den Fehler?

    Es werden 2 4x4 Matrizen miteinander multipliziert.
    Dabei sind zum testen alle Matritzen nur mit 0 gefüllt.

    Die Ausgabe der Matrix a und b klappt ohne Probleme.

    Hier der Code:

    class matrix
    {
    private : int row, col; 
              double** mat; 
    
      public : 
    
    	  matrix(int r, int c):row(r),col(c) {  //Konstrucktor
                  mat = new double* [row];
                  for(int j = 0; j < row ; j++)
                     mat[j] = new double[col]; 
                  for(int i = 0; i < row ; i++)
                     for(int j = 0; j < col ; j++)
                        mat[i][j] = 0;
             }
    
            ~matrix() {// Destructor  
             	for(int j = 0; j < row ; j++)
                   delete []mat[j];
                delete []mat;          
             } 
    
    		// Function to display matrix 
    void display_matrix(){
    	for (int r = 0 ; r < row ; r++)	{
    		for (int c = 0 ; c < col ; c++)		{
    			cout << mat[r][c] << "\t";
    		}
    		cout << "\n";
    	}
    	cout << "\n";
    }  
    
    // Function to multiply matrices
    matrix matrix_mult(const matrix& other){ 
       if(col != other.row) {
            cout << "\n Sorry the Matrices are not compatible for multiplication ";
            system("PAUSE");              
            exit(0);
        }  
        matrix result(row, other.col);            
    
    	for (int r = 0 ; r < row ; r++)
    		for (int c = 0 ; c < other.col ; c++){   
                int value = 0;
    		    for (int temp = 0 ; temp < col ; temp++)
    		        value += mat[r][temp] * other.mat[temp][c];
                result.mat[r][c] = value;
            }  			
       return result;
    }                   
    
    };
    
    #include "stdafx.h"
    
    #include "matrix.h"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	matrix a(4,4),b(4,4),c(4,4);
    	a.display_matrix();
    	b.display_matrix();
    
    	a.matrix_mult(b).display_matrix();  
    
    	getch();
    	return 0;
    }
    


  • Ich bekomme keine Fehler.

    Lediglich eine Warning das int Value mit dem ergebnis von zwei double Werten gefüllt wird.

    Sonst werden aber alle 3 Matritzen ausgegeben.

    Gruß
    WAR][FIRE



  • Siehe obige Post.
    Problembeschreibung angepasst.



  • In deiner Funktion matrix_mult() erzeugst du ein temporäres Objekt result. Dieses Objekt ist nach Bendigung der Funktion nicht mehr gültig, d.h. der Destruktor wird für dieses Objekt aufgerufen und der reservierte Speicher wieder freigegeben.

    Die Funktion matrix_mult() gibt zwar eine Kopie des Objekts zurück, mit der du dann weiterarbeitest, diese Kopie enthält aber die alten Zeiger auf den freigegebenen Speicher, was natürlich nicht funktioniert.

    Du musst dir bei einer Klassenkonstruktion in c++ immer überlegen, wie sich der Copy-Konstruktor und der Zuweisungsoperator(=) korrekt verhalten sollen. In deinem Fall ist wohl eine tiefe Kopie nötig.



  • Danke für deine Antwort.
    Dann muss ich mir mal die Sache mit der tiefen Kopie anschauen.

    @WAR][FIRE
    In dev++ bekomme ich die selbe Meldung wie du.
    In Visual C++ die Fehlermeldung



  • Hab mir einmal nen Kopierkonstrucktor geschrieben, weiß allerdings nicht wie ich diesen in der Multiplikation nun anwenden muss, bzw. nun stürzt das Programm nicht mehr ab, gibt aber die Multiplizierte Matrix nicht aus.

    matrix(const matrix& rhs)// Kopierkonstruktor
    		  mat = new double* [rhs.row];
    		  for(int j = 0; j < rhs.row ; j++)
    			  mat[j] = new double[rhs.col]; 
    		  for(int i = 0; i < rhs.row ; i++)
    			  for(int j = 0; j < rhs.col ; j++)
                        mat[i][j] = 0;		
    	  }
    


  • Ich glaube nicht, dass du den Kopierkonstruktor für die Multiplikation explizit brauchst. Du willst ja keine Matrix kopieren, sondern eine neue erstellen (mit neuer Zeilen- und Spaltenanzahl). Wo er aber nötig ist, ist beim Rückgabewert, dort wird er sozusagen implizit (gegeben durch den Rückgabetyp der Funktion) aufgerufen. Übrigens kannst du deine For-Schleifen im Kopierkonstruktor zusammenfassen. Im Weiteren solltest du den operator= auch gleich überladen, damit die Semantik bei Zuweisungen korrekt bleibt.

    Was heisst, die Produktmatrix wird nicht ausgegeben? Wird display_matrix() aufgerufen? Geh sonst mal mit dem Debugger durch...



  • Krikus schrieb:

    ... gibt aber die Multiplizierte Matrix nicht aus.

    Wenn du den Copy-Konstruktor selbst schreibst musst du alle Membervariablen miteinbeziehen, denn die Member werden dann nicht mehr automatisch kopiert.

    In deinem Fall wollen row und col auch beachtet werden, sonst sind die bleidigt und nehmen Werte an, die du nicht erwartest ... 😉



  • @Mitleid

    Wie konnte ich das blos übersehen.
    Danke für den Hinweis.
    Nun funktioniert es.

    Jetzt noch das überladen der Operatoren dazu und fertig ist es.


Log in to reply