problema manipulacion por referencia

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

problema manipulacion por referencia

Notapor maije » Lun Jun 02, 2008 1:42 pm

hola a tod@s.
estoy creando un api de botonera, entonces me he creado una clase boton y luego una clase menu.

primero creo una instancia de la clase boton: (constructor):

Código: Seleccionar todo
JFSboton::JFSboton() {
   alpha = NULL;
   _x = 0;
   _y = 0;
   _h = 0;
   _w = 0;
}

JFSboton boton1;



en la clase menu, hay una variable que es un array dinamico de punteros a botones


Código: Seleccionar todo
static const int numMaxElementos = 20;
JFSboton *elementos;


en el constructor hago esto

Código: Seleccionar todo
elementos = (JFSboton *) malloc (numMaxElementos*sizeof(JFSboton));


despues, una funcion de añadir botones al menu:

Código: Seleccionar todo
void JFSmenu::adjuntarBoton(JFSboton *botonAdd) {
   ordenado = false;
   this->numItems++;
   botonAdd->setID(numItems);
   printf("\nbotonAdd id: %i", botonAdd->getID());
   elementos[numItems-1] = *botonAdd;
   printf("\nañadido a la lista");
   
}


para despues colocar todos los elementos donde deben estar:

Código: Seleccionar todo
void JFSmenu::distribuirMenu(presentacion tipoPresentacion, int separacion) {
   for (int i = 0; i < numItems; ++i) {
      //presentacion vertical de la botonera
      if (tipoPresentacion == 0) {
         elementos[i]._x = this->_x + this->_w/2 - elementos[i]._w/2;
         if (i == 0) {
            elementos[i]._y = this->_y + separacion;
         } else {
            elementos[i]._y = elementos[i-1]._y + elementos[i-1]._h + separacion;
         }
      //presentacion horizontal de la botonera
      } else {
         elementos[i]._y = this->_y + this->_h/2 - elementos[i]._h/2;
         if (i == 0) {
            elementos[i]._x = this->_x + separacion;
         } else {
            elementos[i]._x = elementos[i-1]._x + elementos[i-1]._w + separacion;
         }
      }
   }
   ordenado = true;
}


una vez hecho esto, me ha colocado correctamente los 'n' botones dentro del area de menu, etc., etc. pero si luego le pregunto a un boton por su componente X me dice que es 0, tal y como se lo especifique en el constructor, o sea que no ha cambiado su valor aunque esten correctamente colocados. esto me causa conflictos a la hora de hacer funciones onRollOver u onClick y cosas asi y no encuentro el fallo.

por supuesto, estos codigos los he extraido de mis archivos .h y .cpp y por si solos no compilan. si no veis el error, puedo subir los archivos de codigo fuente a un servidor temporal para que os los descargueis y lo probeis. las librerias que uso son la SDL estandar y la SDL_image.
espero haberme expresado suficientemente bien.

muchas gracias a tod@s
atentamente
maije
maije
 
Mensajes: 20
Registrado: Lun Dic 17, 2007 6:20 pm

Notapor maije » Lun Jun 02, 2008 3:05 pm

creo que no sera suficiente con esas lineas de codigo, asi que aqui os pongo una URL donde os podeis descargar todos los archivos de codigo fuente del programa. espero que alguien pueda ayudarme porque estoy realmente desesperado.

http://maije2.iespana.es/videojuego/

un saludo
atentamente
maije
maije
 
Mensajes: 20
Registrado: Lun Dic 17, 2007 6:20 pm

Re: problema manipulacion por referencia

Notapor hugoruscitti » Mar Jun 17, 2008 4:50 pm

maije escribió:...
despues, una funcion de añadir botones al menu:

Código: Seleccionar todo
void JFSmenu::adjuntarBoton(JFSboton *botonAdd) {
   ordenado = false;
   this->numItems++;
   botonAdd->setID(numItems);
   printf("\nbotonAdd id: %i", botonAdd->getID());
   elementos[numItems-1] = *botonAdd;
   printf("\nañadido a la lista");
   
}


Me resulta poco habitual la sentencia:

Código: Seleccionar todo
elementos[numItems-1] = *botonAdd;


generalmente en C y C++ se construyen estructuras compuestas
sin des-referenciar punteros... sería bueno que busques compilar
el programa con un compilador compatible con GCC (por ejemplo
usando el IDE DEV-C++), de forma que podamos ver en detalle
el funcionamiento del programa usando una herramienta como
DDD desde GNU/Linux. Es un obstáculo muy grande para
nosotros ayudar si usas Windows, dado que las herramientas
de desarrollo son diferentes...

Para conocer la herramienta que yo usaría para encontrar el
problema desde GNU/Linux observa los siguientes mensajes:

- http://www.losersjuegos.com.ar/foro/viewtopic.php?t=318
- http://www.losersjuegos.com.ar/foro/viewtopic.php?t=162

lamentablemente no pude compilar tu programa en GNU/Linux a
causa de esas pequeñas incompatibilidades entre GCC y el
compilador (VC imagino) que estás utilizando.

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor maije » Mié Jun 18, 2008 11:01 am

puede que tengas razon y el problema este en la sentencia de asignacion de punteros al array. como se podria hacer entonces? como puedo crear un array de punteros a objetos de una clase y rellenarlo mediante una funcion que reciba el objeto a insertar? quizas lo este planteando mal y no deba de ser un array de punteros a objetos... pero como plantear un menu sino como una matriz de botones? y siendo una matriz de botones, como hacer para que si hago un cambio en la matriz, que se refleje luego tambien en los botones por separado para que los metodos de deteccion de eventos (onRollOver, onRollOut, onRelease, etc.), que son locales a la clase boton, funcionen como deben? la unica respuesta que se me ocurrio fue un array de punteros a botones, los paso por referencia y listo, pero no funciona, me los coloca bien, pero no reconoce que se pase sobre ellos.
si a alguien se le ocurre otra forma de plantear el problema, por favor, que postee.
en cuanto al editor que uso, VC2008, la verdad es que estoy un poco harto de la cantidad de archivos que genera y los problemas de visibilidad de sus ejecutables en otros pc's...
voy a echar un vistado al DEV-C++ a ver si os puedo facilitar un poco las cosas y podeis probar el codigo desde linux.

estoy enormemente agradecido por tu respuesta hugo, muchisimas gracias. estoy terriblemente atascado y cualquier muestra de interes y aportacion de ideas es mucho mas que bienvenida. en cuanto consiga compilarlo con DEV-C++ lo dire en este post.

PD: disculpa que tardara en constestar, vi tu respuesta ayer a la 1 de la mañana, pero me iba ya y preferi leer con mas detenimiento tu respuesta por la mañana.

un saludo
muchisimas gracias
atentamente
maije
maije
 
Mensajes: 20
Registrado: Lun Dic 17, 2007 6:20 pm

Notapor hugoruscitti » Mié Jun 18, 2008 9:16 pm

maije escribió:puede que tengas razon y el problema este en la sentencia de asignacion de punteros al array. como se podria hacer entonces? como puedo crear un array de punteros a objetos de una clase y rellenarlo mediante una funcion que reciba el objeto a insertar?


A mi entender lo mas sencillo sería utilizar bibliotecas como STL
que ya te proveen rutinas funcionando para manejar estructuras
como listas o vectores. Aquí tienes algunos tutoriales al respecto:

http://decsai.ugr.es/~mgs/ta/stl.html
http://www.mochima.com/tutorials/STL.html

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor maije » Jue Jun 19, 2008 10:57 am

buenas hugo, lo primero que quiero hacer es agradecerte todas las molestias que te estas tomando y la cantidad de informacion que me estas proporcionando.

ya he instalado el DEV-CPP en mi ordenador y estoy empezando a trastear con el. la verdad es que tiene buena pinta y parece que la portabilidad de programas de un pc a otro no resultara ningun problema, cosa que me alegra enormemente porque me quita preocupaciones. la inclusion de las bibliotecas es menos intuitiva que con el VC, pero es un mal menor y un precio demasiado bajo como para no pagarlo ;-). he leido varias veces tu articulo para instalar el programa y luego añadirle las blibliotecas y los includes y me parece que esta perfectamente explicado y que todo funciona como deberia si se siguen los pasos tal cual estan escritos, felicidades.
de todas formas, seria interesante hacer una miniactualizacion, puesto que el articulo funciona para la version que indicas, pero no para las ultimas versiones (SDL.1.2.13), en las que da un error del linker cuando vas a compilarlo. no se si habria que modificar mucho o poco. intentare investigar por mi cuenta tambien.

en cuanto al tema de STL, tambien me acabas de descubrir un mundo que me ahorrara muchas horas de programar tedios tales como escribir las funciones de insercion, eliminacion, busqueda, etc...en todo tipo de listas, arrays, pilas, colas, etc... tengo hechos packs de funciones, pero para otros lenguajes, asi que me viene de lujo. de todas formas, creo que seguiria en el mismo problema que tengo ahora mismo usando STL, puesto que mi problema esta en el paso por referencia: yo quiero crear un array de elementos que se rellene con elementos existentes y que al modificar el array, se modifiquen los valores de los elementos fuera del array tambien. eso lo hago empleando en vez de un array de elementos, un array de punteros a elementos y en el caso de emplear STL, temo estar en el mismo problema. mi conocimiento de STL se limita a las dos webs que me has linkeado en tu respuesta y a un poco que he mirado por el google asi que no tengo porque tener razon.

ahora voy a intentar compilar el programa en el devCPP para que puedas probarlo y ver por ti mismo el error. en cuanto este listo, lo posteare como respuesta en este mismo tema con el enlace a la web donde podras descargarte el codigo fuente.

muchisimas gracias y disculpa las molestias.
un saludo
atentamente
maije
maije
 
Mensajes: 20
Registrado: Lun Dic 17, 2007 6:20 pm

Notapor maije » Jue Jul 03, 2008 11:59 am

hola hugo
siento la tardanza en hacer estas cosas, pero he tenido un par de semanas bastante liadas con las declaraciones de hacienda, preinscripciones para unos cursos y trabajo y no he podido sacar tiempo hasta hoy, que he terminado con casi todo....uffff.

he probado ya el devCPP y estoy muy contento con el. he logrado ejecutar mis exes en los demas pcs y con el tema de las librerias actualizadas que te comente no he tenido ningun problema, porque encontre en las actualizaciones bibliotecas extras entre las que se encuentran las SDL y algunas mas muy interesantes, asi que me las instala automaticamente y luego solo tengo que añadir la linea que especificas en las opciones del compilador.

te vuelvo a dejar en el mismo sitio los archivos, esta vez te he puesto los archivos de imagenes, los .cpp, el .h, el .win que me pediste, dos .o, que no se para que son, pero por si acaso :P, y todas las librerias necesarias (SDL y SDL_image). a parte tambien incluyo los stderr.txt y stdout.txt.

http://maije2.iespana.es/videojuego/

espero que esta vez puedas ver el codigo y probarlo. ahora al ejecutarlo el devCPP no me muestra nada, supongo que sera porque encuentra el error que cometia en el VC y se cierra la ventana nada mas abrirse. lo malo es que el stderr.txt esta limpio... ya me contaras

muchisimas gracias
atentamente
maije
maije
 
Mensajes: 20
Registrado: Lun Dic 17, 2007 6:20 pm


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron