• Sábado 18 de Mayo de 2024, 18:09

Autor Tema:  instanciacion de un objeto en un atributo de la clase  (Leído 2867 veces)

migul

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
instanciacion de un objeto en un atributo de la clase
« en: Viernes 8 de Mayo de 2009, 17:19 »
0
Estoy desesperado! No entiendo por que eclipse no me deja ejecutar una funcion miembro de la clase matriz de mi programa. Siempre que el programa encuentra que tiene que ejecutar una función miembro de matriz en la que se instancia una nueva matriz (matriz temp en el caso de la suma p. ej) sale de la ejecucion y me da error. El codigo parece que está bien no tiene ningún problema (creo). ¿Será cosa del compilador o del entorno? Aquí dejo una de las funciones que me dan problema:

double Matriz::menores(int i){
   double coef=0;
   int j,k,l;
   for (j=0;j<(length-i+1);j++);{   //recorre la diagonal en busca de menores
   Matriz menor(i);         //crea menores de orden deseado
      for (k=0;k<i;k++);
      {
         for (l=0;l<i;l++);      //los iguala a la matriz menor para no perturbar la principal
         menor.a[k+j][l+j]=a[k+j][l+j];
      }
   menor.factdet();      //calcula el determinante
   coef+=menor.det;      //los va sumando
   menor.~Matriz();    //Los destruye para que no se ocupe mucha memoria.
   }
   return coef;
}//en caso de pasar i=length devuelve el determinante de la matriz

...
Gracias de antemano! :D

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #1 en: Viernes 8 de Mayo de 2009, 18:00 »
0
¿Donde la exactamente el error? Por lo que decis parece un problema con el constructor ... depuralo ...

Para que te podamos ayudar mejor tenes que darnos todo el codigo o preferentemente una version reducida a la minima expresion donde se produzca el error.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

migul

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #2 en: Viernes 8 de Mayo de 2009, 18:11 »
0
Mira los constructores son:

Polinomio::Polinomio(int n){
   g=n;
   q = new double [g];
   for(int i=0;i<g;i++){
      q=1;
   }
}

Matriz::Matriz(int n)

{

   int i,j;

   length = n;
   det=1;
   ct.q= new double [length];
   for(i=0;i<n;i++) ct.q=0;

   // reserva memoria

   a = new double *[n];  // reserva memoria para el vector de punteros

   for (i=0;i<n;i++) a = new double[n]; // reserva memoria para cada fila

   for(i=0;i<n;i++) for(j=0;j<n;j++) a[j]=0; // inicializa a cero



}


y el destructor:

Matriz::~Matriz()

{

   if( a != NULL)

   {       //  libera memoria

       for(int i=0;i<length;i++) delete [] a;

       delete [] a;

   }

   if( ct.q != NULL)
   {
      delete [] ct.q;
   }



}

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #3 en: Viernes 8 de Mayo de 2009, 18:32 »
0
¿Y el error aparece en...?
Procura utilizar las etiquetas de código para que sea más legible :).
La imaginación es el límite.
Hardware & Software | Mexchip

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #4 en: Viernes 8 de Mayo de 2009, 18:49 »
0
Ademas de lo que ya te dije y Geo remarco.

Para que te podamos ayudar mejor tenes que darnos todo el codigo o preferentemente una version reducida a la minima expresion donde se produzca el error.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

migul

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #5 en: Sábado 9 de Mayo de 2009, 11:10 »
0
esque el problema es que no hay error en el códdigo, quiero decir que me lo compila sin fallos, simplemente se detiene la ejecución, ahí va todo el código:

