Problem mit dem Ausgabeoperator



  • Hallo lieber SeppJ,

    kannst du mir die Stelle zeigen? Ich sehe es einfach nicht.



  • Suche in deinem Text mal alle i++ und schaue, ob die da sinnvoll sind.



  • friend ostream& operator <<(ostream& os, const MatrixT& A){
    for (int i=0; i<A.dim; i++)
    for (int j=0; j<A.dim; i++)  <--- Hier natürlich j++
    os<< A[i][j] <<" ";
    
    return os;
    }
    

    Ups, ihr meintet diese Stelle?



  • Jetzt bekomme ich sogar eine Ausgabe, wenn ich

    template <typename T>class MatrixT {
    private:
    T **d;
    int dim;
    public:
    
    MatrixT(int di) : dim(di){ //Bekommt dim uebergeben 2-58
    //di=3;
    d = new T*[dim];
    for (int i=0; i<dim; i++){ //Speicher fuer Arry d anfordern
    d[i] = new T[dim];
    }
    
    for (int i=0; i<dim; i++) //Matrixelemente mit 1.0 initialisieren
    for (int j=0; j<dim; j++)
    d[i][j] = 1.0;
    
    }
    
    friend MatrixT operator+ (const MatrixT& a, const MatrixT& b){
    MatrixT ma;
    for(int i=0; i<b.dim; i++)
    for(int j=0; j<b.dim; j++)
    ma[i][j]=(a[i][j]+b[i][j]);
    
    return ma;
    }
    
    friend ostream& operator <<(ostream& os, const MatrixT& A){
    for (int i=0; i<A.dim; i++)
    for (int j=0; j<A.dim; j++)
    os<< A.d[i][j] <<" ";
    
    return os;
    }
    
    };
    
    int main(){
    
    MatrixT<int> A(2);
    
    cout << "Matrix A: " << A << endl; Wieso klappt die Ausgabe nicht?!?!
    
    return 0;
    }
    

    das so schreine. Die Ausgabe lautet Matrix A: 1 1 1 1



  • Dir fehlt die Ausgabe von einem '\n' an der richtigen Stelle

    Mach dich mal über Einrückungsstil schlau.



  • Danke, jetzt klappt alles perfekt. Ich bekomme nun die n*n-Matrix mit dem richtigen Zeilenumbruch. Aber findet ihr mein Programm nicht so gut? Insbesondere du SeppJ meintest doch, dass man das lieber mit Vetroren machen sollte.



  • template <typename T>class MatrixT {
    	private:
    	T **d;
    	int dim;
    	public:
    	//d) Konstruktor fuer Template-Klasse
    		MatrixT(int di) : dim(di){ //Bekommt dim uebergeben 2-58
    		di=3;
    		d = new T*[dim];
    		for (int i=0; i<dim; i++){ //Speicher fuer Arry d anfordern
    			d[i] = new T[dim];
    			}
    
    		for (int i=0; i<dim; i++) //Matrixelemente mit 0.0initialisieren
    		for (int j=0; j<dim; j++)
    		d[i][j] = 1.0;
    
    		}
    
    		friend MatrixT operator+ (const MatrixT& a, const MatrixT& b){
    			MatrixT ma;
    			for(int i=0; i<b.dim; i++)
    			for(int j=0; j<b.dim; j++)
    			ma[i][j]=(a[i][j]+b[i][j]);
    
    			return ma;
    			}
    
    			friend ostream& operator <<(ostream& os, const MatrixT& A){
    			for (int i=0; i<A.dim; i++){
    			for (int j=0; j<A.dim; j++){
    			os<< A.d[i][j]<<" ";
    		 }
    		 os<<endl;
    		}
    		os<< endl;
    			return os;
    			}
    
    	};
    
    int main(){
    
    MatrixT<int> A(5);
    
    cout << "Matrix A: \n" << A << endl;   
    
    	return 0;
    	}
    


  • friend MatrixT operator+ (const MatrixT& a, const MatrixT& b){
    			MatrixT ma;
    			for(int i=0; i<b.dim; i++)
    			for(int j=0; j<b.dim; j++)
    			ma=(a.d[i][j]+b.d[i][j]);
    
    			return ma;
    			}
    
    			friend ostream& operator <<(ostream& os, const MatrixT& A){
    			for (int i=0; i<A.dim; i++){
    			for (int j=0; j<A.dim; j++){
    			os<< A.d[i][j]<<" ";
    		 }
    		 os<<endl;
    		}
    		os<< endl;
    			return os;
    			}
    
    	};
    
    int main(){
    
    MatrixT<double> A(8);
    MatrixT<double> B(8);
    MatrixT<double> ma;
    
    cout << "Matrix A: \n" << A << endl;   // Wieso klappt die Ausgabe nicht?!?!
    cout << "Matrix B: \n" << B << endl; 
    ma.operator +(ma);
    cout << "Matrix C: \n" << ma << endl; 
    
    	return 0;
    	}
    

    Jetzt mekert der aber beim operator+ rum. Den ruft man doch so auf im main



  • #include <iostream>
    
    template < typename T >
    class MatrixT {
    
    	private:
    		T **d;
    		int dim;
    
    	public:
    
    		MatrixT(int di) 
    		:	dim( di )
    		{
    			di = 3; // weil?
    
    			d = new T*[ dim ];
    
    			for( int i = 0; i < dim; i++ ) {
    
    				d[ i ] = new T[ dim ];
    			}
    
    			for( int i = 0; i < dim; i++ ) {
    
    				for( int j = 0; j < dim; j++ ) {
    
    					d[ i ][ j ] = 1.0; // Matrixelemente mit 0.0initialisieren <-- ja ne, ... possible loss ...
    				}
    			}
    		}
    
    	MatrixT< T > operator+( const MatrixT< T > & rhs )
    	{
    		_ASSERT( dim == rhs.dim );
    
    		MatrixT< T > temp( dim );
    
    		for( int i = 0; i < dim; i++ ) {
    
    			for( int j = 0; j < dim; j++ ) {
    
    				temp.d[ i ][ j ] = d[ i ][ j ] + rhs.d[ i ][ j ];
    			}
    		}
    		return temp;
    	}
    
    	friend std::ostream& operator<<( std::ostream& os, const MatrixT& A )
    	{
    		for( int i = 0; i < A.dim; i++ ) {
    
    			for( int j = 0; j < A.dim; j++ ) {
    
    				os<< A.d[i][j]<<" ";
    			}
    
    			os << std::endl; // weil?
    		}
    
    		os << std::endl; // weil?
    		return os;
    	}
    };
    
    int main()
    {
    	MatrixT< double > A( 8 );
    	MatrixT< double > B( 8 );
    
    	std::cout << "Matrix A:\n" << A;
    	std::cout << "\n\nMatrix B:\n" << B;
    
    	std::cout << "\n\nMatrix C:\n" << ( A + B ) << "\n\n";
    }
    

    Warum keinen std::vector ? Wo ist der dtor?

    Warum nicht std::array ?

    #include <cstddef>
    #include <array>
    #include <iostream>
    
    template < typename T, std::size_t X, std::size_t Y = X >
    class array_2d_t {
    
    	private:
    		std::array< T, X * Y > data;
    
    	public:
    
    		array_2d_t< T, X, Y >() : data() {}
    
    		array_2d_t< T, X, Y > operator+( array_2d_t< T, X, Y > const &rhs )
    		{
    			array_2d_t< T, X, Y > tmp;
    
    			for( std::size_t i = 0; i < ( X * Y ); ++i ) {
    
    				tmp.data[ i ] = data[ i ] + rhs.data[ i ];
    			}
    
    			return tmp;
    		}
    
    	friend std::ostream& operator<<( std::ostream & os, array_2d_t< T, X, Y > const & array_2d )
    	{
    		for( std::size_t i = 0; i < ( X * Y ); ++i ) {
    
    			os << array_2d.data[ i ] << ' ';
    
    			if( ( i + 1 ) % X == 0 ) os.put( '\n' );
    		}
    
    		return os;
    	}
    };
    
    int main()
    {
    	array_2d_t< int, 3 > a;
    	array_2d_t< int, 3 > b;
    
    	std::cout << ( a + b ) << '\n';
    }
    


  • Hallo lieber Swordfish,

    danke, du hast dir wirklich sehr viel Mühe gemacht.


Anmelden zum Antworten