Ver la versión completa : [Ayuda] Duda con strings.
Tengo el siguiente 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:
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?
jduranmaster
28/10/2011, 17:28
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.com/documentation/0.5.6-1/util_8c-source.html
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... :confused:
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 *".
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.
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.
error: 'buffer' undeclared
el error me lo da en esta linea:
257. free(buffer);
¿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.
lo he puesto asi:
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);
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.
ups, no lo había visto...
Muchas gracias, ya me compila. :brindis:
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...
¿es conveniente liberar (free) todos los chars despues de usarlos?
pregunto porque, si es asi, igual hago un repaso del código...
¿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.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.