Código: Text
  1. #include <math.h>
  2. #include <iomanip>
  3. #include "Polinomio.h"
  4. #include "Matriz.h"
  5.  
  6. using namespace std;
  7. #ifndef _MATRIZ_H_
  8. #define _MATRIZ_H_
  9.  
  10.  
  11.  
  12.  
  13. class Matriz
  14.     {
  15.     double **a;          //array de punteros a array double, contiene los terminos de la matriz
  16. protected:
  17.     int length;     //orden de la matriz (n filas x ncolumnas)
  18.     double det;
  19.     Polinomio ct;   //Polinomio caracteristico de la matriz
  20. public:
  21.     Matriz (int n);   // reserva memoria, lenght=n: MatrizTridiag A(n);
  22.     ~Matriz ();            // destructor
  23.     bool redim(int n);
  24.     void operator=(const Matriz& B);                // A=B;
  25.     double operator () (int i,int j) const ;    // a=m(i,j);
  26.     double& operator () (int i,int j);      // function: m(i,j)=a;
  27.     Matriz operator + (const Matriz& B);        // C=A+B;
  28.     void read();                    // A.read();
  29.     void fill();                    // A.fill();
  30.     void print () const;                // A.print();
  31.     double menores(int i);
  32.     void factdet();
  33.     void ccaracteristico();
  34.     void mcaracteristico();
  35.     void cambiarfilas(int i,int j);
  36.     double determinante() {return det;}
  37.     int size () const {return length;}          // n = A.size();
  38.     };
  39. #endif
  40.  
  41.  
  42. // Matriz A(n);
  43.  
  44. Matriz::Matriz(int n)
  45.  
  46. {
  47.  
  48.     int i,j;
  49.  
  50.     length = n;
  51.     det=1;
  52.     ct.q= new double [length];
  53.     for(i=0;i<n;i++) ct.q[i]=0;
  54.  
  55.     // reserva memoria
  56.  
  57.     a = new double *[n];  // reserva memoria para el vector de punteros
  58.  
  59.     for (i=0;i<n;i++) a[i] = new double[n]; // reserva memoria para cada fila
  60.  
  61.     for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=0; // inicializa a cero
  62.  
  63.  
  64.  
  65. }
  66.  
  67. // destructor
  68.  
  69. Matriz::~Matriz()
  70.  
  71. {
  72.  
  73.     if( a != NULL)
  74.  
  75.     {       //  libera memoria
  76.  
  77.         for(int i=0;i<length;i++) delete [] a[i];
  78.  
  79.         delete [] a;
  80.  
  81.     }
  82.  
  83.     if( ct.q != NULL)
  84.     {
  85.         delete [] ct.q;
  86.     }
  87.  
  88.  
  89.  
  90. }
  91.  
  92. // A = B
  93.  
  94. void Matriz::operator = (const Matriz& B)
  95.  
  96. {
  97.  
  98.     redim(B.size());
  99.  
  100.     for(int i=0;i<length;i++) for(int j=0;j<length;j++) a[i][j]=B.a[i][j];
  101.  
  102. }
  103.  
  104. //  function: a=m[i,j];
  105.  
  106. inline double Matriz::operator() (int i,int j) const
  107.  
  108. { return a[i][j];}
  109.  
  110. // function: m[i,j]=a;
  111.  
  112. double& Matriz::operator() (int i,int j)
  113.  
  114. { return a[i][j];}
  115.  
  116. // operador suma: C=A+B
  117.  
  118. Matriz Matriz::operator+(const Matriz& B)
  119.  
  120. {
  121.  
  122.     if(length != B.length) cout<< " error: matrices de distinta dimension "<<endl;
  123.  
  124.     Matriz temp(length);
  125.  
  126.     for(int i=0;i<length;i++) for(int j=0;j<length;i++) temp.a[i][j]=a[i][j]+B.a[i][j];
  127.  
  128.     return temp;
  129.  
  130. }
  131.  
  132. // producto matriz por vector: A.prod(v,w);
  133.  
  134.  
  135.  
  136. //  redimensionamiento de una matriz
  137.  
  138. bool Matriz::redim(int n)
  139.  
  140. {
  141.  
  142.     if (length == n)
  143.  
  144.         return false;  // no es necesario redimensionar
  145.  
  146.     else
  147.  
  148.     {
  149.  
  150.         if( a!= NULL)
  151.  
  152.         {
  153.  
  154.             // primero libera memoria
  155.  
  156.             for(int i=0;i<length;i++) delete [] a[i];
  157.  
  158.             delete [] a;
  159.  
  160.         }
  161.  
  162.         length = n;
  163.  
  164.         // reserva memoria
  165.  
  166.         a = new double *[n];  // reserva memoria para el vector de punteros
  167.  
  168.         for (int i=0;i<n;i++) a[i] = new double [n]; // reserva memoria para cada fila
  169.  
  170.         return true;
  171.  
  172.     }
  173.  
  174. }
  175.  
  176. // A.read()
  177.  
  178. void Matriz::read ()
  179.  
  180. {
  181.  
  182.     for(int i=0;i<length;i++)
  183.  
  184.     {
  185.  
  186.         cout << "fila "<<i<<"-esima" << "n";
  187.  
  188.         for(int j=0;j<length;j++)
  189.  
  190.         {
  191.  
  192.             cout << "termino a["<<i<<"]["<<j<<"] = ?" << "n";
  193.  
  194.             cin >> a[i][j];
  195.  
  196.         }
  197.  
  198.     }
  199.  
  200. }
  201.  
  202. // A.fill()
  203.  
  204. void Matriz::fill()
  205.  
  206. {
  207.  
  208.     for(int i=0;i<length;i++)
  209.  
  210.     {
  211.  
  212.         a[i][i]=4;
  213.  
  214.         if(i<length-1)
  215.  
  216.         {
  217.  
  218.             a[i+1][i]=-1;
  219.  
  220.             a[i][i+1]=-1;
  221.  
  222.         }
  223.  
  224.         if(i<length-3)
  225.  
  226.         {
  227.  
  228.             a[i+3][i]=-1;
  229.  
  230.             a[i][i+3]=-1;
  231.  
  232.         }
  233.  
  234.     }
  235.  
  236. }
  237.  
  238. // A.print()
  239.  
  240. void Matriz::print () const
  241.  
  242. {
  243.  
  244.     for(int i=0;i<length;i++)
  245.  
  246.     {
  247.  
  248.         for(int j=0;j<length;j++)
  249.  
  250.             cout << a[i][j]<<"  ";
  251.  
  252.             cout<<endl;
  253.  
  254.     }
  255.  
  256. }
  257.  
  258. // A.factLU()
  259.  
  260. void Matriz::factdet()
  261.  {
  262.      int permutaciones=0;
  263.      int i,j;
  264.  
  265.  
  266.     for(int cp=0;cp<length-1;cp++)
  267.     {
  268.  
  269.  
  270.         for(i=1;i<length-cp;i++){
  271.         if(a[cp][cp]==0)    //si el pivote es cero cambiar filas
  272.         {
  273.             cambiarfilas(cp,cp+i);
  274.             permutaciones++;
  275.         }
  276.         }
  277.         if(a[cp][cp]==0)
  278.             det= 0;//si el pivote sigue siendo cero, el det es cero.
  279.  
  280.         //ahora ya aplicar formula de ferragut
  281.     for(i=cp+1;i<length;i++)
  282.     {
  283.         double pivote=a[i][cp]/a[cp][cp];
  284.         for(j=0;j<length;j++)
  285.         {
  286.             a[i][j]=a[i][j]-pivote*a[cp][j];
  287.         }
  288.  
  289.     }
  290.     }
  291.         //se calcula el determinante
  292.     for(i=0;i<length;i++)
  293.         {det=det*a[i][i];}
  294.  
  295.         det=det*pow(-1,permutaciones);
  296.  
  297.  
  298.  }
  299.  
  300.  void Matriz::cambiarfilas(int i, int j){
  301.      double tem;
  302.      for(int l=0;l<length;l++){
  303.          tem=a[i][l];
  304.          a[i][l]=a[j][l];
  305.          a[j][l]=tem;
  306.  
  307.      }
  308.  }
  309. double Matriz::menores(int i){
  310.     double coef=0;
  311.     int j,k,l;
  312.     for (j=0;j<(length-i+1);j++);{  //recorre la diagonal en busca de menores
  313.     Matriz menor(i);            //crea menores de orden deseado
  314.         for (k=0;k<i;k++);
  315.         {
  316.             for (l=0;l<i;l++);      //los iguala a la matriz menor para no perturbar la principal
  317.             menor.a[k+j][l+j]=a[k+j][l+j];
  318.         }
  319.     menor.factdet();        //calcula el determinante
  320.     coef+=menor.det;        //los va sumando
  321.     menor.~Matriz();
  322.     }
  323.     return coef;
  324. }//en caso de pasar i=length devuelve el determinante de la matriz
  325. void Matriz::ccaracteristico(){
  326.  
  327.     ct.q[length-1]=pow(-1,length);
  328.  
  329.         for(int i=0;i<length-1;i++){
  330.             ct.q[i]=menores(length-i)*pow(-1,i);
  331.         }
  332.  
  333.  
  334. }
  335. void Matriz::mcaracteristico(){
  336.     ct.print1();
  337. }
  338.  
  339.  
  340.  
  341.  
  342.  
  343. int main() {
  344.  
  345.     Matriz prueba(2);
  346.     prueba.fill();
  347.  
  348.     Matriz p(2);
  349.     p.fill();
  350.     Matriz c(2);
  351.     c=prueba+p; //al llegar aqui
  352.     c.print();
  353.     p.ccaracteristico(); //o aqui, sale del programa sin terminar de ejecutarlo
  354.     p.mcaracteristico();
  355.  
  356.  
  357.  
  358.  
  359.  
  360.     return 0;
  361.  
  362. }
  363.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #6 en: Sábado 9 de Mayo de 2009, 12:18 »
