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

Problema.

Estas en el tema de Problema. en el foro de C/C++ en Foros del Web. Bueno, ayer empece con la idea de armar un simulador del Cubo magico de Rubik, e hice el set basico de clases. Main.c: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); ...
  #1 (permalink)  
Antiguo 10/09/2011, 16:27
Avatar de sbcl  
Fecha de Ingreso: julio-2011
Mensajes: 29
Antigüedad: 13 años, 4 meses
Puntos: 5
Problema.

Bueno, ayer empece con la idea de armar un simulador del Cubo magico de Rubik, e hice el set basico de clases.

Main.c:
Código c:
Ver original
  1. #include "classes.c"
  2.  
  3. int main()
  4. {
  5.     cube * test_cube;
  6. }


classes.h:
Código c:
Ver original
  1. enum {RED, BLUE, YELLOW, GREEN, BLACK, WHITE};
  2. class face{
  3.       public:
  4.       int colors[9];
  5.       void fill_face_with_color(int);
  6.       void set_right_column_colors(int*);
  7.       face (int);
  8.       };
  9.  
  10. class cube{
  11.       public:
  12.       face * faces[6];
  13.       void initialize_cube();
  14.       cube ();
  15.       void display_cube_attributes();
  16.       };

classes.c:
Código c:
Ver original
  1. #include "classes.h"
  2.  
  3. void face::fill_face_with_color(int color){
  4.            int x;
  5.            for (x = 0;x < 9; x++){
  6.                colors[x] = color;
  7.                cout << colors[x] << "  ";
  8.                }
  9.            for (x = 0;x < 9;x++){
  10.                cout << colors[x] << "  ";}
  11.            cout << endl;
  12.            }
  13.            
  14. face::face (int color){
  15.            int x;
  16.            for (x = 0;x < 9; x++){
  17.                colors[x] = color;
  18.                }
  19.            }
  20.                          
  21. cube::cube (){
  22.            int x;
  23.            for (x = 0;x < 6;x++){
  24.                face test_face(x); // Aca probe tambien face * test_face(x), face                  *test_face = new face(x), etc.
  25.                cube::faces[x] = &test_face;
  26.                }
  27.            }

Basicamente lo que quiero, es hacer un constructor de la clase Cube, que cuando se cree, llene su array de Faces(caras del cubo mágico), con todos los colores de cada cara iguales.

en resumen, seria para crear un nuevo cubo con todas las caras inicializadas, como si el cubo fuera nuevo.
Pero al tratar el método actual, la aplicación entra en un crash, o si nó, no asigna bien los integers en el array colores[].

Alguien es capaz de decirme que estoy haciendo mal? No le encuentro solución, es una pavada y sin embargo no me doy cuenta que hago mal.
Gracias.
  #2 (permalink)  
Antiguo 10/09/2011, 16:35
Avatar de sbcl  
Fecha de Ingreso: julio-2011
Mensajes: 29
Antigüedad: 13 años, 4 meses
Puntos: 5
Respuesta: Problema.

Disculpen, lo solucioné ya.
no termino de entender por que se solucionó asi, pero funcionó.
el "face test_face(x)" lo cambie por "face * test_face = new face(x)", y por lo visto agarró.
Disculpen la molestia, es que me estaba volviendo loco.
  #3 (permalink)  
Antiguo 14/09/2011, 08:19
 
Fecha de Ingreso: septiembre-2011
Mensajes: 8
Antigüedad: 13 años, 2 meses
Puntos: 3
Respuesta: Problema.

Cita:
Iniciado por sbcl Ver Mensaje
Disculpen, lo solucioné ya.
no termino de entender por que se solucionó asi, pero funcionó.
el "face test_face(x)" lo cambie por "face * test_face = new face(x)", y por lo visto agarró.
Disculpen la molestia, es que me estaba volviendo loco.
Claro, porque usaste una variable puntera a face, lo que implica que debes reservar memoria (con new) para la variable y luego liberarla como es costumbre de hacer con delete
  #4 (permalink)  
Antiguo 15/09/2011, 17:10
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: Problema.

Aunque ya has encontrado la solución, que efectivamente era esa, tienes que entender la razón por la cual funciona.

En lo que tenías antes:

Código C++:
Ver original
  1. cube::cube (){
  2.            int x;
  3.            for (x = 0;x < 6;x++){
  4.                face test_face(x);
  5.                cube::faces[x] = &test_face;
  6.                }
  7.            }

Al crear la variable test_face de manera no dinámica y luego asignarle la dirección de memoria de esa variable en la siguiente línea a cube::faces[x], lo que estás haciendo es que en todas las vueltas del bucle le estás asignando la misma dirección de memoria y,al final, todas las caras del cubo van a apuntar a la misma cara. Si lo vieses con el depurador, te darías cuenta que el valor del array colores es 5 (el del último valor del bucle).

Al utilizar memoria dinámica esto se soluciona porque ahora sí estás asignando diferentes objetos a cada posición del array faces.

A lo mejor ya te has dado cuenta, pero así viene bien si alguien entra y lo ve y no sabe porque es.

Saludos

Etiquetas: const
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 11:50.