Buenas,
Aprovechando que best_guitar colgó en otro hilo un tuto de EFS (sí, soy un aprovechado xD), le he estado dando un vistacillo. He escrito poco a poco el código a la par que leía qué hacía cada línea, etc. Lo iba pillando, y cuando por fin tengo algo completo (un cargado de paleta y de sprite), le doy a compilar, y me sale esto:
main.c c:/Documentos/Proyectos/pruebaEFS/source/main.c: In function 'main': c:/Documentos/Proyectos/pruebaEFS/source/main.c:19: error: expected expression before 'int' c:/Documentos/Proyectos/pruebaEFS/source/main.c:19: error: too few arguments to function 'Cargar_Paleta' c:/Documentos/Proyectos/pruebaEFS/source/main.c:20: error: expected expression before 'u8' c:/Documentos/Proyectos/pruebaEFS/source/main.c:20: error: too few arguments to function 'Cargar_Sprite' make[1]: *** [main.o] Error 1 make: *** [build] Error 2
No entiendo cómo me dice que indique expresión después de int, cuando se supone que ya está indicada... Además, también dice que son menos argumentos de los necesarios, he mirado 125707297 veces y está tal y como el tuto...
Os dejo el código fuente, a ver si vosotros veis algo que yo no veo (que no sean fantasmas xD). Os dejo un comentario indicando las líneas que dan el error.
// Includes #include <PA9.h> // Include for PA_Lib #include <stdlib.h> #include "efs_lib.h" void Iniciar_EFS(void); u8* Obtener_Archivo(char* path); void Cargar_Paleta(int pantalla,int numpal,char* path); void Cargar_Sprite(u8 pantalla, u8 numsprite, char* path, u8 tamx, u8 tamy, u8 color, u8 numpal, s16 x, s16 y); // Function: main() int main(int argc, char ** argv) { PA_Init(); // Initializes PA_Lib PA_InitVBL(); // Initializes a standard VBL PA_InitText(0,0); Iniciar_EFS(); Cargar_Paleta( int pantalla, int numpal, char* path); //Línea 19 la que da error Cargar_Sprite( u8 pantalla, u8 numsprite, char* path, u8 tamx, u8 tamy, u8 color, u8 numpal, s16 x, s16 y); //Línea 20, la que da error // Infinite loop to keep the program running while (1) { PA_WaitForVBL(); } return 0; } // End of main() void Iniciar_EFS(void) { if(!EFS_Init(EFS_AND_FAT | EFS_DEFAULT_DEVICE, NULL)) { PA_OutputText(0,1,1,"EFS Error!!"); while(true) {PA_WaitForVBL();} } else PA_OutputText(0,1,1,"EFS ok!!"); } u8* Obtener_Archivo(char* path) { FILE* file; //Variable que apunta al fichero u8* archivo; //Variable puntero u8 int size; struct stat st; //Variable stat para el fichero file=fopen(path,"rb"); //Abrimos el archivo(forma binaria) if(file!=NULL) //Comprobación: ¿Existe el fichero? Si existe... { stat(path,&st); //Metemos el fichero en la estructura stat (volcado de datos) size=st.st_size; archivo=(u8*)malloc(size); //El puntero apunta al archivo fread(archivo,1,size,file); //Volcado del archivo fclose(file); //Acabado el volcado, el archivo se cierra return(archivo); } else //Si no existe... { PA_OutputText(1,0,0,"File not found!"); PA_OutputText(0,0,0,"Filo not found!"); while(true) PA_WaitForVBL(); return(0); } } void Cargar_Paleta(int pantalla,int numpal,char* path) { u8* paleta; char path_completo[EFS_MAXPATHLEN]; sprintf(path_completo,"%s_Pal.bin",path); //Completamos el path paleta=Obtener_Archivo(path_completo); //Obtenemos el puntero PA_LoadSpritePal(pantalla,numpal,paleta); //Cargamos la paleta con el puntero } void Cargar_Sprite(u8 pantalla,u8 numsprite,char* path,u8 tamx,u8 tamy,u8 color,u8 numpal,s16 x, s16 y) { u8* sprite; char path_completo[EFS_MAXPATHLEN]; sprintf(path_completo,"%s_Sprite.bin",path); //Completamos el path sprite=Obtener_Archivo(path_completo); //Obtenemos el puntero PA_CreateSprite(pantalla,numsprite,sprite,tamx,tamy,color,numpal,x,y); }
Agradezco toda ayuda que podáis darme, porque cuánto más avanzo en este mundillo más me gusta... pero con estos obstáculos...
Salu2
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
bueno, claro, estas pasando
bueno, claro, estas pasando el prototipo de la funcion, cuando debes pasar la llamada, me explico:
dentro de main debes llamar con parametros de la funcion, como
#define PANT_INF 0
#define PALETA1 1
Cargar_Paleta (PANT_INF,PALETA1,"paleta_basica");
en vez de:
Cargar_Paleta(int pantalla , int numpal, char* path); como estas haciendo
Con Cargar_Sprite te pasa lo mismo, seguro que te has descuidado al hacerlo asi. Yo llevo tres horas con una funcion de movimiento y me estoy volviendo loco, al final, cuando lo mire detenidamente, sera el fallo mas tonto que he tenido en meses...
Saludos!! ya diras algo...
Visita mi blog. Zenit + 5 will win
Creo que entiendo, pero...
ya hice lo que me indicaste, el error es aún mayor, supongo que aún quedará algo por hacer.
El actual error:
Ahora el source está así:
Salu2, y gracias por ayudarme.
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
hola, te recuerdo que en c,
al programar una función, se debe hacer lo siguiente:
primero prototipo o definicion de la funcion, asi:
void Cargar_Paleta(int pantalla, int numPaleta, char* path);
esta definicion no es necesaria si la funcion se implementa antes de la funcion principal main, en ella se describe que parámetros contendrá la función y el tipo de dato que devolverá. En este caso no devolverá ningun valor (por que es void), y como parámetros deberas pasar primero un int que sera el numero de pantalla, luego otro int que será el numero de paleta, y por ultimo un puntero a caracter o cadena de texto con el nombre de la paleta a cargar.
segundo: ahora la funcion en si debe ser implementada(esto si es obligatorio), para ello debes de nuevo escribir tal y como se definió anteriormente pero debes crear el algoritmo de trabajo entre llaves.
void Cargar_Paleta(int pantalla, int numPaleta, char* path){
u8* paleta;char path_completo[EFS_MAXPATHLEN];
sprintf(path_completo,"%s_Pal.bin",path); //Completamos el path
paleta=Obtener_Archivo(path_completo); //Obtenemos el puntero
PA_LoadSpritePal(pantalla,numPaleta,paleta); //Cargamos la paleta con el puntero
}
tercero: como ultimo paso, cuando lo necesites debes llamar a la función para que se realize lo que quieres que se haga, por ejemplo dentro de la función main, o sea, cargar la paleta, entonces:
Cargar_Paleta(0,0,"paleta_personaje");//se carga primero la paleta para la pantalla inferior(0), el segundo parametro es el numero de paleta(0), y el tercer parametro la paleta que queremos cargar en este caso paleta_personaje.
en fin, pienso que todos esos errores te vienen por que no estaba bien este metodo de trabajo y uso de C en general, por que veo que has puesto lo mismo en la definicion, en la implementacion, y en la llamada dentro de main. Debes tener presente que hay que diferenciar y dominar estos tres (definicion, implementacion y llamada), por que cada uno tiene su cometido. La definicion le dice al compilador que existe una funcion que tiene un nombre (en este caso Cargar_Paleta o Cargar_Sprite, o Iniciar_EFS), unos parametros que pasar y un tipo de retorno. La implementacion es el algoritmo que soluciona el problema (como puedes ver en el cacho de programa anterior, paso 2). Y la llamada, le dices por programa los parametros directamente para que se realice la funcion con dichos parametros.
Vamos que yo dejaria el programa como lo tenias en el primer mensaje, y simplemente cambiaria las llamadas a funcion dentro del main, tal y como se debe hacer.
No se si te he ayudado o te he hecho mas lio, en esta mini explicación debes recordar y diferenciar esas reglas, por que es basico en C.
Bueno si tienes alguna duda o no te he explicado lo que necesitabas por que no te he entendido me lo dices.
Saludos!
Visita mi blog. Zenit + 5 will win
Muchísimas gracias
Vamos avanzando, pero sigue habiendo problemas. Creo que te he entendido perfectamente, sólo indicar el valor que se le da a los argumentos en la llamada. Pero el compilador sigue insistiendo que pongo menos argumentos de los necesarios por las funciones:
Te pongo solamente la llamada, que es la que da problemas:
Por si acaso, la definición y la implementación las tengo así:
Muchísimas gracias por tu ayuda, empiezo a ver la luz al final del túnel...
Salu2
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
hola, sigues poniendo en la
hola, sigues poniendo en la llamada un parametro incorrectamente. Cuando al compilador en la llamada le dices que un parametro tiene el valor char* loquesea, no es lo que esta esperando sino realmente una cadena de texto. El compilador en la llamada solo espera constantes o variables, punteros, etc... pero no acepta tipos de datos (char, int, float, double, char*,etc..., porque ya estan en la definicion e implementacion). Por lo tanto en las dos funciones de llamada.
Cargar_Paleta(PANTALLA,NUMPAL,char* path);Cargar_Sprite(PANTALLA,NUMSPRITE,char* path,TAMX,TAMY,COLOR,NUMPAL,X,Y);
char* path no se acepta y el compilador da error. Él está esperando la cadena de texto o nombre del archivo, por lo tanto esto es...
Cargar_Sprite(PANTALLA,NUMSPRITE,"nombreSprite",TAMX,TAMY,COLOR,NUMPAL,X,Y);
Prueba con este cambio, ese fallo ya no te lo dará.
Saludos!
Visita mi blog. Zenit + 5 will win
Con "nombrepaleta" y "nombresprite"
supongo que te refieres al nombre del archivo a cargar. La duda es: ¿El nombre va con la terminación o sin ella? Es decir, ¿pongo "sprite" o "sprite.Sprite_Pal"?
Aprovecho para una duda que tengo ahora mismo con EFS, espero que no te importe. El tutorial enseña la preparación de las EFS, la de los punteros y variables necesarias, y la carga desde EFS. Ahora bien, supongamos que después de cargar un fondo, por ejemplo, en un determinado momento me da por borrarlo. Pongo PA_DeleteBg o PA_ResetBgSystem. Hasta ahí OK. Ahora bien, ¿El fondo se borra REALMENTE de RAM? Imagino que cuando cargo el fondo, se almacena en VRAM para cargarlo. Al borrarlo, se borrará también de VRAM ¿no? Sé que es una pregunta estúpida, pero no quisiera ir llenando la memoria hasta llenarla.
Salu2. Ahora pruebo tu indicación.
EDITO: Sigue habiendo problemas, exactamente el mismo error, que si menos argumentos de los necesarios, etc.
Ahora la llamada la tengo como dijiste. Probé también con sus terminaciones, pero igual. ¿Qué puedo estar haciendo mal?
Salu2
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
hola, exacto, debes poner el
hola,
exacto, debes poner el nombre del archivo, pero, sin extension, porque si te fijas en las funciones de la EFS ya lo hace por ti, tú sólo el nombre correctamente escrito.
En cuanto a tu segunda pregunta, debo decirte que no he utilizado todavia (hasta que no acabe zenit) la carga de fondos, sprites por EFS, por tanto, no soy tal vez el que te solucione el problema. Sin embargo te puedo orientar un poco. Fijate, que la funciones de EFS(tan gracilmente y eficientemente programadas) te devuelven un puntero que apuntan a la memoria reservada para el objeto que has creado. Entonces cuando ya tienes el objeto creado y asignado el puntero puedes liberarlo con free(puntero). Entonces la memoria queda liberada y puedes cargar en ese espacio otra musica, fondo, sprite, etc... Por lo tanto no se borra, CREO, con una funcion de PAlib, como mencionabas antes.
Sobre lo último, pega el codigo y los errores devueltos por el compilador y lo miro.
Saludos!
Visita mi blog. Zenit + 5 will win
Source completo
éste es el código completo:
Como puedes ver, los cambios son mínimos, pero el error es el mismo:
Salu2
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
vale, ya está, el error te
vale, ya está, el error te los da por que estas poniendo ; detras de las directivas define. Los defines no llevan ; al final de la directivas (leyes del C). Por lo tanto, debes hacer:
#define LOQUESEA 0
#define ESCRIBEGAMEOVER PA_OutputSimpleText(0,10,10,"GAMEOVER")
En vez de:
#define LOQUESEA 0; //fijate el ; final es erroneo
#define ESCRIBEGAMEOVER PA_OutputSimpleText(0,10,10,"GAMEOVER"); //fijate el ; final es erroneo
De toda manera veo en tu programa que abusas un poco de los define y realmente se usa para hacer mas legible el programa y para macros que se repiten muchas veces.
Bueno, pues al final me he tenido que pelear con la EFS sin querer todavia, pero si te he ayudado hemos aprendido todos. En fin, he pensado, ya voy a probarlo a ver si va y no me mostraba el sprite por pantalla. Cuando pueda haré un poquito de manual, más detallado, pero de momento tengo otras preferencias.
1- copias el sprite que quieras y lo pegas en la carpeta gfx.
2- conviertes el sprite/s con la aplicacion PAGfx como has hecho siempre.
3- copias el _Pal.bin y el _Sprite.bin y los copias en efsroot.
4- borras los archivos no originales del directorio gfx.
5- PA_CreateSprite(pantalla,numsprite,sprite,OBJ_SIZE_64X64,color,numpal,x,y); //dentro de Cargar_Sprite modifica esta linea con el tamaño del sprite como lo haces siempre. Imagino que la funcion que utilizó Henty era una antigua y a mi no me funciona.
Espero que con esto esté solucionado el problema.
Saludos!
Visita mi blog. Zenit + 5 will win
Más problemas
ahora el source me va perfectamente, el problema viene en el resultado. Yo incluyo los archivos .bin en el efsroot, sin embargo, a la hora de cargar el sprite, no me aparece nada en pantalla. ¿Por qué puede ser?
Salu2
EDITO: Ay que me lol, el problema era el tamaño del sprite, que no se ponen independientemente (tamx,tamy) sino en un OBJ_SIZE_. Tienes razón, me da que el método del tutorial es algo antiguo...
Salu2 y muchas gracias, con esto ya está todo ^^
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.