Anuncios Google

Problema con palib

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

El SO incluye un testeador de botones que funcionaba y un teclado que no he podido probar por el error

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.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

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.

Imagen de sarutoby

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:

Imagen de exterminator

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

Imagen de Anabol

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.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.