iostream
Registrado: 26 Nov 2008 Mensajes: 39
| Publicado: 16/04/2014 7:01 am | | | Título: Error lógico con clases y sobrecarga de operador + |
| Hola,
He encontrado un error en un programa que contiene una clase para operar con matrices. El error no se muestra en el compilador, pero se ve al ejecutar.
Éste es el código sin incluir la función 'main'. He omitido algunas funciones del código para que no resulte tan extenso. Considero que así es suficiente para identificar cualquier posible error, pero en caso de no ser así pondré todo el código.
| Código: | class matrix { public: // ============= // Constructores //============== matrix(); matrix( int Rows , int Columns ); columnas matrix( int Rows , int Columns, long double Value); // ========== // Destructor // ========== ~matrix(); // ................................................................ // =============================== // Funciones de acceso a elementos // =============================== inline void SetElement ( int Row, int Column , long double Value); long double ReturnElement ( int Row , int Column ); void fill ( long double Value ); // Poner una funcion para rellenar aleatoriamente inline int rows ( void ); inline int columns ( void ); inline int dimension ( void );
friend matrix operator+ ( const matrix &A , const matrix &B ); private: // Variables bool bool pbDefined; bool pbIndexes; // Variables int int piRows; int piColumns; int piDimension; // Variables long double long double *pldData; // Funciones privadas inline int piCalcDimension ( void ); inline int LinearIndex ( int i, int j); inline bool pbValidCoord ( int i, int j); };
// 1. Constructor por defecto matrix::matrix() { pbDefined = false; pbIndexes = false; piRows = 0; piColumns = 0; piDimension = piCalcDimension(); pldData = new long double [ piDimension ]; }
//2. Constructor filas-columnas
matrix::matrix( int Rows , int Columns ) { pbDefined = false; if ( ( Rows > 0 ) && ( Columns > 0 ) ) { pbIndexes = true; piRows = Rows; piColumns = Columns; } else { pbIndexes = false; piRows = 0; piColumns = 0; } piDimension = piCalcDimension(); pldData = new long double [ piDimension ]; }
// OPERADOR + matrix operator+ ( const matrix &A , const matrix &B ) { if ( ( A.piRows == B.piRows ) && // Coinciden las filas ( A.piColumns == B.piColumns ) && // Coinciden las columnas ( A.pbDefined && B.pbDefined ) // Las matrices son operables ) { matrix mReturn( A.piRows , A.piColumns ); mReturn.pbDefined = true; mReturn.pbIndexes = true; for ( int c = 0 ; c < A.piDimension ; c++ ) { mReturn.pldData[c] = A.pldData[c] + B.pldData[c]; } for ( int i = 1 ; i<= A.piRows ; i++ ) { for ( int j = 1 ; j<= A.piColumns ; j++ ) { cout<<mReturn.ReturnElement(i,j)<<" "; } cout<<endl; } cout<<endl; return mReturn; } else { matrix mReturn; return mReturn; } }
long double matrix::ReturnElement( int Row , int Column ) { long double ldReturn; if ( ( pbDefined ) && ( pbValidCoord( Row, Column ) == true )) ldReturn = pldData[ LinearIndex( Row, Column ) ]; else pbIndexes = false; return ldReturn; }
void Print ( matrix A ) { for ( int i = 1 ; i <= A.rows() ; i++ ) { for ( int j = 1 ; j <= A.columns() ; j++ ) { cout<<A.ReturnElement( i, j )<<" "; } cout<<endl; } }
|
En la función del operador + se puede ver que he añadido un fragmento de código para escribir la matriz calculada. El error se produce cuando ejecuto el programa con dos funciones main distintas por el valor de las variables, pero iguales en estructura.
Caso 1:
| Código: | int main ( void ) { matrix A(5,3,1.00L); matrix B(5,3,2.00L); Print(A+B);
system("pause>nul"); return 0; }
|
El resultado de esto es:
| Código: | 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
|
Que corresponde a mostrar dos veces la matriz A+B. La primera se debe al fragmento de código añadido en la definición del operador, y la segunda es de la función Print.
Para el segundo caso:
| Código: | int main ( void ) { matrix A(10,9,1.00L); matrix B(10,9,2.00L); Print(A+B);
system("pause>nul"); return 0; }
|
El resultado es:
| Código: | 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
-1.#IND 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
|
Cabría esperar que el resultado fuese similar al anterior, y sin embargo aparece en la matriz de abajo un -1.#IND en el primer elemento. Me gustaría saber cómo debo cambiar mi código para evitar esta situación. De igual forma, agradeceré cualquier propuesta para una mejora del código.
Un saludo. |
|