Tengo un problema:
Estoy empezando a crear un mini OS.Pero me salió este error:
main.c c:/devkitPro/Programas/OS/source/main.c: In function 'App2': c:/devkitPro/Programas/OS/source/main.c:8: warning: 'main' is normally a non-static function c:/devkitPro/Programas/OS/source/main.c:57: error: expected declaration or statement at end of input make[1]: *** [main.o] Error 1 make: *** [build] Error 2
Pongo el codigo de mi proyecto:(Es muy largo)
main.h #include <PA9.h> // Include for PA_Lib #include "gfx/all_gfx.c" #include "gfx/all_gfx.h" // incluimos main.h... OJO, hemos de tener cuidado en el orden que se leen los ficheros. #include "main.h" int main(int argc, char ** argv) { PA_Init(); PA_InitVBL(); // iniciamos el texto PA_InitText(0, 0); // cargo la paleta de los sprites PA_LoadSpritePal(0, 0, (void*)colours_Pal); PA_LoadSpritePal(0, 1, (void*)icons_Pal); // cargo el bg de la tactil y el de la de arriba PA_EasyBgLoad(0, 3, bg0); PA_EasyBgLoad(1, 3, bg1); // creo el sprite del programa PA_CreateSprite(0, 0, (void*)programa_Sprite, OBJ_SIZE_32X32, 1, 0, 10, 10); PA_CreateSprite(0, 1, (void*)programa2_Sprite, OBJ_SIZE_32X32, 1, 1, 50, 10); // funcion de palib, lo que va a hacer es cambiar la prioridad de los sprites, en este caso para dejarle detras de la ventana cuando se abra PA_SetSpritePrio(0, // pantalla 0, // sprite 3); //capa PA_SetSpritePrio(0, // pantalla 1, // sprite 3); //capa while (1) { // damos opcion de mover la aplicacion por el escritorio (como en windows) PA_MoveSprite(0); PA_MoveSprite(1); PA_SetTextTileCol(0, 9); // ponemos la hora y los minutos PA_OutputText(0, 27, 22,"%02d:%02d ", PA_RTC.Hour, // igual que si queremos saver la posicion del stylus... PA_RTC.Minutes); // cargo mi funcion de aplicación (archivo aplicacion1.h) App1(); App2(); PA_WaitForVBL(); } return 0; }
Main.h
]#ifndef MAIN_H #define MAIN_H // y entre esto va el codigo que quieras, no es tan dificil... // VAMOS A INCLUIR LOS DEMAS ARCHIVOS... //----------------------------------------------------- // // Funciones.h, lo incluimos, aqui declararemos las funciones mas "generales" // //----------------------------------------------------- #include "funciones.h" //----------------------------------------------------- //----------------------------------------------------- // // Aplicacion1.h, aqui meteremos lo que seria la aplicación primera (y unica) que le meteremos // //----------------------------------------------------- #include "aplicacion1.h" #include "aplicacion2.h" //----------------------------------------------------- #endif
funciones.h
#ifndef FUNCIONES_H #define FUNCIONES_H // lo que hace esta función es crear una nueva ventana que despues se reyena void nuevaventana(const char *nombreventana); // esta función cierra la ventana de la sub-aplicacion void cerrar(void); void nuevaventana(const char *nombreventana){ // el titulo de la aplicacion que aparece en la ventana PA_SetTextTileCol(0, 9); PA_OutputSimpleText(0, 3, 1, nombreventana); // creamos la ventana a partir de sprites PA_CreateSprite(0, 1, (void*)ventapp1_Sprite, OBJ_SIZE_64X64, 1, 0, 1, 2); PA_CreateSprite(0, 2, (void*)ventapp2_Sprite, OBJ_SIZE_64X64, 1, 0, 64, 2); PA_CreateSprite(0, 3, (void*)ventapp3_Sprite, OBJ_SIZE_64X64, 1, 0, 128, 2); PA_CreateSprite(0, 4, (void*)ventapp4_Sprite, OBJ_SIZE_64X64, 1, 0, 192, 2); PA_CreateSprite(0, 5, (void*)ventapp5_Sprite, OBJ_SIZE_64X64, 1, 0, 1, 66); PA_CreateSprite(0, 6, (void*)ventapp6_Sprite, OBJ_SIZE_64X64, 1, 0, 64, 66); PA_CreateSprite(0, 8, (void*)ventapp8_Sprite, OBJ_SIZE_64X64, 1, 0, 192, 66); PA_CreateSprite(0, 7, (void*)ventapp7_Sprite, OBJ_SIZE_64X64, 1, 0, 128, 66); // creo el sprite que cierra la ventana PA_CreateSprite(0, 9, (void*)close_Sprite, OBJ_SIZE_16X16, 1, 0, 234, 5); // funcion de palib, lo que va a hacer es cambiar la prioridad de los sprites para que el texto este delante de ellos PA_SetSpritePrio(0, // pantalla 1, // sprite 2); //capa PA_SetSpritePrio(0, 2, 2); PA_SetSpritePrio(0, 3, 2); PA_SetSpritePrio(0, 4, 2); PA_SetSpritePrio(0, 5, 2); PA_SetSpritePrio(0, 6, 2); PA_SetSpritePrio(0, 7, 2); PA_SetSpritePrio(0, 8, 2); } void cerrar(void){ // borramos los sprites de la ventana PA_DeleteSprite(0, 1); PA_DeleteSprite(0, 2); PA_DeleteSprite(0, 3); PA_DeleteSprite(0, 4); PA_DeleteSprite(0, 5); PA_DeleteSprite(0, 6); PA_DeleteSprite(0, 7); PA_DeleteSprite(0, 8); PA_DeleteSprite(0, 9); // quitamos el texto y le devolvemos su color normal // funcion que "limpia" una capa (incluido texto) PA_ClearBg(0, 0); PA_SetTextTileCol(0, 0); } #endif
aplicacion1.h
#ifndef APLICACION1_H #define APLICACION1_H /* vamos a hacer una funcion que nos va a indicar el estado en el que esta el programa (si se mueve, si esta seleccionado, si esta abierto...) y lo que ocurre cuando se abre*/ void App1(void); // estado es una variable que usaremos como si fuera un booleano // abierto un booleano. u16 estado = 0; bool abierto = false; // variables que usaremos dentro de nuestra sub-aplicacion u8 colL = 1; u8 colR = 1; u8 colA = 1; u8 colB = 1; u8 colX = 1; u8 colY = 1; u8 colAr = 1; u8 colAb = 1; u8 colIz = 1; u8 colDe = 1; void App1(void){ // si tocamos el sprite y el estado es 0 (0 sin seleccionar, 1 seleccionado) y esta cerrado... if((Stylus.Newpress) && (PA_SpriteTouched(0)) && (estado == 0) && (abierto == false)) { // lo animamos PA_SetSpriteAnim(0,0,1); // esta seleccionado estado = 1; } // si volvemos a tocarlo se abre else if((Stylus.Newpress) && (PA_SpriteTouched(0)) && (estado == 1) && (abierto == false)) { // lo animamos como que ya lo hemos abierto PA_SetSpriteAnim(0,0,0); // cramos la ventana y le ponemos el nombre(funciones.h) nuevaventana("Testeador de botones y stylus"); // esta seleccionado estado = 0; // y abierto abierto = true; } // si tocamos la pantalla pero no el sprite y esta seleccionado solo... else if((Stylus.Newpress) && (estado == 1)){ // le volvemos a animar al frame primero PA_SetSpriteAnim(0,0,0); // sin seleccionar estado = 0; } // si esta abierto... if ((abierto == true)){ //---------------------------------------- // Aquí vamos a meter el codigo de la aplicacion en si // Mostraremos la posicion del stylus dentro de la ventana, y checkeara si pulsamos algun boton ////---------------------------------------- // ponemos color azul para ese "enunciado" PA_SetTextTileCol(0, 3); PA_OutputText(0, 2, 4, "Test stylus:"); // ponemos la posicion del stylus en verde PA_SetTextTileCol(0, 2); PA_OutputText(0, 2, 6,"Stylus X: %d ", Stylus.X); PA_OutputText(0, 2, 7,"Stylus Y: %d ", Stylus.Y); // otro "enunciado" PA_SetTextTileCol(0, 3); PA_OutputText(0, 17, 4, "Test botones:"); // ponemos variables en todos los colores (una para rojo/sinpulsar y otra verde/pulsado) PA_SetTextTileCol(0, colL); PA_OutputText(0, 17, 6, "L"); PA_SetTextTileCol(0, colR); PA_OutputText(0, 25, 6, "R"); PA_SetTextTileCol(0, colA); PA_OutputText(0, 17, 8, "A"); PA_SetTextTileCol(0, colB); PA_OutputText(0, 25, 8, "B"); PA_SetTextTileCol(0, colX); PA_OutputText(0, 17, 9, "X"); PA_SetTextTileCol(0, colY); PA_OutputText(0, 25, 9, "Y"); PA_SetTextTileCol(0, colAr); PA_OutputText(0, 17, 11, "Arriba"); PA_SetTextTileCol(0, colAb); PA_OutputText(0, 25, 11, "Abajo"); PA_SetTextTileCol(0, colIz); PA_OutputText(0, 17, 13, "Izquierda"); PA_SetTextTileCol(0, colDe); PA_OutputText(0, 17, 14, "Derecha"); //---------------------------------------- } //------------------------------------------------- // AQUI METEREMOS LOS IFS DE NUESTRA SUB_APLICACION //------------------------------------------------- //si dejamos pulsado L... if ((Pad.Held.L)){ colL = 2; // se pone de color verde } // si la soltamos... else if ((Pad.Released.L)){ colL = 1; // se vuelve roja } // lo mismo con el R... if ((Pad.Held.R)){ colR = 2; } else if ((Pad.Released.R)){ colR = 1; } // lo mismo con la A if ((Pad.Held.A)){ colA = 2; } else if ((Pad.Released.A)){ colA = 1; } // lo mismo con el B if ((Pad.Held.B)){ colB = 2; } else if ((Pad.Released.B)){ colB = 1; } // lo mismo con el x if ((Pad.Held.X)){ colX = 2; } else if ((Pad.Released.X)){ colX = 1; } // lo mismo con la Y if ((Pad.Held.Y)){ colY = 2; } else if ((Pad.Released.Y)){ colY = 1; } // lo mismo con Arriba if ((Pad.Held.Up)){ colAr = 2; } else if ((Pad.Released.Up)){ colAr = 1; } // lo mismo con Abajo if ((Pad.Held.Down)){ colAb = 2; } else if ((Pad.Released.Down)){ colAb = 1; } // lo mismo con Izquierda if ((Pad.Held.Left)){ colIz = 2; } else if ((Pad.Released.Left)){ colIz = 1; } // lo mismo con Derecha if ((Pad.Held.Right)){ colDe = 2; } else if ((Pad.Released.Right)){ colDe = 1; } //------------------------------------------------- //------------------------------------------------- // CERRAMOS LA APLICACION //------------------------------------------------- // si cerramos la aplicación... if ((abierto == true) && PA_SpriteTouched(9)){ // llamamos a la funcion que cierra(funciones.h) cerrar(); // esta cerrado abierto = false; } //------------------------------------------------- } #endif
aplicacion2.h
#ifndef APLICACION2_H #define APLICACION2_H /* vamos a hacer una funcion que nos va a indicar el estad en el que esta el programa (si se mueve, si esta seleccionado, si esta open...) y lo que ocurre cuando se abre*/ void App2(void); // estad es una variable que usaremos como si fuera un booleano // open un booleano. u16 estad = 0; bool open = false; // variables que usaremos dentro de nuestra sub-aplicacion char text[200]; // Esto seria una cadena de caracteres. es como una especie de varieble para texto y numero maximo de caracteres s32 nletra = 0; // Numero de letras. 0 indica que no hay char letra = 0; // Nueva letra a escribir void App2(void){ // si tocamos el sprite y el estad es 0 (0 sin seleccionar, 1 seleccionado) y esta cerrado... if((Stylus.Newpress) && (PA_SpriteTouched(1)) && (estad == 0) && (open == false)) { // lo animamos PA_SetSpriteAnim(0,1,1); // esta seleccionado estad = 1; } // si volvemos a tocarlo se abre else if((Stylus.Newpress) && (PA_SpriteTouched(1)) && (estad == 1) && (open == false)) { // lo animamos como que ya lo hemos open PA_SetSpriteAnim(0,1,0); // cramos la ventana y le ponemos el nombre(funciones.h) nuevaventana("Testeador de botones y stylus"); // esta seleccionado estad = 0; // y open open = true; } // si tocamos la pantalla pero no el sprite y esta seleccionado solo... else if((Stylus.Newpress) && (estad == 1)){ // le volvemos a animar al frame primero PA_SetSpriteAnim(0,2,0); // sin seleccionar estad = 0; } // si esta open... if ((open == true)){ { PA_Init(); // Iniciamos PA_Lib PA_InitVBL(); // Iniciamos VBL PA_InitText(2, 0); // Iniciamos el texto PA_InitKeyboard(3); // Cargamos el teclado en la capa 2... PA_KeyboardIn(20, 95); // Hace aparecer el teclado y sus coordenadas // escribimos PA_OutputSimpleText(2, 7, 10, "Texto : "); // Bucle while (1) { letra = PA_CheckKeyboard(); // chekea si se pulsa una nueva letra // este if sirve para que las letras no se salgan de la pantalla y baje una linea cuando llege al tope if (letra > 31) { // si el numero de letras es mayor de 31 text[nletra] = letra; // los caracteres del texto por el numero de letras = el valor de letra nletra++; // como se escribe una letra mas, el numero de letras sube } else if ((letra == PA_BACKSPACE)&&nletra) { // si pulsamos el boton de borrar (backspace, ese que va encima del enter) xD nletra--; // el numero de letras escritas se le resta 1 que hemos borrado text[nletra] = ' '; // borramos la ultima letra con un texto en blanco } PA_OutputSimpleText(1, 8, 11, text); // hacermos que aparezca el texto PA_WaitForVBL(); } //------------------------------------------------- //------------------------------------------------- // CERRAMOS LA APLICACION //------------------------------------------------- // si cerramos la aplicación... if ((open == true) && PA_SpriteTouched(9)){ // llamamos a la funcion que cierra(funciones.h) cerrar(); // esta cerrado open = false; } //------------------------------------------------- } #endif
Soy novato y acabo de empezar.El problema me vino al añadir la app2 al main.c.Como no conozco ningúna otra forma para cargar las aplicaciones no se que hacer.Se que ell código de la aplicación 2 puede tener fallos (incluso graves) pero no puedo ir provandolo si no funciona...
Gracias adelantadas.
Ya se que es copiar y pegar
Ya se que es copiar y pegar ,pero solo quería ver si funcionaba o no y luego ya iría cambiando el código según vaya avanzando.
Lo que yo quería es saber donde está el error,nada más.Ya lo intentaría solucionar por mi cuenta.
Siento todos los inconvenientes que pueda haber causado.
si
no lo consigues lo mejor que puedes hacer es enviarle todo eso a uno de los miembros de la staff en un mensage privado y entonces el te lo corregirá y te podra decir quales son tus errores y asi podras acerlo tu solo
I like:
Para algo están los foros
para que posteéis vuestras dudas y os podamos ayudar entre todos, los del staff ayudamos, pero no lo sabemos todo.
Salu2
Hola buenas entiendo que
Hola buenas entiendo que estés aprendiendo y demás. Pero que cojas copies y pegues tu aplicacion desde los tutoriales de plata y compiles y que el resto te lo solucionen. Primero aprende bien a leer el codigo como si leyeses este comentario y luego haz 1mini-So que para copiar y pegar no es 1 cosa tan avanzada(dentro de lo que cabe) te recomiendo aprender la estructura de los IF y hacer algun ejercicio de que si se toca 1 sprite se cargue 1 BG pero sin copiar y pegar de otros sitios.