C/Visual C - Error Sobrecarga Operador + en clase Matriz

 
Vista:

Error Sobrecarga Operador + en clase Matriz

Publicado por Eduardo (4 intervenciones) el 15/07/2008 14:54:16
#include <iostream>
using namespace std;

class Matriz
{
public:
double ** x;
Matriz(int Heigth,int Width);
~Matriz();
void Grafica();
void Identity();
bool Cuadrada();
int heigth();
int width();
void operator=(Matriz & A);
Matriz operator +(Matriz & A);
private:
int itsHeigth;
int itsWitdh;
};

Matriz::Matriz(int Heigth,int Width)
{
x = new double * [Heigth];
int i,j;
itsHeigth=Heigth;
itsWitdh=Width;

for (i=0; i<itsHeigth; i++)
x[i] = new double[itsWitdh] ;

for (i= 0 ; i<itsHeigth ; i++ )
for (j= 0 ; j<itsWitdh ; j++ )
this->x[i][j]=0;

}

Matriz::~Matriz()
{
int i;
for (i=0; i<itsHeigth; i++) delete [ ] this->x[i] ;
}

int Matriz::heigth()
{
return itsHeigth;
}

int Matriz::width()
{
return itsWitdh;
}

void Matriz::Identity( )
{
int i,j;
for (i= 0 ; i<itsHeigth; i++ )
{
for (j= 0 ; j<itsWitdh; j++ )
if (i==j)
this->x[i][j]=1;
}
}

void Matriz::Grafica( )
{
cout << " ";
int i,j;
for (i= 0 ; i<itsHeigth ; i++ )
{
cout<<' ';
for (j= 0 ; j<itsWitdh ; j++ )
{
cout<<this->x[i][j]<<' ';
}
}
}

void Matriz::operator=(Matriz & A)
{
for (int i =0 ; i < itsWitdh ; i++)
{
for (int j = 0 ; j < itsHeigth ; j++)
{
x[i][j] = A.x[i][j];
}
}
}
Matriz Matriz::operator +(Matriz & A)
{
int i,j;
Matriz resultado(A.heigth(),A.width());//Creo una matriz Resultado para
//devolver del mismo tamaño que A
for (i=0;i<resultado.heigth();i++)
{
for (j=0;j<resultado.width();i++)
{
resultado.x[i][j]=A.x[i][j]+x[i][j]; //Cuando se llega al final de la primera fila
} //es decir i=0 y j=resultado.width() da un
} //error ver arriba
return resultado;

}

bool Matriz::Cuadrada()
{
if (itsHeigth==itsWitdh)
{
return true;
}
else
{
return false;
}
}

