/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Error lógico con clases y sobrecarga de operador +

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
iostream



Registrado: 26 Nov 2008
Mensajes: 39

MensajePublicado: 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.
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com