0
Como minimo faltan Polinomio.h y Matriz.h (supongo que Polinomio.c/cpp tambien).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

migul

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #7 en: Sábado 9 de Mayo de 2009, 14:16 »
0
cierto, me ha faltado la clase polinomio. Matriz.h la he incluido al principio del todo.
Código: Text
  1.  
  2. #include "Matriz.h"
  3. #ifndef POLINOMIO_H_
  4. #define POLINOMIO_H_
  5. #include <iostream>
  6.  using namespace std;
  7. class Polinomio{
  8. public:
  9.     double *q;
  10.     int g;
  11.     Polinomio (int n);
  12.     Polinomio();
  13.     void print1();
  14.     void operator=(const Polinomio& c);
  15.  
  16.  
  17.  
  18.     virtual ~Polinomio();
  19. };
  20.  
  21. #endif /* POLINOMIO_H_ */
  22.  
  23.  
 
el cpp:

 
Código: Text
  1.  
  2. Polinomio::Polinomio(){
  3.     g=1;
  4.     q = new double [g];
  5.  
  6. }
  7. Polinomio::Polinomio(int n){
  8.     g=n;
  9.     q = new double [g];
  10.     for(int i=0;i<g;i++){
  11.         q[i]=1;
  12.     }
  13. }
  14. void Polinomio::print1()
  15. {
  16.     for(int i=0;i<g;i++){
  17.         cout<<q[i]<<endl;
  18.     }
  19. }
  20. void Polinomio::operator =(const Polinomio& c){
  21.     if(g!=c.g)
  22.     {
  23.         g=c.g;
  24.         delete [] q;
  25.         q=new double [g];
  26.     }
  27.     for(int i=0;i<g;i++)
  28.     {
  29.         q[i]=c.q[i];
  30.     }
  31. }
  32.  
  33. Polinomio::~Polinomio() {
  34.     // TODO Auto-generated destructor stub
  35. }
  36.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #8 en: Sábado 9 de Mayo de 2009, 15:42 »
