13/12/2007, 16:56
|
| | Fecha de Ingreso: julio-2005
Mensajes: 4
Antigüedad: 19 años, 5 meses Puntos: 0 | |
New y Delete con matrices Este programa me da un error en tiempo de ejecucion parece que hace llamado al destructor y libera memoria cuando ya se ha liberado pero no he podido encontrar la solucion? que estare haciendo mal:
Código:
//MATRICES DINAMICAS CON SOBRECARGA DE OPERADORES
//Powered by Gel.
# include <iostream.h>
# include <conio.h>
enum logico {FALSE,TRUE};
class matrix
{
int f,c; //filas, columnas
int **mat;
public:
matrix(int fil=0, int col=0); //prototipo constructor
int filas(){return f;}
int columnas(){return c;}
matrix operator + (matrix &b);
matrix operator * (matrix &b);
logico operator == (matrix &b);
logico igualdimencion(matrix &b);
logico puedemultiplicarcon(matrix &b);
friend ostream& operator<<(ostream& , matrix &); //salida
friend istream& operator>>(istream& , matrix &); //entrada
~matrix(); //Prototipo Destructor
};
matrix::matrix(int fil,int col) //constructor
{
f=fil;
c=col;
//asignación de memoria dinámica a la matriz
if (f!=0)
{
mat = new int * [f]; //para las fila
for (int i=0;i<f;i++)
mat[i] = new int [c]; //para las columnas
//inicialización de valores de la matriz
for (i=0;i<f;i++)
for (int j=0;j<c;j++)
mat[i][j]=0; //todos los elementos a cero
}
cout<<"\n\t Constructor matriz";
}
matrix::~matrix() //Destructor
{
int i;
for(i=0;i<f;i++)
{
if (mat!=0)
delete [] mat[i]; //libera las filas de la matriz
}
if (mat!=0)
delete [] mat; // libera el puntero mat
cout<<"\n\t Destructor matriz";
}
ostream& operator<<(ostream &os, matrix &a) //operador de salida standard
{
for (int i=0;i<a.f;i++) //for 1
{
for (int j=0;j<a.c;j++)
os<<a.mat[i][j]<<" ";
os<<"\n"; //una linea por cada fila impresa
} //for 1
return os;
}
istream& operator>>(istream &is, matrix &a) //operador de entrada standard
{
int i,j;
for (i=0;i<a.f;i++) //for 1
for (j=0;j<a.c;j++) //for 2
{
cout<<"Elemento ["<<i<<"]["<<j<<"]: ";
is>>a.mat[i][j];
}
return is;
}
matrix matrix::operator + (matrix &b) //operador + sobrecargado
{
matrix res(f,c);
int i,j;
for (i=0;i<b.f;i++) //for 1
for (j=0;j<b.c;j++) //for 2
res.mat[i][j] = mat[i][j] + b.mat[i][j]; //suma de matrices
return res;
}
matrix matrix::operator*(matrix &b) //operador multiplicacion sobrecargado
{
matrix res(b); //constructor por copia
for (int i=0;i<b.f;i++) //for 1
for (int j=0;j<b.c;j++) //for 2
{
res.mat[i][j]=0;
for (int k=0;k<b.f;k++)
res.mat[i][j] = res.mat[i][j] + mat[i][k]* mat[k][j];
}
return res;
}
logico matrix::operator == (matrix &b) //operador de igualdad sobrecargado
{
int i,j;
logico identica;
identica = TRUE;
if ((f!=b.f)||(c!=b.c))
identica=FALSE;
else
for (i=0;i<b.f;i++) //for 1
for (j=0;j<b.c;j++)
if (mat[i][j]!=b.mat[i][j])
identica=FALSE;
return identica;
}
logico matrix::igualdimencion(matrix &b)
{
if ((f==b.f) && (c==b.c))
return TRUE;
else
return FALSE;
}
logico matrix::puedemultiplicarcon(matrix &b)
{
if (c==b.f)
return TRUE;
else
return FALSE;
}
//Inicio programa principal
void main()
{
// int filas,columnas;
matrix a(2,2),b(2,2);//,c(2,2);
int op;
do{
//clrscr();
cout<<"\n\t **** MENU DE OPCIONES **** ";
cout<<"\n\t 1. Suma de matrices";
cout<<"\n\t 2. Multiplicación de matrices";
cout<<"\n\t 3. Salir del programa";
cout<<"\n\t ¿Qué opción desea? -> ";cin>>op;
if ((op>=1)&&(op<=2))
{
cout<<"\n\t Ingresar matriz A \n";
//cout<<"\n\t Filas: ";cin>>filas;
//cout<<"\n\t Columnas: ";cin>>columnas;
//matrix a(filas,columnas); //construir la matriz a
cin>>a;
cout<<"\n\t Ingresar matriz B \n";
//cout<<"\n\t Filas: ";cin>>filas;
//cout<<"\n\t Columnas: ";cin>>columnas;
//matrix b(filas,columnas); //construir la matriz b
cin>>b;
}
switch(op)
{
case 1:
cout<<"\n\t SUMA DE MATRICES: ";
cout<<"\n Matriz A: \n"<<a;
cout<<"\n Matriz B: \n"<<b;
//c=(a+b);
cout<<"\n Matriz resultado: \n"<<(a+b);
break;
case 2:
cout<<"\n\t MULTIPLICACION DE MATRICES: ";
cout<<"\n Matriz A: \n"<<a;
cout<<"\n Matriz B: \n"<<b;
cout<<"\n Matriz resultado: \n"<<(a*b);
break;
case 3:
cout<<"\n\t Fin del programa...";
break;
default:
cout<<"\n\t Opción incorrecta [1..3]!";
break;
}//switch
getch();
}while (op!=3); //do while
} //main
Si alguien ha hecho alguno de matrices dinámicas utilizando clases que me pueda hechar una mano |