• Viernes 15 de Noviembre de 2024, 11:22

Autor Tema:  Problema Con Matrices  (Leído 2524 veces)

Neko-sama

  • Miembro activo
  • **
  • Mensajes: 99
    • Ver Perfil
Problema Con Matrices
« en: Martes 7 de Junio de 2005, 23:02 »
0
Hola a todos!

tengo hace mucho tiempo un problema con matrices...


tengo una clase que tiene un metodo que recive un puntero a una matriz.

el problema es que cuando le paso el parametro, no son compatibles...


int matriz[2][2] = {{0,1},{1,5}};

cclase miclase;
miclase.ReciveMatriz(matriz, 2, 2);


eso no funciona...  ReciveMatriz esta eperando un **Matriz y no compila si lo envio así!

alguien tiene una idea de en que estoy fallando???


muchas gracias a quien pueda ayudar!!  :)

pitukilloloco

  • Miembro MUY activo
  • ***
  • Mensajes: 104
    • Ver Perfil
Re: Problema Con Matrices
« Respuesta #1 en: Miércoles 8 de Junio de 2005, 02:28 »
0
Cuando declaras una matriz bidimensional int matriz[2][2] el compilador pone la dirección de memoria a partir de la cual comienzan los números de la matriz, por lo que es un error pensar que es un apuntador a un apuntador a enteros, cuando en realidad es un a puntador al comienzo de los enteros. Te muestro un ejemplo que ilustra esto
Código: Text
  1.  
  2. #include <stdio.h>
  3.  
  4. void recibematriz (int m[][2])
  5. {
  6.   printf ("%d\n", m[1][1]);
  7. }
  8.  
  9. void recibematriz (int *m)
  10. {
  11.   printf ("%d\n", *(m + 1));
  12. }
  13.  
  14. void main ()
  15. {
  16.   int matriz[2][2] = {{0,1},{1,5}};
  17.   recibematriz (matriz);
  18.   recibematriz ((int *)matriz);
  19. }
  20.  
  21.  
al correrlo te muestra un 5 en la primera línea y en la segunda un 1

Neko-sama

  • Miembro activo
  • **
  • Mensajes: 99
    • Ver Perfil
Re: Problema Con Matrices
« Respuesta #2 en: Miércoles 8 de Junio de 2005, 07:43 »
0
entiendo lo que me dices!!

y gracias


pero tambien quiero crear una nueva matriz con la que envio como parametro...

necesito guardar la matriz...

tengo algo asi:
Código: Text
  1.  
  2. #include <stdio.h>
  3.  
  4.  
  5. void recibematriz (int *m)
  6. {
  7.   int** f;
  8.  
  9.   f = new int* [2];
  10.   for(int j=0;j<2;j++) {
  11.     f[j] = new int [2];
  12.     for(int i=0;i<2;i++) {
  13.       *(f + i + j) = (m + i + j);
  14.       printf ("%d\n", f[i][j]);
  15.     }
  16.   }
  17. }
  18.  
  19. void main ()
  20. {
  21.   int matriz[2][2] = {{1,2},{3,4}};
  22.   recibematriz ((int *)matriz);
  23. }
  24.  
  25.  


que tengo malo???

porque esto compila pero no guarda los valores que quiero que guarde...

o no entendí muy bien??
podrias ayudarme con este ejemplo?

pitukilloloco

  • Miembro MUY activo
  • ***
  • Mensajes: 104
    • Ver Perfil
Re: Problema Con Matrices
« Respuesta #3 en: Miércoles 8 de Junio de 2005, 08:57 »
0
Es muy pequeña tu función pero contiene muchos errores. Primero. Solicitas memoria dinámica usando new pero nunca la liberas por lo que tu programa tendrá inconsistencias de memoria. Quizá sólo estabas probando que primero hiciera bien lo que quieres y después pornerle este código pero es buena práctica de programación siempre hacerlo aún en un código tan pequeño como este. Segundo. Te había dicho en el anterior comentario que la matriz matriz[2][2] realmente es un apuntador a una localidad de memoria en donde se encuentran consecutivamente los enteros de la matriz. Si quieres accesar al elemento [j] de la matriz usándola como apuntador a enteros entonces debes de hacerlo así *(matriz + 2*i + j) y no *(matriz + i + j). Tercero. Sigues confundiendo un apuntador a un apuntador a enteros int** f con una matriz bidimensional cuando quieres mostrar a f[j]. Tienes otro errores más pero mejor te preguntaría qué es lo que quieres hacer con la función para ponerte un ejemplo de acuerdo a eso. No te desanimes si todavía te confundes mucho con esto de los apuntadores en C y C++. Es una de las cosas inevitables con las que se topan todos los programadores en C y C++ más todo es cuestión de programar y programar para llegar a entenderlos.

Neko-sama

  • Miembro activo
  • **
  • Mensajes: 99
    • Ver Perfil
Re: Problema Con Matrices
« Respuesta #4 en: Miércoles 8 de Junio de 2005, 21:53 »
0
agradezco tu pasiencia  :)


para que entiendas que lo que quiero hacer...

Código: Text
  1.  
  2.  
  3. class CTiles {
  4. public:
  5.   ~CTiles();
  6.   void setMatrixTiles(int* matrix, int ancho, int alto);
  7. private:
  8.   int** MatrixTiles;
  9. };
  10.  
  11. void CTiles::setMatrixTiles(int* matrix, int ancho, int alto) {
  12.  
  13.   MatrixTiles = new int* [alto];
  14.   for(int j=0;j<alto;j++) {
  15.     MatrixTiles[j] = new int [ancho];
  16.     for(int i=0;i<ancho;i++) {
  17.       *(MatrixTiles + 2*i + j) = (matrix + 2*i + j);
  18.     }
  19.   }
  20. }
  21.  
  22. CTiles::~CTiles() {
  23.   if(MatrixTiles != NULL ){
  24.     delete[] MatrixTiles;
  25.   }
  26. }
  27.  
  28.  