0
Es un error de tipeo seguro, tal vez debido a poner dos bucles en una misma linea ...

Justamente en el operador +, tu codigo es:
Código: Text
  1. for(int i=0;i<length;i++) for(int j=0;j<length;i++) temp.a[i][j]=a[i][j]+B.a[i][j];
  2.  

Expresado de una manera legible aunque todavia incorrecta:
Código: Text
  1. for (int i = 0; i < length; i++)
  2. {
  3.   for(int j = 0; j < length; i++)
  4.   {
  5.     temp.a[i][j] = a[i][j] + B.a[i][j];
  6.   }
  7. }
  8.  

Prestale atencion a la expresion de contador del segundo bucle: es i++ igual que el primero en lugar de ser j++.

Segui vos y depurando el programa.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

migul

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #9 en: Sábado 9 de Mayo de 2009, 16:03 »
0
Ya tengo el problema de la suma solucionado, Muchas gracias!! Ya si me solucionais el de la funcion c caracteristico seria la leche jeje :P . yo creo que el error puede estar en este trozo del codigo:

double Matriz::menores(int i){
   double coef=0;
   int j,k,l;
   for (j=0;j<(length-i+1);j++);{   //recorre la diagonal en busca de menores
   Matriz menor(i);         //crea menores de orden deseado
      for (k=0;k<i;k++);
      {
         for (l=0;l<i;l++);      //los iguala a la matriz menor para no perturbar la principal
         menor.a[k+j][l+j]=a[k+j][l+j];
      }
   menor.factdet();      //calcula el determinante
   coef+=menor.det;      //los va sumando
   menor.~Matriz();
   }
   return coef;
}//en caso de pasar i=length devuelve el determinante de la matriz
void Matriz::ccaracteristico(){

   ct.q[length-1]=pow(-1,length);

      for(int i=0;i<length-1;i++)
      {
         ct.q=menores(length-i)*pow(-1,i);
      }


}

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #10 en: Sábado 9 de Mayo de 2009, 16:26 »
0
El problema esta en Menores (menor.a[k+j][l+j]=a[k+j][l+j];), revisa el codigo o depuralo (si estas usando GNU como creo usa gdb).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

migul

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #11 en: Sábado 9 de Mayo de 2009, 16:41 »
0
Toda la razón, muchas gracias!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #12 en: Sábado 9 de Mayo de 2009, 16:46 »
0
De nadas  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

migul

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #13 en: Sábado 9 de Mayo de 2009, 16:48 »
0
pero despues de corregirlo me sigue dando error, debe de haber algo mas... De todas formas al intentar depurarlo me sigue saliendo una ventanita que dice que end1.exe ha detectado un problema y debe cerrarse

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #14 en: Sábado 9 de Mayo de 2009, 16:54 »
0
Segui adelante, buscando todos los errores que hayan, usa el depurador.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

migul

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #15 en: Sábado 9 de Mayo de 2009, 19:04 »
0
Buf al final me he deshecho de la funcion menores y he reprogramado la de ccaracteristico. Parece que ahora no hay problemas informáticos, pero creo que tengo que repasarme el álgebra... jeje
Muchas gracias por vuestra ayuda :good:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: instanciacion de un objeto en un atributo de la clase
« Respuesta #16 en: Sábado 9 de Mayo de 2009, 19:54 »
0
Genial, me alegro de que lo hayas podido solucionar  :good:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.