[C con Clase] Problema con puntero this.

Steven Davidson srd4121 en njit.edu
Dom Nov 7 01:53:54 CET 2010


Hola Segundo,

On 11/6/10, Segundo Álvarez <cienciaingenieria en gmail.com> wrote:
> Estoy desarrollando una clase contenedor-herramientas para vectores que
> dispone de una función que multiplica un vector escalarmente con otro.
>
> [highlight=c++]
>         float mult(const ap_vector& data) //multiplica escalarmente con el
> vector devolviendo el resultado y null si
>                                 //tienen distinta dimensión
>         {
>             float result;
>             if (data.dimension != dimension)
>             {
>                 return 0; //devuelve null si no coinciden las dimensiones
>             }
>             else
>             {
>                 int k;
>
>  for(k=0;k<dimension;k++){result+=elements[k]*data.elements[k];}
>                 return result;
>             }
>         }
>
> [/highlight]
>
> la función anterior funciona muy bien y devuelve correctamente el resultado.

La verdad es que no. El problema es que no diste un valor inicial a
'result'. Deberías haber escrito:

result = 0.0;
int k;
for( k=0; k<dimension; k++ )
  result += elements[k]*data.elements[k];
return result;

Ahora debería funcionar correctamente.

Aparte de esta corrección, te doy algunas sugerencias más acerca de la
implementación de esta clase:

class size_error : public exception {...};
...
float mult( const ap_vector& data ) const  throw (size_error)
{
  if( data.dimension != dimension )  return size_error();

  float result = 0.0;
  for( int k=0; k<dimension; k++ )
    result += elements[k]*data.elements[k];
  return result;
}

De esta forma, no tenemos que invalidar el resultado de 0, para
indicar que hay un error. Otra forma es simplemente confiando en que
las dimensiones son iguales. Por otra parte, podemos "extender" el
vector de menor número de elementos para que sea uno de mayor
cantidad. Por ejemplo, si tenemos,

(1,3,5) . (2,-4,1,-1,0,6)

entonces, podemos modificar el vector para que se pueda realizar la
multiplicación escalar:

(1,3,5,0,0,0) . (2,-4,1,-1,0,6)

Esto sería,

float mult( const ap_vector& data ) const
{
  int menor_dim = data.dimension < dimension ? data.dimension : dimension;

  float result = 0.0;
  for( int k=0; k<menor_dim; k++ )
    result += elements[k]*data.elements[k];
  return result;
}

Sólo tratamos los primeros elementos de cada vector.

Otra sugerencia es acerca de 'dist()'. Esto sería,

double dist() const
{
  return sqrt(mult(*this));
}

No es necesario que el resultado sea 'float', ya que 'sqrt()' retorna
un valor de tipo 'double'.


Espero que esto te ayude.

Steven




Más información sobre la lista de distribución Cconclase