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

problema SDL carga imagenes

Estas en el tema de problema SDL carga imagenes en el foro de C/C++ en Foros del Web. buenas, resulta que hoy, en un solo proyecto de SDL (quiero decr, en el resto funciona) la carga de imagenes con SDL_LoadBMP(), y en otros ...
  #1 (permalink)  
Antiguo 17/08/2010, 04:43
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 15 años
Puntos: 2
Pregunta problema SDL carga imagenes

buenas, resulta que hoy, en un solo proyecto de SDL (quiero decr, en el resto funciona) la carga de imagenes con SDL_LoadBMP(), y en otros proyectos la carga de imagenes funciona perfectamente. el codigo con el que cargo es ese:
Código C:
Ver original
  1. //codigo
  2. int carga_imagenes(SDL_Surface *imagenes[IMAGENES]){
  3.     imagenes[BORRADOR]   = SDL_LoadBMP("borrador.bmp");
  4.     imagenes[CONSERJE]   = SDL_LoadBMP("conserje.bmp");
  5.     imagenes[ESQUINA_DA] = SDL_LoadBMP("esquina_da.bmp");
  6.     imagenes[ESQUINA_DD] = SDL_LoadBMP("esquina_dd.bmp");
  7.     imagenes[ESQUINA_IA] = SDL_LoadBMP("esquina_ia.bmp");
  8.     imagenes[ESQUINA_ID] = SDL_LoadBMP("esquina_id.bmp");
  9.     imagenes[PARED_H]    = SDL_LoadBMP("pared_h.bmp");
  10.     imagenes[PARED_V]    = SDL_LoadBMP("pared_v.bmp");
  11.     imagenes[PERSONAJE]  = SDL_LoadBMP("personaje.bmp");
  12.     imagenes[PROFESOR]   = SDL_LoadBMP("profesor.bmp");
  13.     imagenes[PUERTA]     = SDL_LoadBMP("puerta.bmp");
  14.     imagenes[SUELO]      = SDL_LoadBMP("suelo.bmp");
  15.     imagenes[TIZA]       = SDL_LoadBMP("Tiza.bmp");
  16.  
  17.     for(int i=0; i<=IMAGENES; i++){
  18.         if(imagenes[i]==NULL){
  19.             printf("No se puede cargar las imagenes: %s", SDL_GetError());
  20.             exit(1);
  21.         }
  22.     }
  23.     return 0;
  24.  
  25. //codigo
  26. }
y el uso es este:
Código C:
Ver original
  1. SDL_Surface *imagen, *imagenes[IMAGENES];
  2. carga_imagenes(imagenes);

las constantes usadas son:
Código C:
Ver original
  1. #define IMAGENES 12
  2. #define BORRADOR 0
  3. #define CONSERJE 1
  4. #define ESQUINA_DA 2
  5. #define ESQUINA_DD 3
  6. #define ESQUINA_IA 4
  7. #define ESQUINA_ID 5
  8. #define PARED_H 6
  9. #define PARED_V 7
  10. #define PERSONAJE 8
  11. #define PROFESOR 9
  12. #define PUERTA 10
  13. #define SUELO 11
  14. #define TIZA 12

creo que el problema puede estar en donde colocar las imagenes. en otros proyectos estaban colocadas (sin estar introducidas en ninguna carpeta extra) en la misma carpeta que el ejecutable, y funciona perfectamente, sin enbargo este metodo no funciona en este proyecto. el IDE que uso es Code::Blocks, con todo lo que ello implica (organizacion de carpetas, de archivos, ejecutables, ...)

me seriais de gran ayuda si me pudierais echar una mano. gracias por adelantado :)
  #2 (permalink)  
Antiguo 17/08/2010, 11:40
Avatar de calambrenet  
Fecha de Ingreso: julio-2010
Ubicación: Jaén
Mensajes: 162
Antigüedad: 14 años, 4 meses
Puntos: 18
Respuesta: problema SDL carga imagenes

¿Por qué no pruebas de otro modo haber qué pasa? Cambia la función carga_imagenes para que devuelva SDL_Surface *imagenes o NULL si ha habido un error.

SDL_Surface *imagen=carga_imagenes();
if (imagen==NULL)
cout<<"ERROR";


o


SDL_Surface *imagen[NOSECUAL]=carga_imagenes(NOSECUAL);

