Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

Array de Surfaces .. Problemas

12 views
Skip to first unread message

Cristian Segura

unread,
Dec 20, 2007, 11:33:29 AM12/20/07
to SDL en Español
Estimados amigos del Foro SDL.

Antes que nada les deseo lo mejor para este fin de año que se acerca
rápidamente.
Bueno mi consulta es la siguiente:

Datos Laptop:

SO: Windows XP
Compilador: Dev-C++ 4.9.9.2
Procesador: Intel Celeron M 1.6 GHz
T. Video: S3 ProIGP Integrada (64MB memoria compartida)
RAM: 512MB
Sonido: Realtek AC97 Compatible

PROBLEMA:

Para simplificar la tarea de cargar muchas superficies y "blitearlas"
a la pantalla decidí utilizar arreglo con todas ellas, por ejemplo

int main(int argc, char *argv[])
{
SDL_Surface *screen;
SDL_Surface *images[10]; //array de superficies
//etc...

imags[0] = IMG_Load("imagen1.png");
if(images[0]==NULL){ fprintf(stderr,"IMG_Load Error: %s\n",
SDL_GetError()); }

imags[1] = IMG_Load("imagen2.png");
if(images[0]==NULL){ fprintf(stderr,"IMG_Load Error: %s\n",
SDL_GetError()); }

//etc..

imags[9] = IMG_Load("imagen9.png");
if(images[9]==NULL){ fprintf(stderr,"IMG_Load Error: %s\n",
SDL_GetError()); }

//Resto del programa: lazo de eventos, etc ...

//Liberación de memoria
for(i=0;i<10;i++)
SDL_FreeSurface(images[i]);

return 0;
}


Bueno como verán el codigo no es muy complicado, el problema es que al
cargar muchas superficies (más de 8 o 10) en la función main, luego,
cuando se quiere hacer los mismo desde alguna función el programa se
cae y se observan mensajes de error del tipo (SDL_GetError()):

Error: Problema con libpng-10.dll, el programa ha tratado de acceder a
un área no válida de la memoria.

Mi pregunta(s) es la siguiente:

¿Existe alguna restricción de la cantidad de surfaces que se pueden
crear?
y si esto es cierto ¿cuánto es el número máximo que puedo crear con
seguridad sin esperar que el programa se caiga por tratar de escribir
en zonas no válidas de memoria?

¿Será necesario crear una sola y gran imagen (tiles como se le llama
usualmente) con todas las imágenes a utilizar y luego jugar con los
rectángulos (SDL_Rect) para Blitearlas separadamente?



Esperando consejos me despido

Atte.
Cristian Segura

Leandro Ostera

unread,
Dec 20, 2007, 1:01:47 PM12/20/07
to sdl...@googlegroups.com
¡Buenas y Santas Cristian!,

Te has fijado que tienes un array de punteros a SDL_Surface que se llama images e intentas cargar imagenes con IMG_Load a un array de punteros a SDL_Surface que se llama imags?...

Buenas vibras y felices fiestas =)

El día 20/12/07, Cristian Segura <cristian.s...@gmail.com > escribió:



--
Leandro Ostera

Roberto Albornoz

unread,
Dec 20, 2007, 1:21:27 PM12/20/07
to sdl...@googlegroups.com
Si no fuera solo porque escribiste mal las variables, todo debería funcionar bien.

Aunque te aconsejo que crees una función que haga todo ese trabajo, ya que es un poco incómodo estar realizando demasiadas llamadas parecidas.

Puedes construir una función que cargue un conjunto de imágenes de la forma "imagenxxx.png". Además podrías usar la STL para manejar los vectores de superficies. Una posible definición para el vector de imágenes podría ser:

vector <SDL_Surface *> images;

Te dejo un función (modificada) que construí alguna vez. Debes pasar la dirección de la carpeta donde están las imágenes (directorio/prefijoimagen), el total de imágenes a cargar y la extensión.

int LoadImages(const char *dir, int total, const char *ext)
{
    char filename[256];

    for(int num=0; num < total; ++num)
    {
         // genera nombre de archivo
         sprintf(filename, "%s%03d.%s", dir, num+1, ext);

        // carga la imagen en una superficie
        SDL_surface *surface=IMG_Load(filename);
        if(!surface) return 0;

        // aca se puede cambiar el formato de la imagen
        // definir color key, etc.

        // se agrega la nueva superficie al vector de imagenes
        surfaces.push_back(surface);      
    }

    return 1;
}

Por ejemplo si tienes la carpeta images, y las imágenes tienen los siguientes nombres:
image001.png, image002.png, ... image010.png

La carga sería así:

LoadSurfaces("//images//image", 10, "png");

Espero que te sirva.

Saludos!
 

Roberto Albornoz

unread,
Dec 20, 2007, 1:41:34 PM12/20/07
to sdl...@googlegroups.com
fe de laucha: xD

en la función puse:


        // se agrega la nueva superficie al vector de imagenes
        surfaces.push_back(surface);      

pero debe ser

        images.push_back(surface);      

ya que arriba se definió con ese nombre el vector.

Bueno eso, saludos!

Jose Ramon Cano Yribarren

unread,
Dec 26, 2007, 12:38:14 PM12/26/07
to sdl...@googlegroups.com
Hola.
Tal como lo he entendido, la cuestion es que haces la inicializacion de un vector de surfaces en el main, y el problema esta al hacer esto mismo desde una funcion no? En ese caso el unico problema que te puede dar es que pases el array como un paso por variable, no por referencia, es decir:
Si en la funcion que inicializa dichas surfaces fuese algo parecido a:

void fun (..., SDL_Surface * vector_de_surfaces [10],...){...}

se crearía un NUEVO array temporal a la funcion "fun", copiandose todos los elementos, se inicializaría dentro de la funcion pero no cambiaría nada en el método que la llama. Por lo tanto no tendría asignado memoria el array images  y daría error al intentar acceder a los elementos. El problema se solucionaría poniendo como prototipo:

void fun (..., const SDL_Surface ** vector_de_surfaces ,...){...}
por lo que se pasaría un puntero constante, no un vector.

Otra cosa que me asusta del código es que si alguna carga de imagenes falla, simplemente se notifica de ello y sigue ejecutandose el programa, lo cual puede conllevar un acceso a alguna imagen no inicializada (ya que es un puntero a NULL) y, en cualquier caso, la liberación de "surfaces" que apuntan a Null.

Merry Christmas & a happy new year a todos!

El día 20/12/07, Cristian Segura <cristian.s...@gmail.com > escribió:

Cristian Segura

unread,
Dec 27, 2007, 8:19:24 AM12/27/07
to SDL en Español
Gracias por sus respuestas.

Efectivamente había un error de tipeo con el array *images[10] e
imgs .... en todo caso ese tipo de errores son detectados por
cualquier compilador (Dev-C++ en mi caso retorna un error diciendo que
la variable imgs no fué declarada)...

Voy a probar algunas de las soluciones planteadas y les respondo como
me fué.



On 26 dic, 13:38, "Jose Ramon Cano Yribarren" <joser...@gmail.com>
wrote:
> Hola.
> Tal como lo he entendido, la cuestion es que haces la inicializacion de un
> vector de surfaces en el main, y el problema esta al hacer esto mismo desde
> una funcion no? En ese caso el unico problema que te puede dar es que pases
> el array como un paso por variable, no por referencia, es decir:
> Si en la funcion que inicializa dichas surfaces fuese algo parecido a:
>
> void fun (..., SDL_Surface * vector_de_surfaces [10],...){...}
>
> se crearía un NUEVO array temporal a la funcion "fun", copiandose todos los
> elementos, se inicializaría dentro de la funcion pero no cambiaría nada en
> el método que la llama. Por lo tanto no tendría asignado memoria el array
> images y daría error al intentar acceder a los elementos. El problema se
> solucionaría poniendo como prototipo:
>
> void fun (..., const SDL_Surface ** vector_de_surfaces ,...){...}
> por lo que se pasaría un puntero constante, no un vector.
>
> Otra cosa que me asusta del código es que si alguna carga de imagenes falla,
> simplemente se notifica de ello y sigue ejecutandose el programa, lo cual
> puede conllevar un acceso a alguna imagen no inicializada (ya que es un
> puntero a NULL) y, en cualquier caso, la liberación de "surfaces" que
> apuntan a Null.
>
> Merry Christmas & a happy new year a todos!
>
> El día 20/12/07, Cristian Segura <cristian.segura.l...@gmail.com> escribió:

Leandro Ostera

unread,
Dec 27, 2007, 1:33:19 PM12/27/07
to sdl...@googlegroups.com
;)

El día 27/12/07, Cristian Segura <cristian.s...@gmail.com> escribió:



--
Leandro Ostera
Reply all
Reply to author
Forward
0 new messages