• Sábado 14 de Diciembre de 2024, 17:33

Autor Tema:  Pasar De Matriz 2d Por Referencia  (Leído 4965 veces)

..::[JiOn]::..

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Pasar De Matriz 2d Por Referencia
« en: Jueves 12 de Octubre de 2006, 13:41 »
0
Bueno, voy a tratar de resumir lo mas posible mi problema, estoy haciendo un programa con objetos, y tengo un error de compilador al pasar por referencia una matriz de 2 dimensiones de un objeto hacia una funcion de otro objeto. Todo esto haciendolo desde otro objeto diferente.

En codigo:

Código: Text
  1. class clase1
  2. {
  3.         public:
  4.         int tabla[10][10];
  5. }
  6.  
  7. class clase2
  8. {
  9.         public:
  10.         int funcion(int** parametro);
  11. }
  12.  
  13. class clase3
  14. {
  15.          public:
  16.          clase1 cls1;
  17.          clase2 cls2;
  18.  
  19.          int funcion(void);
  20. }
  21.  
  22. clase3::funcion(void)
  23. {
  24.         cls2.funcion(cls1.tabla);
  25. }
  26.  
  27.  

Obviamente este es un codigo reducido, mis clases son mas extensas. el error que me tira es el siguiente, en el llamada a la funcion de cls2:

Código: Text
  1. no matching function for call to 'clase2::funcion(int[10][10])'
  2. note: candidates are: int clase2::funcion(int**)
  3.  
  4.  

Donde esta el error? :unsure:

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #1 en: Jueves 12 de Octubre de 2006, 16:21 »
0
Citar
no matching function for call to 'clase2::funcion(int[10][10])'
note: candidates are: int clase2::funcion(int**)

Tal y como se ve alli:

Código: Text
  1.  
  2. cls2.funcion(cls1.tabla);
  3.  
  4.  

te falta definir la funcion en la clase2

Código: Text
  1.  
  2. clase2::funcion(int**){
  3. ///lo que vayas a hacer con esta funcion
  4. }
  5.  
  6.  
  7.  
Inside the code

..::[JiOn]::..

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #2 en: Jueves 12 de Octubre de 2006, 16:56 »
0
La funcion de clase2 existe en mi codigo, no lo inclui aca para no poner tanto codigo, en realidad mi codigo es bastante mas extenso, por eso no pongo el original. Supongo que estoy usando mal los punteros en algun lado, pero no se donde.

pabloreda

  • Miembro MUY activo
  • ***
  • Mensajes: 125
    • Ver Perfil
    • http://www.reda4.org
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #3 en: Jueves 12 de Octubre de 2006, 18:22 »
0
prueba esto....

Código: Text
  1.  
  2.        cls2.funcion((int**)cls1.tabla);
  3.  
  4.  

no se si va a funcionar....

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #4 en: Jueves 12 de Octubre de 2006, 19:33 »
0
Si lo que querias hacer era acceder con parametro[0][0] te recomiendo que trabajes como si fuera un array unidimensional (al final de cuentas todos los elementos son consecutivos en memoria) como en este ejemplo:

Código: Text
  1.  
  2. #include <stdio.h>
  3.  
  4. class clase1
  5. {
  6.        public:
  7.        int tabla[10][10];
  8.  
  9.        void dump();
  10. };
  11.  
  12. class clase2
  13. {
  14.        public:
  15.        int funcion(int *parametro);
  16. };
  17.  
  18. class clase3
  19. {
  20.         public:
  21.         clase1 cls1;
  22.         clase2 cls2;
  23.  
  24.         int funcion(void);
  25. };
  26.  
  27. void clase1::dump()
  28. {
  29.   for (int y = 0; y < 10; y++)
  30.   {
  31.     for (int x = 0; x < 10; x++)
  32.     {
  33.       printf("%d ", tabla[y][x]);
  34.     }
  35.     printf("\r\n");
  36.   }
  37. }
  38.  
  39. int clase2::funcion(int *parametro)
  40. {
  41.   for (int y = 0; y < 10; y++)
  42.   {
  43.     for (int x = 0; x < 10; x++)
  44.     {
  45.       parametro[y*10+x] = 10 - y;
  46.     }
  47.   }
  48.   return 1;
  49. }
  50.  
  51. int clase3::funcion(void)
  52. {
  53.   cls2.funcion((int*)&cls1.tabla);
  54.   return 0;
  55. }
  56.  
  57. void main()
  58. {
  59.   clase3 hola;
  60.   for (int y = 0; y < 10; y++)
  61.   {
  62.     for (int x = 0; x < 10; x++)
  63.     {
  64.       hola.cls1.tabla[y][x] = y;
  65.     }
  66.   }
  67.   hola.cls1.dump();
  68.   hola.funcion();
  69.   hola.cls1.dump();
  70. }
  71.  
  72.  

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.

..::[JiOn]::..

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #5 en: Viernes 13 de Octubre de 2006, 04:49 »
0
Muchas gracias! Me anda de las dos maneras, voy a ver con que metodo me quedo.  :)

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #6 en: Viernes 13 de Octubre de 2006, 08:08 »
0
Cita de: "..::[JiOn
::.."] Muchas gracias! Me anda de las dos maneras, voy a ver con que metodo me quedo.  :)
Me parece que eso depende muchisimo del codigo que tengas en el metodo funcion de la clase2, seria interesante que nos lo mostraras a grandes rasgos (mas que nada el acceso a parametro).

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.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #7 en: Viernes 13 de Octubre de 2006, 15:09 »
0
Pues si la declaración es así:

Código: Text
  1.  
  2. tabla[ x ][ x ];
  3.  
  4.  

yo me quedaría con la primera:
Código: Text
  1.  
  2. cls2.funcion((int**)cls1.tabla);
  3.  
  4.  
y manejar doble índice. Aunque mejor hazle caso a Eternal Idol y muestra tu código :D.

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #8 en: Viernes 13 de Octubre de 2006, 15:24 »
0
Cita de: "Geo"
Pues si la declaración es así:

Código: Text
  1.  
  2. tabla[ x ][ x ];
  3.  
  4.  

yo me quedaría con la primera:
Código: Text
  1.  
  2. cls2.funcion((int**)cls1.tabla);
  3.  
  4.  
y manejar doble índice. Aunque mejor hazle caso a Eternal Idol y muestra tu código :D.
Proba a acceder con parametro[y]
  • pasando con (int**) y contanos que pasa.

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.

geobeid

  • Miembro activo
  • **
  • Mensajes: 88
    • Ver Perfil
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #9 en: Viernes 13 de Octubre de 2006, 17:00 »
0
porque ponias 2 *??? (
Citar
int funcion(int** parametro);
[size=109]
SI QUERES ENCONTRAR A JESÚS GOOGLEALO
[/size]

..::[JiOn]::..

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #10 en: Lunes 16 de Octubre de 2006, 22:27 »
0
Bueno, al final buscando en internet pude solucionar el problema :) Paso a comentarles como lo hice.

Lo que estoy haciendo un tetris con C++ y SDL mas que nada para agarrarle la mano a SDL y a la POO.

Las tres clases involucradas en este asunto son:

Tablero ---> Contiene un array con los datos de cada casillero del tetris, es un array de 10*20 (Tablero[10][20]) ---> clase 1
Grafica ---> Esta clase es la encargada de imprimir en pantalla el juego, contiene una funcion llamada imprimetablero que pasandole por referencia una matriz de 10*20 la imprime en pantalla como el tablero de tetris. ---> Clase 2
Engine --->  Maneja las colisiones, borra las lineas, lee el teclado mediante otra clase, etc. Es la clase que llama a la funcion imprimetablero pasandole por referencia la tabla contenida en la clase Tablero ---> Clase 3

Probando de la manera que me sugirio pabloreda, el compilador me lo tomaba bien pero en realidad no funcionaba. Iba a probar hacerlo como me sugirio Eternal Idol pero no me queria dar por vencido y queria saber la manera de pasarlo como una matriz 2D y buscando encontre esta solucion:

Código: Text
  1.  
  2. // El codigo de Eternal Idol modificado usando la manera que encontre
  3. #include <stdio.h>
  4.  
  5. class clase1
  6. {
  7.       public:
  8.       int tabla[10][10];
  9.  
  10.       void dump();
  11. };
  12.  
  13. class clase2
  14. {
  15.       public:
  16.       int funcion(int (*parametro)[10][20]);
  17. };
  18.  
  19. class clase3
  20. {
  21.        public:
  22.        clase1 cls1;
  23.        clase2 cls2;
  24.  
  25.        int funcion(void);
  26. };
  27.  
  28. void clase1::dump()
  29. {
  30.  for (int y = 0; y < 10; y++)
  31.  {
  32.    for (int x = 0; x < 10; x++)
  33.    {
  34.      printf("%d ", tabla[y][x]);
  35.    }
  36.    printf("\r\n");
  37.  }
  38. }
  39.  
  40. int clase2::funcion(int (*parametro)[10][20])
  41. {
  42.  for (int y = 0; y < 10; y++)
  43.  {
  44.    for (int x = 0; x < 10; x++)
  45.    {
  46.      parametro[x][y] = 10 - y;
  47.    }
  48.  }
  49.  return 1;
  50. }
  51.  
  52. int clase3::funcion(void)
  53. {
  54.  cls2.funcion(&cls1.tabla);
  55.  return 0;
  56. }
  57.  
  58. void main()
  59. {
  60.  clase3 hola;
  61.  for (int y = 0; y < 10; y++)
  62.  {
  63.    for (int x = 0; x < 10; x++)
  64.    {
  65.      hola.cls1.tabla[y][x] = y;
  66.    }
  67.  }
  68.  hola.cls1.dump();
  69.  hola.funcion();
  70.  hola.cls1.dump();
  71. }
  72.  

Aunque me parece que de la manera propuesta por Eternal Idol estaría consumiendo menos memoria...

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #11 en: Lunes 16 de Octubre de 2006, 23:48 »
0
No me compila  :lol: ¿Que es eso de poner 10 y 20 en vez de 10 y 10 como arriba? Jaja ...

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.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #12 en: Martes 17 de Octubre de 2006, 01:01 »
0
Jaja, lo que escribí es un horror :P. No lo borro para recordar ;). De a rápido me guié por esto:

Citar
Muchas gracias! Me anda de las dos maneras, voy a ver con que metodo me quedo.
Entonces me dije, pues si funciona usa la que parezca más intuitiva, declarar la matriz de doble subíndice explícitamente y manejarla así :P.

Los valores seguramente son 10 y 20, pues si se trata de un tablero del Tetris debieran ser 10 columnas por 20 renglones, nunca he visto un Tetris cuadrado ;).

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

..::[JiOn]::..

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #13 en: Martes 17 de Octubre de 2006, 04:52 »
0
Si, perdon soy re despistado ^_^ , es que iba a escribir minimamente las funciones del tetris partiendo de el codigo que escribio Eternal Idol, y por fiaca :P decidi mostrar la solucion con su codigo original, y olvide cambiar ese 10x20 (tablero del tetris) por el 10x10 original. El otro error mas groso que pase por alto es que para utilizar el parametro por referencia debo hacerlo asi:

Código: Text
  1. (*parametro)[y][x] = 10 - y;
  2.  

y no de la manera que estaba escrita en mi anterior post:

Código: Text
  1. parametro[y][x] = 10 - y;
  2.  

asi que el codigo funcional seria el siguiente:

Código: Text
  1.  
  2. // El codigo de Eternal Idol modificado usando la manera que encontre
  3. #include <stdio.h>
  4.  
  5. class clase1
  6. {
  7.      public:
  8.      int tabla[10][10];
  9.  
  10.      void dump();
  11. };
  12.  
  13. class clase2
  14. {
  15.      public:
  16.      int funcion(int (*parametro)[10][10]);
  17. };
  18.  
  19. class clase3
  20. {
  21.       public:
  22.       clase1 cls1;
  23.       clase2 cls2;
  24.  
  25.       int funcion(void);
  26. };
  27.  
  28. void clase1::dump()
  29. {
  30. for (int y = 0; y < 10; y++)
  31. {
  32.   for (int x = 0; x < 10; x++)
  33.   {
  34.     printf("%d ", tabla[y][x]);
  35.   }
  36.   printf("\r\n");
  37. }
  38. }
  39.  
  40. int clase2::funcion(int (*parametro)[10][10])
  41. {
  42. for (int y = 0; y < 10; y++)
  43. {
  44.   for (int x = 0; x < 10; x++)
  45.   {
  46.     (*parametro)[y][x] = 10 - y;
  47.   }
  48. }
  49. return 1;
  50. }
  51.  
  52. int clase3::funcion(void)
  53. {
  54. cls2.funcion(&cls1.tabla);
  55. return 0;
  56. }
  57.  
  58. int main()
  59. {
  60. clase3 hola;
  61. for (int y = 0; y < 10; y++)
  62. {
  63.   for (int x = 0; x < 10; x++)
  64.   {
  65.     hola.cls1.tabla[y][x] = y;
  66.   }
  67. }
  68. hola.cls1.dump();
  69. hola.funcion();
  70. hola.cls1.dump();
  71. }
  72.  
  73.  

Esta vez probado con compilador, 100% funcional garantizado :P
Gracias por el interes y la ayuda.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Pasar De Matriz 2d Por Referencia
« Respuesta #14 en: Martes 17 de Octubre de 2006, 08:13 »
0
Cita de: "..::[JiOn
::.."] Esta vez probado con compilador, 100% funcional garantizado :P
Gracias por el interes y la ayuda.
Ahora si me funciona; entonces sera cuestion de ver tu problema especificamente y comprobar que te resulta mas comodo (no te olvides que ese tamaño (10, 20) mañana puede cambiar ...) de implementar y mantener.

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.