Haber qué pasa.
Por cierto, las constantes TIZA e IMAGENES usan el mismo valor, míralo.
  #3 (permalink)  
Antiguo 17/08/2010, 13:25
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 15 años
Puntos: 2
Respuesta: problema SDL carga imagenes

bien, he cambiado el tipo de retorno, ahora esa parte "va bien", ahora, usando el depurador de C::B (gdb) he visto que unas lineas despues salta un seg. fault, y no lo comprendo (se lo que es, lo que no se es la causa). a continuacion el codigo problematico:
Código C:
Ver original
  1. SDL_Surface *imagen, *imagenes[IMAGENES];
  2.     carga_imagenes(imagenes);
  3.  
  4.     SDL_Rect posicion;
  5.  
  6.     posicion.x = 0;
  7.     posicion.y = 0;
  8.     posicion.w = imagenes[PERSONAJE]->w; //segmentation fault
  9.     posicion.h = imagenes[PERSONAJE]->h;

lo de la constante, creo que en principio no tendria que importar, ya que el preprocesador sutituye antes de la compilacion TIZA por 12, y hara lo mismo con IMAGENES. muchas gracias, de verdad ;) .
  #4 (permalink)  
Antiguo 17/08/2010, 14:09
Avatar de calambrenet  
Fecha de Ingreso: julio-2010
Ubicación: Jaén
Mensajes: 162
Antigüedad: 14 años, 4 meses
Puntos: 18
Respuesta: problema SDL carga imagenes

Tienes una manía fea ;) Pones unos identificadores muy parecidos entre distinto tipo y lleva a confusión.
Por ejmplo "SDL_Surface *imagen, *imagenes[IMAGENES];" estaría mejor "SDL_Surface *srf_imagen, *srf_imagenes[MAX_IMAGENES];" creo que así estaría mas sencillo y menos confuso.

Después para que imagenes (SDL_SURFACE) tenga un valor debe recogerlo de carga_imagenes. Seguro que si pones esto no te da error:

if(imagenes)
{
posicion.w = imagenes[PERSONAJE]->w; //segmentation fault
posicion.h = imagenes[PERSONAJE]->h;
}

Eso es porque el valor de imagenes es NULL
si la función carga_imagenes devuelve un puntero de SDL_SURFACE debes poner
imagenes = caga_imagenes(imagenes);

Creo que deberías plantearlo de otra manera.
Un saludo.
  #5 (permalink)  
Antiguo 17/08/2010, 14:20
Avatar de calambrenet  
Fecha de Ingreso: julio-2010
Ubicación: Jaén
Mensajes: 162
Antigüedad: 14 años, 4 meses
Puntos: 18
Respuesta: problema SDL carga imagenes

Por cierto: si usas un sistema de valor por referencia no puedes usar el valor por retorno. O uno u otro.
Si quieres me puedes mandar por privado o por email el fichero fuente y te lo miro. Sólo el fichero que te da problemas.
  #6 (permalink)  
Antiguo 17/08/2010, 15:13
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 15 años
Puntos: 2
Respuesta: problema SDL carga imagenes

gracias, te lo mando por privado. por cierto, la solucion de if(imagenes) no me sirve, pues se introduce dentro del if.
  #7 (permalink)  
Antiguo 17/08/2010, 15:30
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: problema SDL carga imagenes

No estoy seguro, pero puede ser que SDL_Surface *imagenes[IMAGENES]; no este cargando bien la memoria como quieres.

Prueba con esto:

SDL_Surface **imagenes = (**SDL_Surface) malloc(12*sizeof(*SDL_Surface));
  #8 (permalink)  
Antiguo 18/08/2010, 04:52
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 15 años
Puntos: 2
Respuesta: problema SDL carga imagenes

sam90, gracias. bueno, lo primero es que mara que pudiera compilar tuve que pasar de esto
Código C:
Ver original
  1. SDL_Surface **imagenes = (**SDL_Surface) malloc(12*sizeof(*SDL_Surface));
a esto
Código C:
Ver original
  1. SDL_Surface **imagenes = (SDL_Surface**) malloc(NUM_IMAGENES*sizeof(SDL_Surface*));
  2. //NUM_IMAGENES es una constante definida cono 12

y segundo, sigue sin solucionar el error, sigue saltando el seg. fault en ese punto, pero muchas gracias. voy a buscar por ahi como depurar este tipo de errores, no solo por esto, sino porque en el futuro me puedo encontrar con mas de esto. si consigo avanzar en algo os lo comunicare en cuanto pueda.
  #9 (permalink)  
Antiguo 18/08/2010, 07:05
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 15 años
Puntos: 2
Respuesta: problema SDL carga imagenes

vale, tengo "novedades". usando gbd he averiguado que al momento de la inizalizacion de el post de arriba las variables de imagenes[] tienen asignadas una direccion de memoria, pero es a partir de
Código C:
Ver original
  1. carga_imagenes(imagenes);
cuando valen 0x0, es decir, NULL, el problema esta en esa funcion, ahora toca revisarla

Edit: vale, dentro de esa funcion (la definicion esta en el 1er post) se hacen llamadas a
Código C:
Ver original
  1. SDL_LoadBMP(ruta);
despues de cada llamada, si se guarda en imagenes[0] lo que realmente se almacena es NULL. ya esta localizado el problema. voy a jugar un poco con la localizacion de las imagenes y os cuento.

P.D.: amo al creador de gdb.

Última edición por stiwi222; 18/08/2010 a las 07:11
  #10 (permalink)  
Antiguo 18/08/2010, 10:08
Avatar de calambrenet  
Fecha de Ingreso: julio-2010
Ubicación: Jaén
Mensajes: 162
Antigüedad: 14 años, 4 meses
Puntos: 18
Respuesta: problema SDL carga imagenes

Estoy mirando lo tuyo.
es bueno iniciar las instancias con NULL
"SDL_Surface *imagen, *imagenes[IMAGENES] = NULL;"
  #11 (permalink)  
Antiguo 18/08/2010, 10:26
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 15 años
Puntos: 2
Respuesta: problema SDL carga imagenes

tienes razon, pero de no ser porque no hice eso no hubiera averiguado tan facilmente que la segfault venia de ahi (aunque lo intuia)
  #12 (permalink)  
Antiguo 18/08/2010, 12:40
 
Fecha de Ingreso: mayo-2008
Ubicación: Chile
Mensajes: 189
Antigüedad: 16 años, 6 meses
Puntos: 3
Respuesta: problema SDL carga imagenes

dijiste que en otro entornos trabajaba bien, tal vez en code blocks el ejecutable sale en alguna carpeta como debug o bin, y las imagenes deben ser colocadas ahi.
Para organizarlas en una carpeta cambia: nombre.bmp por nombre-carpeta/nombre.bmp (y la carpeta debe estar junto al ejecutable).

Eso de usar malloc, yo uso SDL y nunca utilizo malloc, asi que no es necesario (siempre que trabajes en c++).
__________________
si tienes entre 18 y 20 años... entonces tienes 19 años xD
  #13 (permalink)  
Antiguo 18/08/2010, 12:41
Avatar de calambrenet  
Fecha de Ingreso: julio-2010
Ubicación: Jaén
Mensajes: 162
Antigüedad: 14 años, 4 meses
Puntos: 18
Respuesta: problema SDL carga imagenes

En c tampoco es necesario.
  #14 (permalink)  
Antiguo 18/08/2010, 12:51
 
Fecha de Ingreso: mayo-2008
Ubicación: Chile
Mensajes: 189
Antigüedad: 16 años, 6 meses
Puntos: 3
Respuesta: problema SDL carga imagenes

bueno, pido perdon por equivocarme, es que en los programas de c siempre veo malloc, pero yo trabajo en c++ y nunca uso malloc. asi que pense que para reservar un puntero en c se debia usar malloc
__________________
si tienes entre 18 y 20 años... entonces tienes 19 años xD
  #15 (permalink)  
Antiguo 18/08/2010, 12:54
Avatar de calambrenet  
Fecha de Ingreso: julio-2010
Ubicación: Jaén
Mensajes: 162
Antigüedad: 14 años, 4 meses
Puntos: 18
Respuesta: problema SDL carga imagenes

Tienes que pensar en malloc() o free() de c como new o delete de c++. (con algunas diferencias...)
  #16 (permalink)  
Antiguo 18/08/2010, 13:30
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: problema SDL carga imagenes

Tanto en C/C++ esta la funcion malloc y free.

Y la diferencia que hay entre estas y new,delete es que estas ultimas se utilizan para generar objetos. LLamando a su respectivo constructor o destructor.
  #17 (permalink)  
Antiguo 19/08/2010, 09:36
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 15 años
Puntos: 2
Respuesta: problema SDL carga imagenes

bien, he movido las imagenes a una carpeta llamada "sprites"(cambiando el codigo correspondiente), y la he puesto en la carpeta creada por C::B al crear el proyecto, y ahora carga las imagenes!!. bueno, solo hasta que llega a la 8, momento en que no carga esa imagen. seguire investigando.

edit: vale, he tenido que abrirla con Paint y volver a guardarla para que funcionara. ahora volvemos al principio, segfaut en el mismo punto, bueno, no hay que perder la esperanza.

edit2: oh, le he pedido que dibujara imagenes[0] y funciona, pero a partir de ahi... el resto de imagenes[algo]no va...

edit3: rectifico, no es que no vaya, sino que solo carga la imagen[0], independientemente de cual sea la proporcionada.

Última edición por stiwi222; 19/08/2010 a las 09:48
  #18 (permalink)  
Antiguo 19/08/2010, 13:05
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 15 años
Puntos: 2
Respuesta: problema SDL carga imagenes

este es el codigo que me da problemas ahora (lo que me referia arriba). primero la definicion de la funcion:
Código C:
Ver original
  1. void dibuja_imagen(SDL_Rect *posicion, SDL_Surface *imagen, SDL_Surface *pantalla){
  2.     SDL_BlitSurface(imagen, NULL, pantalla, posicion);
  3.     SDL_Flip(pantalla);
  4. }
y este es el uso:
Código C:
Ver original
  1. SDL_Rect posicion;
  2. SDL_Surface* pantalla = SDL_SetVideoMode(1000, 500, 24,
  3.                                            SDL_HWSURFACE|SDL_DOUBLEBUF);
  4. dibuja_imagen(&posicion, imagenes[TIZA], pantalla);
si el segundo parametro de dibuja_imagenes es *imagenes se muestra la 1º imagen. he pensado que de esta manera(la del codigo) se solucionaria, pero no muestra nada en la pantalla (pero no da error)
  #19 (permalink)  
Antiguo 20/08/2010, 09:26
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 9 meses
Puntos: 1
Respuesta: problema SDL carga imagenes

sam90 estas en un error, la diferencia entre (free , malloc) y (delete y new), es que la primeros no son capaces de asignar sectores de memoria no continuos. Ademas delete y new pueden ser utilizados para manipular arreglos de no objectos. Y si no estas programando C puro, entoces utiliza new y delete.
  #20 (permalink)  
Antiguo 20/08/2010, 10:36
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: problema SDL carga imagenes

Cita:
Iniciado por margarito04 Ver Mensaje
sam90 estas en un error, la diferencia entre (free , malloc) y (delete y new), es que la primeros no son capaces de asignar sectores de memoria no continuos. Ademas delete y new pueden ser utilizados para manipular arreglos de no objectos. Y si no estas programando C puro, entoces utiliza new y delete.
No entendi cual es el error que dices que sam cometió.
Si dices que lo que estuvo mal es que new y delete invocan el constructor y destructor, pues entonces tienes que revisar tus apuntes pues en eso sam tiene razon. malloc y free no lo pueden lograr, mientras que new y delete si.
Debo ser yo quien no entendio lo que quisiste decir.
Que es lo malo de lo que sam dijo?
  #21 (permalink)  
Antiguo 20/08/2010, 14:31
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 9 meses
Puntos: 1
Respuesta: problema SDL carga imagenes

En el echo de que dice que new y delete se usan solo para crear y destruir arreglos de objectos, y eso no es cierto también se pueden utilizar para crear y destruir arreglos de variables. Lee estos articulos

http://www.codeproject.com/KB/tips/newandmalloc.aspx

http://wiki.answers.com/Q/What_is_th...er_than_syntax
  #22 (permalink)  
Antiguo 23/08/2010, 04:17
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 15 años
Puntos: 2
Respuesta: problema SDL carga imagenes

y ademas new y delete son operadores, no funciones, y pueden ser sobrecargados
  #23 (permalink)  
Antiguo 23/08/2010, 05:21
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 15 años
Puntos: 2
Respuesta: problema SDL carga imagenes

bien, ya esta, he conseguido cargar la imagen que quiera. este es el codigo resultante: la funcion
Código C:
Ver original
  1. int carga_imagenes(SDL_Surface *imagenes[]){        
  2.  
  3.  
  4.     if((imagenes[BORRADOR] = SDL_LoadBMP("sprites/borrador.bmp"))  ==NULL)
  5.     return NULL;                          
  6.     if((imagenes[CONSERJE] = SDL_LoadBMP("sprites/conserje.bmp"))  ==NULL)
  7.     return NULL;
  8.     if((imagenes[ESQUINA_DA] = SDL_LoadBMP("sprites/esquina_da.bmp"))==NULL)
  9.      return NULL;
  10.     if((imagenes[ESQUINA_DD] = SDL_LoadBMP("sprites/esquina_dd.bmp"))==NULL)
  11.     return NULL;
  12.     if((imagenes[ESQUINA_IA] = SDL_LoadBMP("sprites/esquina_ia.bmp"))==NULL)
  13.     return NULL;
  14.     if((imagenes[ESQUINA_ID] = SDL_LoadBMP("sprites/esquina_id.bmp"))==NULL)
  15.     return NULL;
  16.     if((imagenes[PARED_H] = SDL_LoadBMP("sprites/pared_h.bmp"))    ==NULL)
  17.     return NULL;
  18.     if((imagenes[PARED_V] = SDL_LoadBMP("sprites/pared_v.bmp"))    ==NULL)
  19.     return NULL;
  20.     if((imagenes[PERSONAJE] = SDL_LoadBMP("sprites/Personaje.bmp"))    ==NULL)
  21.     return 0;
  22.     if((imagenes[PROFESOR] = SDL_LoadBMP("sprites/profesor.bmp"))    ==NULL)
  23.     return NULL;
  24.     if((imagenes[PUERTA] = SDL_LoadBMP("sprites/puerta.bmp"))    ==NULL)
  25.     return NULL;
  26.     if((imagenes[SUELO] = SDL_LoadBMP("sprites/suelo.bmp"))    ==NULL)
  27.     return NULL;
  28.     if((imagenes[TIZA] = SDL_LoadBMP("sprites/Tiza.bmp"))    ==NULL)
  29.     return NULL;
  30.  
  31.     return 1;        //si todo ha ido ok return 1
  32. }

y el uso:
Código C++:
Ver original
  1. SDL_Surface *imagenes[NUM_IMAGENES];
  2.  
  3.     carga_imagenes(imagenes);
  4.  
  5.     SDL_Rect posicion[IMAGENES_X][IMAGENES_Y];
  6.  
  7.  
  8.     dibuja_imagen(posicion[0][0], *imagenes[2], pantalla);

muchas gracias a todos
  #24 (permalink)  
Antiguo 23/08/2010, 07:32
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: problema SDL carga imagenes

Cita:
Iniciado por margarito04 Ver Mensaje
En el echo de que dice que new y delete se usan solo para crear y destruir arreglos de objectos, y eso no es cierto también se pueden utilizar para crear y destruir arreglos de variables.
Nuevamente y despues de releer el ultimo msg de sam90 que dice:

Cita:
Iniciado por sam90
Y la diferencia que hay entre estas y new,delete es que estas ultimas se utilizan para generar objetos. LLamando a su respectivo constructor o destructor.
.. me inclino a pensar que sam90 tiene razón.

new y delete son capaces de invocar el constructor y destructor de un objeto. No importa el esfuerzo que hagas, no podrás hacer lo mismo con malloc y free.

Busco, entre lo que sam90 dijo, las palabras "solo" y "arreglo", que dices que sam90 equivoca al mencionar y no las pude encontrar.

El hecho que new y delete tengan una propiedad y se diga que esos operadores la tienen, no implica que es la única que tienen. Esa implicancia no está en el texto que escribió sam, sino que parece ser una extrapolacion (errada) de lo que se dijo.

Estoy defendiendo la idea expuesta respecto a new y delete, que en mi opinion, es correcta.

Dado que has dado como argumento algo que no se ha dicho, supongo entonces que debe haber un mensaje que se perdió entremedio, pero seria bueno saber si estas de acuerdo con la idea que está detrás: new y delete invocan los constructores / destructores de los objetos (y, para completar) no siendo lo único que pueden hacer.

Etiquetas: carga, imagenes, sdl
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 07:11.