Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Programa en c++ dejo de funcionar

Estas en el tema de Programa en c++ dejo de funcionar en el foro de C/C++ en Foros del Web. Bueno tengo este programa que he estado realizando, es una practica que me dejo el profe aun no esta completo pero tengo un pequeño problema. ...
  #1 (permalink)  
Antiguo 07/09/2013, 14:59
 
Fecha de Ingreso: septiembre-2013
Mensajes: 1
Antigüedad: 11 años, 2 meses
Puntos: 0
Programa en c++ dejo de funcionar

Bueno tengo este programa que he estado realizando, es una practica que me dejo el profe aun no esta completo pero tengo un pequeño problema.

Estoy usando una estructura para crear un números complejos y después una clase para crear una matriz llena de números complejos, el problema es en los últimos 2 constructores los cuales tiene 3 y 4 parámetros respectivamente, no me funcionan ya que al ejecutar el programa dice que el .exe dejo de funcionar y se cierra.

Esto me ocurre solo al colocar los constructores ya mencionados, coloque el código de dichos constructores de rojo, supongo yo que es esa parte la que no me deja que funcione bien mi programa.

si alguien tiene una solución a mi problema de antemano gracias

#include <conio.h>
#include <iostream>
using namespace std;

struct complejo
{
int r,i;

complejo()
{
r=0;
i=0;
};

complejo(int a)
{
r=a;
i=0;
};

complejo(int a,int b)
{
r=a;
i=b;
};

void leer(complejo &n)
{
cout<<endl;
cout<<" Ingrese la parte real del numero: ";
cin>>n.r;
cout<<endl;
cout<<" Ingrese la parte imaginaria del numero: ";
cin>>n.i;
};

void imprimir(complejo &n)
{
if(n.i>=0)
{
cout<<endl;
cout<<" El resultado de la operacion es: "<<n.r<<"+"<<n.i<<"i";
}

else
{
cout<<endl;
cout<<" El resultado de la operacion es: "<<n.r<<n.i<<"i";
}
};

void operacion(complejo *a, int n)
{
char opc;
complejo b,c;

cout<<endl;
cout<<" Seleccione la operacion a realizar:"<<endl;
cout<<" A) Suma."<<endl;
cout<<" B) Resta."<<endl;
cout<<" C) Multiplicacion."<<endl;

opc=getch();

switch(opc)
{

case 'a':
case 'A':

b=a[0];

for(int i=1; i<n; i++)
{
c = b+(a[i]);
b=c;
}
b.imprimir(b);
break;

case 'b':
case 'B':
b=a[0];

for(int i=1; i<n; i++)
{
c = b-(a[i]);
b=c;
}
b.imprimir(b);
break;

case 'c':
case 'C':
b=a[0];

for(int i=1; i<n; i++)
{
c = b*(a[i]);
b=c;
}
b.imprimir(b);
break;

default:
cout<<endl;
cout<<" Opcion No Disponible";
break;

}
};

complejo operator + (complejo a)
{
complejo res;

res.r = r + a.r;
res.i = i + a.i;

return res;
};

complejo operator - (complejo a)
{
complejo res;

res.r = r - a.r;
res.i = i - a.i;

return res;
};

complejo operator * (complejo a)
{
complejo res;

res.r = r * a.r;
res.i = i * a.i;

return res;
};

};


class MatrixC
{
private:
int f,c;
complejo **M;
public:

MatrixC()
{
f=0;
c=0;
};

MatrixC(int a1)
{
f=a1;
c=a1;
};

MatrixC(int a1,int a2)
{
f=a1;
c=a2;
};

MatrixC(int a1,int a2, int a3)
{
int i,j;
f=a1;
c=a2;

for(i=0; i<f; i++)
{
for(j=0; j<c; j++)
{
M[i][j].r = a3;
M[i][j].i = a3;
}
}

};

MatrixC(int a1 ,int a2 , int a3 ,int a4)
{
int i,j;
f=a1;
c=a2;

for(i=0; i<f; i++)
{
for(j=0; j<c; j++)
{
M[i][j].r = a3;
M[i][j].i = a4;
}
}

};

void leer(){};
void inicializar(){};
void imprimir(){};

MatrixC operator + (MatrixC){};
MatrixC operator - (MatrixC){};
MatrixC operator * (MatrixC){};
};



int main()
{

MatrixC A;
MatrixC B(3);
MatrixC C(3,4);
MatrixC D(2,4,0);
MatrixC E(5,3,1,2);

getch();
return 0;
}
  #2 (permalink)  
Antiguo 08/09/2013, 14:45
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: Programa en c++ dejo de funcionar

Ejecuta en el depurador y veras que tienes 2 violaciones de segmento (en las dos funciones MatrixC de 3 y 4 argumentos) porque intentas acceder a los elementos de una array no inicializado:

Código C:
Ver original
  1. MatrixC(int a1,int a2, int a3) {
  2.     int i,j;
  3.  
  4.     //primero tienes que reservar la memoria necesaria
  5.     M = new complejo *[a1];
  6.     for(i = 0; i < a1; i++ ) {
  7.         M[i] = new complejo[a2];
  8.     }
  9.  
  10.     f=a1;
  11.     c=a2;
  12.  
  13.     for(i=0; i<f; i++) {
  14.         for(j=0; j<c; j++) {
  15.             M[i][j].r = a3;//sin reservar memoria esto es una violacion de segmento
  16.             M[i][j].i = a3;//y esto otra pero que nunca llega a ejecutarse
  17.         }
  18.     }
  19. };
  20. //necesitas lo mismo para la tra MatrixC de 4 argumentos

Recuerda que cuando reservas memoria dinamica para cada new necesitas un delete

Saludos
vosk

Etiquetas: apuntadores, c++, poo, programacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:06.