entonces le envío una matriz así:

Código: Text
  1.  
  2.   int fondo[2][2] = {{1,2},{2,2}}
  3.  
  4.   tile.setMatrixTiles((int *)fondo,25,19);
  5.  
  6.  


bueno...
gracias a lo ultimo que me dijiste...  ahora compila y hace muy bien lo que quiero que haga...

osea... funciona!!!

pero quiero saber que opinas de la funcion...

el unico problema es cuando libero la matriz, ocurre un error... que estoy haciendo mal???

pitukilloloco

  • Miembro MUY activo
  • ***
  • Mensajes: 104
    • Ver Perfil
Re: Problema Con Matrices
« Respuesta #5 en: Miércoles 8 de Junio de 2005, 23:34 »
0
Bueno, ya vi la clase que me mandaste pero sigo sin entender qué es lo qué quieres hacer con esta clase. Veo que al llamar a la función setMatrixTiles lo haces dándole como 1er agumento una matriz de 2x2, y 25 y 19 como los demás argumentos. Dentro de la función solicitas memoria para, al parecer, tener una matriz de ancho x alto, que en este caso sería 25 x 19 ¿para qué? eso sólo su lo sabes. Tienes un ciclo que va de 0 hasta alto - 1 y dentro de este otro más que va de 0 hasta ancho - 1, y le asignas los valores de la matriz que le envías como argumento, en este caso la matriz de 2x2, pero tu recorres el ciclo desde 0 hasta 24 y desde 0 hasta 18, pero siendo la matriz sólo de 2x2, entonces estás accesando valores de la memoria que ya no son de la matriz pasada como argumento. Dependiendo del compilador y del sistema operativo en que estés trabajando esto te puede marcar o no error en tiempo de ejecución. Veamos ahora como asignas la memoria. Primero pides memoria  para tener un arreglo de alto apuntadores (estos apuntadores apuntan a un entero).  Después solicitas, para cada uno de estos apuntadores,  un arreglo de ancho enteros. Cuando liberas la memoria de MatrixTiles con el destructor, estás liberando la memoria para el arreglo de apuntadores, pero no liberas la memoria que solicitaste para cada uno de estos apuntadores. La expresión que usas *(MatrixTiles + 2*i + j) es incorrecta, lo correcto es *(MatrixTiles[j] + j), aquí no es necesario multiplicarlo por 2 ya que no solicitaste la memoria linealmente sino que primero solicitaste un arreglo de apuntadores y después un arrreglo de enteros para cada apuntador. Esto nos lleva de nuevo al asunto del error que te he mencionado (es la tercera vez que te lo digo). Sólo necesitas declarar a MatrixTiles como un apuntador y no como un doble apuntador, y solicitar la memoria linealmente así MatrixTiles = new [alto * ancho].  Ahora ya estaría bien cuando liberas la memoria con el destructor aunque ahí veo otro error, pues preguntas antes si MatrixTiles es nulo, pero esta variable no la inicializas en ninguna parte. Lo corrector sería declarar un constructor e inicializar esta variable a NULL. Si lo que quieres es incializar a la variable MatrixTiles con los valores de una matriz y y sus dimensiones, esta sería una forma de hacerlo
Código: Text
  1.  
  2. class CTiles {
  3. public:
  4.  CTiles () { MatrixTiles = NULL; }
  5.  ~CTiles();
  6.  void setMatrixTiles(int* matrix, int ancho, int alto);
  7. private:
  8.  int* MatrixTiles;
  9. };
  10.  
  11. void CTiles::setMatrixTiles(int* matrix, int ancho, int alto) {
  12.  
  13.  MatrixTiles = new int[alto * ancho];
  14.  for(int j=0;j<alto;j++) {
  15.    for(int i=0;i<ancho;i++) {
  16.      *(MatrixTiles + ancho*j + i) = *(matrix + ancho*j + i);
  17.    }
  18.  }
  19. }
  20.  
  21. CTiles::~CTiles() {
  22.  if(MatrixTiles != NULL ){
  23.    delete[] MatrixTiles;
  24.  }
  25. }
  26.  
  27.  
y llamarías así a la función
Código: Text
  1.  
  2. int fondo[2][2] = {{1,2},{2,2}}
  3.  
  4.  tile.setMatrixTiles((int *)fondo,2,2);
  5.  
  6.  

Neko-sama

  • Miembro activo
  • **
  • Mensajes: 99
    • Ver Perfil
Re: Problema Con Matrices
« Respuesta #6 en: Jueves 9 de Junio de 2005, 07:22 »
0
Te agradezco nuevamente   :gracias:

y te pido perdón...   :losiento:  no te mostré toda la clase porque tiene mucho fuente que no es necesario explicar... y por eso no puse el constructor que inicializaba a MatrixTiles a NULL...

...ademas puse tile.setMatrixTiles((int *)fondo,25,19); por error porque copié de otra parte el fuente... por eso viste el 25 y el 19 que no tenian sentido...


fuí muy duro en entender por que quería llamar desde cualquier punto de mi clase la matriz MatrixTiles de la forma MatrixTiles[y]
  • por eso insistía declararlo de esa forma... pero ahora sí me quedó claro como es la forma correcta (int * MatrixTiles) y todo funciona como debe ser!!!  me haz ayudado mucho con tu respuesta!!!  muchas gracias!!!


quedó funcionando muy bien!!!  :D

he aprendido mas sobre las matrices  :smartass:

nuevamente gracias por tu paciencia!!!