Dynamische Felder, sehr ähnliche codes jedoch verschiedene ergebnisse



  • Also ich hab folgendes Problem: Beim ersten Code wird am Ende das gewünschte Ergebnis ausgegeben, beim zweiten jedoch nicht.. dachte cout ändert nichts großartig relevantes für die Ausgabe am Ende. Es geht übrigens um dynamische Felder, ich wollte ein Programm erstellen, welches die Dimension(für die quadratische matrix) vom User einliest und dieser tippt auch, die gewünschten Zahlen in die Matrix.
    Ich bedanke mich schon mal im vorraus 🙂
    Die Fragliche Stelle vom code 1:

    void showmatrix(int n, Matrix A, Matrix B) {
    
    	cout << "A=" << endl;
    	for (int i = 0; i < n; i++) {      // Ausgabe Matrix A
    		for (int j = 0; j < n; j++) {
    			cout << i + 1 << ". Zeile " << j + 1 << ". Spalte: ";
    			cout << setw(3) << A[i][j];
    		}
    		cout << endl;
    	}
    
    	cout << "B=" << endl;
    	for (int i = 0; i < n; i++) {      // Ausgabe Matrix B
    		for (int j = 0; j < n; j++) {
    			cout << i + 1 << ". Zeile " << j + 1 << ". Spalte: ";
    			cout << setw(3) << B[i][j];
    		}
    		cout << endl;
    	}
    }
    

    Die Fragliche Stelle im Code 2:

     void showmatrix(int n, Matrix A, Matrix B) {
    
    	cout << "A=" << endl;
    	for (int i = 0; i < n; i++) {      // Ausgabe Matrix A
    		for (int j = 0; j < n; j++) {
    			cout << setw(3) << A[i][j];
    		}
    		cout << endl;
    	}
    
    	cout << "B=" << endl;
    	for (int i = 0; i < n; i++) {      // Ausgabe Matrix B
    		for (int j = 0; j < n; j++) {
    			cout << setw(3) << B[i][j];
    		}
    		cout << endl;
    	}
    }
    

    Der ganze Code 1,

    #include <iostream>
    #include <iomanip>
    #include <math.h>
    
    typedef double **Matrix;
    using namespace std;
    
    Matrix createMatrix(int n) {
    	Matrix Z = new double*[n];
    	for (int j = 0; j < n; j++) {
    		Z[j] = new double;
    	}
    	return Z;
    }
    
    void readmat(Matrix A, Matrix B, int n) {
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < n; j++) {
    			cin >> A[i][j];
    		}
    	}
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < n; j++) {
    			cin >> B[i][j];
    		}
    	}
    }
    
    void showmatrix(int n, Matrix A, Matrix B) {
    
    	cout << "A=" << endl;
    	for (int i = 0; i < n; i++) {      // Ausgabe Matrix A
    		for (int j = 0; j < n; j++) {
    			cout << i + 1 << ". Zeile " << j + 1 << ". Spalte: ";
    			cout << setw(3) << A[i][j];
    		}
    		cout << endl;
    	}
    
    	cout << "B=" << endl;
    	for (int i = 0; i < n; i++) {      // Ausgabe Matrix B
    		for (int j = 0; j < n; j++) {
    			cout << i + 1 << ". Zeile " << j + 1 << ". Spalte: ";
    			cout << setw(3) << B[i][j];
    		}
    		cout << endl;
    	}
    }
    
    Matrix freematrix(int n) {
    	Matrix Z = new double*[n];
    	for (int j = 0; j < n; j++) {
    		delete[] Z[j];
    	}
    	delete[] Z;
    	return Z;
    }
    
    int main() {
    	int n;
    	cout << "Dimension ?" << endl;
    	cin >> n;
    	Matrix A, B;
    
    	A = createMatrix(n);
    	B = createMatrix(n);
    	readmat(A, B, n);
    	showmatrix(n, A, B);
    	A = freematrix(n);
    	B = freematrix(n);
    
    	return 0;
    }
    

    Der ganze code 2

     #include <iostream>
    #include <iomanip>
    #include <math.h>
    
    typedef double **Matrix;
    using namespace std;
    
    Matrix createMatrix(int n) {
    	Matrix Z = new double*[n];
    	for (int j = 0; j < n; j++) {
    		Z[j] = new double;
    	}
    	return Z;
    }
    
    void readmat(Matrix A, Matrix B, int n) {
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < n; j++) {
    			cin >> A[i][j];
    		}
    	}
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < n; j++) {
    			cin >> B[i][j];
    		}
    	}
    }
    
    void showmatrix(int n, Matrix A, Matrix B) {
    
    	cout << "A=" << endl;
    	for (int i = 0; i < n; i++) {      // Ausgabe Matrix A
    		for (int j = 0; j < n; j++) {
    			cout << setw(3) << A[i][j];
    		}
    		cout << endl;
    	}
    
    	cout << "B=" << endl;
    	for (int i = 0; i < n; i++) {      // Ausgabe Matrix B
    		for (int j = 0; j < n; j++) {
    			cout << setw(3) << B[i][j];
    		}
    		cout << endl;
    	}
    }
    
    Matrix freematrix(int n) {
    	Matrix Z = new double*[n];
    	for (int j = 0; j < n; j++) {
    		delete[] Z[j];
    	}
    	delete[] Z;
    	return Z;
    }
    
    int main() {
    	int n;
    	cout << "Dimension ?" << endl;
    	cin >> n;
    	Matrix A, B;
    
    	A = createMatrix(n);
    	B = createMatrix(n);
    	readmat(A, B, n);
    	showmatrix(n, A, B);
    	A = freematrix(n);
    	B = freematrix(n);
    
    	return 0;
    }
    

    Tut mir leid für den langen Code, allerdings wusste ich nicht obs nur ok ist die Entscheidene Stelle zu zeigen.



  • Der einzige Unterschied zwischen Version 1 und 2 ist folgende Zeile:

    @derblütigeänfger sagte in Dynamische Felder, sehr ähnliche codes jedoch verschiedene ergebnisse:

    cout << i + 1 << ". Zeile " << j + 1 << ". Spalte: ";

    @derblütigeänfger sagte in Dynamische Felder, sehr ähnliche codes jedoch verschiedene ergebnisse:

    Beim ersten Code wird am Ende das gewünschte Ergebnis ausgegeben, beim zweiten jedoch nicht.

    Was ist das "gewünschte Ergebnis"?

    Aja,

    @derblütigeänfger sagte in Dynamische Felder, sehr ähnliche codes jedoch verschiedene ergebnisse:

    A = freematrix(n);
    B = freematrix(n);
    

    bringt genau garnix.



  • void freematrix(Matrix m, int n) 
    {
        for (int j = 0; j < n; j++)
        {
            delete m[j];
        }
    
        delete[] m;
    }
    

    Sollte so Speicher wieder freigeben, es gibt aber einen Unterschied zwischen deleteund delete[]. Wäre aber "umsichtig" mit new und delete, die Gefahr von memory-leaks besteht und passiert bereits im Beispiel oben.



  • In createMatrix erzeugst du erst n Zeilen, dann aber nicht n Spalten, sondern nur ein double mit "new double". Das müssten selbstverständlich n doubles sein. Ansonsten hat dein Code undefiniertes Verhalten und das erklärt dann auch unterschiedliches Verhalten durch ein cout.

    Allgemeine Bemerkung: such hier mal im Forum, es ist wahrscheinlich besser, einen vector<double> der Größe n*n anzulegen und eine echte Klasse Matrix zu erstellen (class, nicht typedef) und dort den operator[] zu implementieren.



  • Okay, also hab ich das richtig verstanden, funktioniert es nicht, weil memory leaks vorhanden sind ?



  • @derblütigeänfger sagte in Dynamische Felder, sehr ähnliche codes jedoch verschiedene ergebnisse:

    Okay, also hab ich das richtig verstanden, funktioniert es nicht, weil memory leaks vorhanden sind ?

    Nein!

    @wob sagte in Dynamische Felder, sehr ähnliche codes jedoch verschiedene ergebnisse:

    dann aber nicht n Spalten, sondern nur ein double mit "new double". Das müssten selbstverständlich n doubles sein.



  • ah okay dann so

    Matrix createMatrix(int n) {
    	int i, j;
    	Matrix Z = new double*[n];
    	for (j = 0; j < n; j++) {
    		Z[j] = new double[n];
    	}
    	for (i = 0; i < n; i++) {
    		for (j = 0; j < n; j++) {
    			Z[i][j] = i * j;                       
    		}
    	}
    	return Z;
    }
    


  • Ich danke vielmals um eure Hilfe 🙂
    war schon echt am verzweifeln.. 😃



  • @swordfish sagte in Dynamische Felder, sehr ähnliche codes jedoch verschiedene ergebnisse:

    Aja,
    @derblütigeänfger sagte in Dynamische Felder, sehr ähnliche codes jedoch verschiedene ergebnisse:

    A = freematrix(n);
    B = freematrix(n);

    bringt genau garnix.



  • @swordfish sagte in Dynamische Felder, sehr ähnliche codes jedoch verschiedene ergebnisse:

    @swordfish sagte in Dynamische Felder, sehr ähnliche codes jedoch verschiedene ergebnisse:

    Aja,
    @derblütigeänfger sagte in Dynamische Felder, sehr ähnliche codes jedoch verschiedene ergebnisse:

    A = freematrix(n);
    B = freematrix(n);

    bringt genau garnix.

    void freematrix(int n, Matrix A) {
    	for (int j = 0; j < n; j++) {
    		delete[] A[j];
    	}
    	delete[] A;
    }
    
    int main(){    //Natürlich steht in der Main eigentlich mehr
            freematrix(n, A);
    	freematrix(n, B);
    

Log in to reply