int main()
{

int H,W;
cout << "Entre el Alto de su matriz ";
cin>>H;
cout << "Entre el Aancho de su matriz ";
cin>>W;

Matriz Matriz1(H,W);Matriz Matriz2(H,W);Matriz Matriz3(H,W);

MyMatriz.Grafica();

Matriz3=Matriz1+Matriz2;//Porque no funciona incluso
//cuando el operador creo esta bien

cin.get();
cin.get();
return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Error Sobrecarga Operador + en clase Matriz II

Publicado por Eduardo (4 intervenciones) el 15/07/2008 15:24:13
Error en operador +
Unhandled exception at 0x00411927 in Matriz.exe: 0x0000005 : Access violation reading location 0xfdfdfdfd.

#include <iostream.h>

class Matriz
{
public:
double ** x;
Matriz(int Heigth,int Width);
~Matriz();
void Grafica();
void Identity();
bool Cuadrada();
int heigth();
int width();
void operator=(Matriz & A);
Matriz operator +(Matriz & A);
private:
int itsHeigth;
int itsWitdh;
};

Matriz::Matriz(int Heigth,int Width)
{
x = new double * [Heigth];
int i,j;
itsHeigth=Heigth;
itsWitdh=Width;

for (i=0; i<itsHeigth; i++)
x[i] = new double[itsWitdh] ;

for (i= 0 ; i<itsHeigth ; i++ )
for (j= 0 ; j<itsWitdh ; j++ )
this->x[i][j]=0;

}

Matriz::~Matriz()
{
int i;
for (i=0; i<itsHeigth; i++) delete [ ] this->x[i] ;
}

int Matriz::heigth()
{
return itsHeigth;
}

int Matriz::width()
{
return itsWitdh;
}

void Matriz::Identity( )
{
int i,j;
for (i= 0 ; i<itsHeigth; i++ )
{
for (j= 0 ; j<itsWitdh; j++ )
if (i==j)
this->x[i][j]=1;
}
}

void Matriz::Grafica( )
{
cout << " ";
int i,j;
for (i= 0 ; i<itsHeigth ; i++ )
{
cout<<' ';
for (j= 0 ; j<itsWitdh ; j++ )
{
cout<<this->x[i][j]<<' ';
}
}
}

void Matriz::operator=(Matriz & A)
{
for (int i =0 ; i < itsWitdh ; i++)
{
for (int j = 0 ; j < itsHeigth ; j++)
{
x[i][j] = A.x[i][j];
}
}
}
Matriz Matriz::operator +(Matriz & A)
{
int i,j;
Matriz resultado(A.heigth(),A.width());//Creo una matriz Resultado para
//devolver del mismo tamaño que A
for (i=0;i<resultado.heigth();i++)
{
for (j=0;j<resultado.width();i++)
{
resultado.x[i][j]=A.x[i][j]+x[i][j]; //Cuando se llega al final de la primera fila
} //es decir i=0 y j=resultado.width() da un
} //error ver arriba
return resultado;

}

bool Matriz::Cuadrada()
{
if (itsHeigth==itsWitdh)
{
return true;
}
else
{
return false;
}
}

int main()
{

int H,W;
cout << "Entre el Alto de su matriz ";
cin>>H;
cout << "Entre el Aancho de su matriz ";
cin>>W;

Matriz Matriz1(H,W);Matriz Matriz2(H,W);Matriz Matriz3(H,W);

MyMatriz.Grafica();

Matriz3=Matriz1+Matriz2;//Porque no funciona incluso
//cuando el operador creo esta bien

cin.get();
cin.get();
return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error Sobrecarga Operador + en clase Matriz II

Publicado por igor (22 intervenciones) el 15/07/2008 22:07:37
Me ha costado un poco verlo, pero en:

Matriz Matriz::operator +(Matriz & A)
{
int i,j;
Matriz resultado(A.heigth(),A.width());//Creo una matriz Resultado para
//devolver del mismo tamaño que A
for (i=0;i<resultado.heigth();i++)
{
for (j=0;j<resultado.width();i++)
{
resultado.x[i][j]=A.x[i][j]+x[i][j]; //Cuando se llega al final de la primera fila
} //es decir i=0 y j=resultado.width() da un
} //error ver arriba
return resultado;

}

Si te fijas for (j=0;j<resultado.width();i++) incrementa i++ !!!!!!

for (j=0;j<resultado.width();J++) sería lo correcto, no se si habrá mas errores.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error Sobrecarga Operador + en clase Matriz II

Publicado por Eduardo (1 intervención) el 16/07/2008 22:05:12
gracias igor pero... el error persiste, cuando la matriz no es cuadrada, mas es otro del tipo:
Debug Assertion Failed!
File: f:ddvctoolscrt_bldself_x86crtsrcdbgdel.cpp
Line: 52
Expression: _BLOOK_TYPE_IS_VALID(pHead->nBlockUse)
mira lo que hay en la linea 52 de dbgdel.cpp que es donde da el error

if (pUserData == NULL)
return;

_mlock(_HEAP_LOCK); /* block other threads */
__TRY

/* get a pointer to memory block header */
pHead = pHdr(pUserData);

/* verify block type */
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

_free_dbg( pUserData, pHead->nBlockUse );

__FINALLY
_munlock(_HEAP_LOCK); /* release other threads */
__END_TRY_FINALLY

return;
}

#endif /* _DEBUG */
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error Sobrecarga Operador + en clase Matriz II

Publicado por igor (22 intervenciones) el 18/07/2008 20:57:07
Por lo que veo te remite a una librería del compilador, ya que no creo que ese código sea tuyo.

Cuando esto pasa normalmente suele ser porque hay algo que no estamos haciendo bien dentro de nuestro código.

Te aconsejo que mires en que linea de tú código se produce el error y comprobar que no estás utilizando índices fuera de rango.

Un truco para buscar errores es separar el código y empezar por lo mas sencillo, por ejemplo el constructor y destructor de la clase. Cuando estés seguro de que ese código funciona siempre, pasas a añadir más código, así hasta dar con el código que funciona mal.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar