elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C++] Resultado extraño en una clase Matriz
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C++] Resultado extraño en una clase Matriz  (Leído 3,340 veces)
Rockmore

Desconectado Desconectado

Mensajes: 18



Ver Perfil
[C++] Resultado extraño en una clase Matriz
« en: 8 Abril 2011, 19:38 pm »

Saludos. A día de hoy me encuentro realizando un programilla que realice operaciones sencillas con matrices. Concretamente, sumas, restas y multiplicaciones. Como todos sabemos, para sumar o restar matrices, deben ser del mismo tamaño, y para multiplicarlas, el número de columnas de la primera debe ser igual al número de filas de la segunda. En este programa en concreto, si no se dan esas características, la operación debe devolver una matriz nula, de 0x0 elementos. Pongo la parte interesante del código y sigo con el problema:
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <time.h>
  5.  
  6. using namespace std;
  7.  
  8. //Clase Matriz
  9. class Matriz{
  10. protected:
  11.    int **M;
  12.    int NF,NC;
  13. public:
  14.    //Constructor por defecto
  15.    Matriz (){
  16.        NF=0;
  17.        NC=0;
  18.        M=NULL;
  19.    }
  20.    //Constructor de copia
  21.    Matriz (const Matriz &matriz){
  22.        NF=matriz.NF;
  23.        NC=matriz.NC;
  24.        M=new int *[NF];
  25.        for(int i=0;i<NF;i++){
  26.            M[i]=new int[NC];
  27.        }
  28.    }
  29.    //Constructor con parametros
  30.    Matriz (int nf, int nc){
  31.        M=new int *[nf];
  32.        for(int i=0;i<nf;i++){
  33.            M[i]=new int[nc];
  34.        }
  35.        for(int i=0;i<nf;i++){
  36.            for(int j=0;j<nc;j++){
  37.                M[i][j]=rand()%51;
  38.            }
  39.        }
  40.        return;
  41.    }
  42.    //Destructor
  43.    ~Matriz(){
  44.        for(int i=0;i<NF;i++){
  45.            delete M[i];
  46.        }
  47.        return;
  48.    }
  49.    //Operador asignacion
  50.    Matriz operator = (Matriz m){
  51.        if(NF!=m.NF){
  52.            for(int i=0;i<NF;i++){
  53.                delete M[i];
  54.            }
  55.        }
  56.        NF=m.NF;
  57.        NC=m.NC;
  58.        M=new int *[NF];
  59.        for(int j=0;j<NF;j++){
  60.            M[j]=new int [NC];
  61.        }
  62.        return(*this);
  63.    }
  64.    //Sobrecarga de operador de salida
  65.    friend ostream& operator <<(ostream &medio, Matriz matriz){
  66.        for(int i=0;i<matriz.NF;i++){
  67.            for(int j=0;j<matriz.NC;j++){
  68.                cout<<matriz.M[i][j]<<" ";
  69.            }
  70.            cout<<endl;
  71.        }
  72.        return(medio);
  73.    }
  74.    //Sobrecarga de operador suma
  75.    Matriz operator + (Matriz m){
  76.        Matriz resul;
  77.        if(NF==m.NF&&NC==m.NC){
  78.            for(int i=0;i<NF;i++){
  79.                for(int j=0;j<NC;j++){
  80.                    resul.M[i][j]=M[i][j]+m.M[i][j];
  81.                }
  82.            }
  83.        }
  84.        return(resul);
  85.    }
  86.    //Sobrecarga de operador resta
  87.    Matriz operator - (Matriz m){
  88.        Matriz resul;
  89.        if(NF==m.NF&&NC==m.NC){
  90.            for(int i=0;i<NF;i++){
  91.                for(int j=0;j<NC;j++){
  92.                    resul.M[i][j]=M[i][j]-m.M[i][j];
  93.                }
  94.            }
  95.        }
  96.        return(resul);
  97.    }
  98.    //Sobrecarga de operador producto
  99.    Matriz operator * (Matriz m){
  100.        Matriz resul;
  101.        if(NC==m.NF){
  102.            int N=NC;
  103.            for(int i=0;i<N;i++){
  104.                for(int j=0;j<N;j++){
  105.                    resul.M[i][j]=0;
  106.                    for(int k=0;k<N;k++){
  107.                        resul.M[i][j]=resul.M[i][j]+M[i][k]*m.M[k][j];
  108.                    }
  109.                }
  110.            }
  111.        }
  112.        return(resul);
  113.    }
  114. };
  115.  
  116. int main(void){
  117.    //Reinicio de semilla
  118.    srand(time(0));
  119.    //Prueba de codigo
  120.    Matriz m1(5,5),m2(5,5);
  121.    cout<<"Matriz 1 + Matriz 2 ="<<endl<<m1+m2;
  122.    getche();
  123.    return(0);
  124. }

Como se puede observar, el constructor con parámetros crea una matriz de NFxNC elementos, los cuales son valores aleatorios entre 0 y 50. El caso es que al probar la suma, y a pesar del getche(), el programa se ejecuta y se cierra automáticamente, y lo más extraño de todo, me devuelve 3. Es curioso, porque aunque no se realizara bien la operación, debería devolver 0, ya que compila sin problemas, pero devuelve 3. Por otro lado, si las matrices declaradas en main no llevan parámetros, el programa se ejecuta con normalidad, mostrando el texto del cout sin matriz (porque es nula), espera que pulse una tecla para continuar y devuelve 0. Por tanto, puedo suponer que el problema está, bien en el envío de parámetros, en el constructor de copia, o incluso en la sobrecarga del operador suma, pero no acabo de verlo. Por si sirve de algo, el compilador que utilizo es el QtCreator de Nokia.

Gracias por vuestra paciencia ;)


En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: [C++] Resultado extraño en una clase Matriz
« Respuesta #1 en: 8 Abril 2011, 20:14 pm »

Código
  1. return 0;

Return se usa de esa forma. El uso que tu estás haciendo ( return (0) ) es más propio de exit.


uso :
Código
  1. return expresion;


En línea

Rockmore

Desconectado Desconectado

Mensajes: 18



Ver Perfil
Re: [C++] Resultado extraño en una clase Matriz
« Respuesta #2 en: 17 Abril 2011, 21:28 pm »

Bueno, tras un poco más de investigación y consultas, lo que fallaba principalmente en el código estaba en el constructor de copia y en la sobrecarga del operador asignación. Como se puede comprobar, ambos crean la estructura de las matrices, pero no les dan el valor de la matriz origen, por tanto, quedan en basura y provocan el mal funcionamiento. Este es el código reescrito:
Código
  1. ......
  2. ......
  3.    //Constructor de copia
  4.    Matriz (const Matriz &matriz){
  5.        NF=matriz.NF;
  6.        NC=matriz.NC;
  7.        //Estructura de matriz
  8.        M=new int *[NF];
  9.        for(int i=0;i<NF;i++){
  10.            M[i]=new int[NC];
  11.        }
  12.        //Contenido de matriz
  13.        for(int k=0;k<NF;k++){
  14.            for(int l=0;l<NC;l++){
  15.                M[k][l]=matriz.M[k][l];
  16.            }
  17.        }
  18.    }
  19. .....
  20. ......
  21.    //Operador asignacion
  22.    Matriz operator = (Matriz m){
  23.        if(NF!=m.NF){
  24.            for(int i=0;i<NF;i++){
  25.                delete []M[i];
  26.            }
  27.            delete []M;
  28.        }
  29.        //Estructura de matriz
  30.        NF=m.NF;
  31.        NC=m.NC;
  32.        M=new int *[NF];
  33.        for(int j=0;j<NF;j++){
  34.            M[j]=new int [NC];
  35.        }
  36.        //Contenido de matriz
  37.        for(int k=0;k<m.NF;k++){
  38.            for(int l=0;l<m.NC;l++){
  39.                M[k][l]=m.M[k][l];
  40.            }
  41.        }
  42.        return(*this);
  43.    }
  44. .....
  45. ......

El tema del return no tiene nada que ver. Igual es por el compilador que utilizo, pero no tengo problemas con los paréntesis ni sin ellos. Gracias por el interés, de todos modos.

Sin embargo, creo que nunca descubriré por qué devolvía 3.... :-\
En línea

ssaammuu

Desconectado Desconectado

Mensajes: 35



Ver Perfil WWW
Re: [C++] Resultado extraño en una clase Matriz
« Respuesta #3 en: 17 Abril 2011, 22:08 pm »

Yo veo bastantes errores:

Código:
Matriz (int nf, int nc){
Fíjate que en esta construcción te olvidas de asignar los valores a NF y NC, por lo que el bucle de operador sobrecargado cout es infinito!

Código:
Matriz operator + (Matriz m){
        Matriz resul;
En todas las sobrecargas aritméticas, creas una matriz vacía, a la que despues le intentas asignar valores. Lo que pasa aquí es que los valores se los estas intentado asignar a **M que no está iniciada, ya que iniciando Matriz sin argumentos hace M=NULL

y parece ser que hay bastantes más  :-\
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
necesito darle valores a esta matriz y que me de un resultado ayuda porfa
Programación C/C++
chrisvel 2 2,285 Último mensaje 9 Mayo 2013, 20:49 pm
por cypascal
Me aparece un error extraño en una clase
Java
Antoniio 4 2,957 Último mensaje 12 Febrero 2016, 14:49 pm
por 0xFer
crear matriz con new en una clase c++
Programación C/C++
fafafa01 2 1,929 Último mensaje 28 Septiembre 2017, 23:41 pm
por _TTFH_3500
Promedio de matriz por indicador de clase c#
Programación C/C++
AngelCrowley 0 1,544 Último mensaje 15 Octubre 2017, 18:22 pm
por AngelCrowley
[DUDA] resultado nmap extraño
Seguridad
xtraiceman2 0 1,640 Último mensaje 13 Diciembre 2018, 19:02 pm
por xtraiceman2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines