User Tag List

Resultados 1 al 11 de 11

Tema: Duda con strings.

  1. #1

    Fecha de ingreso
    Jan 2010
    Ubicación
    Getxo
    Mensajes
    1,519
    Mencionado
    6 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    50
    Agradecer Thanks Received 
    235
    Thanked in
    Agradecido 115 veces en [ARG:2 UNDEFINED] posts

    Duda con strings.

    Tengo el siguiente código:


    Código:
    243.         SDL_Surface *border = NULL;
    244.         SDL_Surface *border2 = NULL;
    245.
    246.         char skndir;
    247.	        skndir = rc_getstr("borderdir");
    248.        	SDL_FreeSurface (border);
    249.        	SDL_FreeSurface (border2);
    250.        	vid_fb.first_paint = 1;	
    251.        	if (showborder){
    252.		        border = SDL_LoadBMP(skndir DIRSEP"border1.bmp");
    253.		        border2 = SDL_LoadBMP(skndir DIRSEP"border2.bmp");}
    Al compilar, me da el siguiente error en las lineas 252 y 253:

    Código:
    252: error: expected ')' before string constant
    252: warning: passing argument 1 of 'SDLRWFromFile' makes pointer from integer without a cast
    252: error: too few argumente to function 'SDLRWFromFile'
    253: error: expected ')' before string constant
    253: warning: passing argument 1 of 'SDLRWFromFile' makes pointer from integer without a cast
    253: error: too few argumente to function 'SDLRWFromFile'
    La cuestión es que he introducido "skndir" que debería ser una ruta de una carpeta, para que se cargue el archivo "border1.bmp" contenido en ella.

    DIRSEP es "\"

    algo de lo que está en negrita está mal. podríais ayudarme?

  2. #2

    Fecha de ingreso
    Sep 2008
    Ubicación
    WORLD 9 - WARP ZONE!
    Mensajes
    14,535
    Mencionado
    28 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    187
    Agradecer Thanks Received 
    1,017
    Thanked in
    Agradecido 400 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    189
    el error está en en el último "error": too few input arguments, llamas a la función pero le faltan parámetros.

    he buscado por ahi y la definición de la función parece ser esta:

    char *rc_getstr (rc_handle *rh, char *prompt, int do_echo)

    aquí está la página donde lo he encontrado:

    http://radiusclient-ng.sourcearchive...8c-source.html

  3. #3

    Fecha de ingreso
    Mar 2007
    Ubicación
    Barna
    Mensajes
    9,215
    Mencionado
    63 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    124
    Agradecer Thanks Received 
    811
    Thanked in
    Agradecido 416 veces en [ARG:2 UNDEFINED] posts
    Supongo que estás tocando el emulador de Gameboy de Wiz, cualquiera de los que están basados en gnuboy. Por eso, en contra de lo que dice jduranmaster, la función rc_getstr() está correcta (es una función interna de gnuboy)

    hi-ban, no veo nada bien en las líneas que has marcado...

    Amos a vel:

    1.- entiendo que skndir es una cadena, esto es, un array de chars. Por lo tanto no es un char, sino un "char *".

    Código:
    246. char *skndir;
    247. skndir = rc_getstr("borderdir");
    Acuerdate también de liberarlo cuando acabes de usarlo, o te empezará a crecer la memoria descontroladamente.

    2.- En C (porque esto es C, ¿verdad?) no se puede concatenar cadenas a piñón, a menos que sean constantes (y skndir no es una constante). Tienes que crear un buffer, concatenar las cadenas
    por ejemplo con sprintf y liberar el buffer cuando acabes.

    Código:
    252.    char *buffer=malloc(sizeof(char)*128);
    253.    sprintf(buffer, "%s%s%s", skndir, DIRSEP, "border1.bmp");
    254.    border = SDL_LoadBMP(buffer);
    255.    sprintf(buffer, "%s%s%s", skndir, DIRSEP, "border2.bmp");
    256.    border2 = SDL_LoadBMP(buffer);
    257.    free(buffer);
    Y a todo esto es más que conveniente añadir control de errores, tanto a los malloc() como a los SDL_LoadBMP() También es una forma insegura de trabajar a menos que controles el tamaño de skndir, o te arriesgas a un ejecución arbitraria de código por buffer overflow (un posible atacante podría meter un "virus" simplemente cambiando el archivo de configuración donde se lee skndir) Aunque en Wiz de esto último yo no me preocuparía.
    Última edición por juanvvc; 28/10/2011 a las 18:50

  4. #4

    Fecha de ingreso
    Jan 2010
    Ubicación
    Getxo
    Mensajes
    1,519
    Mencionado
    6 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    50
    Agradecer Thanks Received 
    235
    Thanked in
    Agradecido 115 veces en [ARG:2 UNDEFINED] posts
    error: 'buffer' undeclared

    el error me lo da en esta linea:

    257. free(buffer);
    Última edición por hi-ban; 28/10/2011 a las 19:07

  5. #5

    Fecha de ingreso
    Mar 2007
    Ubicación
    Barna
    Mensajes
    9,215
    Mencionado
    63 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    124
    Agradecer Thanks Received 
    811
    Thanked in
    Agradecido 416 veces en [ARG:2 UNDEFINED] posts
    ¿La has puesto en el mismo contexto que el "char* buffer"?

    Aún así si te da la lata quita la línea y prueba. Tendrás que ponerla después para evitar que la memoria crezca sin remedio, pero al menos la primera, segunda y quincuagésima ejecuciones deberían ser correctas.

  6. #6

    Fecha de ingreso
    Jan 2010
    Ubicación
    Getxo
    Mensajes
    1,519
    Mencionado
    6 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    50
    Agradecer Thanks Received 
    235
    Thanked in
    Agradecido 115 veces en [ARG:2 UNDEFINED] posts
    lo he puesto asi:

    Código:
    	
            if (showborder){
    		char *skndir = rc_getstr("borderdir");
    		char *buffer = malloc(sizeof(char)*128);
    		sprintf(buffer, "%s%s%s", skndir, DIRSEP,"border1.bmp");
    		border = SDL_LoadBMP(buffer);
    		sprintf(buffer, "%s%s%s", skndir, DIRSEP,"border2.bmp");
    		border2 = SDL_LoadBMP(buffer);}
    		free(buffer);
    		free(skndir);

  7. #7

    Fecha de ingreso
    Mar 2007
    Ubicación
    Barna
    Mensajes
    9,215
    Mencionado
    63 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    124
    Agradecer Thanks Received 
    811
    Thanked in
    Agradecido 416 veces en [ARG:2 UNDEFINED] posts
    skndir y buffer se están declarando dentro del bloque if, y lo cierras al final de la séptima línea así que los free() se quedan fuera del bloque if y por eso no funcionan.

    Probablemente querrás mover el } al final de todo.

  8. #8

    Fecha de ingreso
    Jan 2010
    Ubicación
    Getxo
    Mensajes
    1,519
    Mencionado
    6 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    50
    Agradecer Thanks Received 
    235
    Thanked in
    Agradecido 115 veces en [ARG:2 UNDEFINED] posts
    ups, no lo había visto...
    Muchas gracias, ya me compila.

  9. #9

    Fecha de ingreso
    Jan 2008
    Ubicación
    Madrid
    Mensajes
    4,468
    Mencionado
    13 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    74
    Agradecer Thanks Received 
    139
    Thanked in
    Agradecido 84 veces en [ARG:2 UNDEFINED] posts
    También puedes hacer un buffer estático para los paths, que da menos problemas y no tienes que liberarlo luego. Queda en la pila y se libera solo. Esto se hace teniendo una longitud máxima.

    char buffer[255];
    // y luego usas el buffer...

  10. #10

    Fecha de ingreso
    Jan 2010
    Ubicación
    Getxo
    Mensajes
    1,519
    Mencionado
    6 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    50
    Agradecer Thanks Received 
    235
    Thanked in
    Agradecido 115 veces en [ARG:2 UNDEFINED] posts
    ¿es conveniente liberar (free) todos los chars despues de usarlos?

    pregunto porque, si es asi, igual hago un repaso del código...

  11. #11

    Fecha de ingreso
    Sep 2006
    Mensajes
    4,875
    Mencionado
    24 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    678
    Agradecer Thanks Received 
    624
    Thanked in
    Agradecido 465 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por hi-ban Ver mensaje
    ¿es conveniente liberar (free) todos los chars despues de usarlos?

    pregunto porque, si es asi, igual hago un repaso del código...
    Si haces un malloc de lo que sea, cuando no lo necesites mas debes hacer un free o perderás memoria (memory leaks).

    Si te pasas a C++ es menos probable que te pase esto si pides memoria en el constructor con new y la liberas en el destructor con delete.

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •