Problema con fat

Bueno pos estoy intentado añadirle fat a mi proyecto, me he mirado los tutoriales, los ejemplos... Pero tengo algunos problemillas que no consigo solucionar...

Me explico, estoy haciendo unas practicas primero con el fat para dominarlo. Intento que la ds inicie fat, si hay algun problema el progama se detiene y muestra un aviso de error. Si consigue acceder a fat intenta acceder al archivo "Twotm.sav". Si no lo encuentra lo crea y graba un 1. Despues de todo eso, el progama lee el contenido del archivo. Si lee un 1 el progama finaliza, y entonces es cuando doy por aprobado mi practica.

Esto es lo que tendria que ocurrir, pero cuando lo pruebo en la nds, me sale siempre el error de fat (mi flashcard tiene autoparcheo dldi y nunca me ha dado problemas con el fat. Por tanto es un error del codigo...). Si quito lo del error, el progama empieza bien, me crea el archivo y eso... Pero no se detiene si en el archivo esta escrito un 1!. Es algo muy extraño... O muy normal porque con la chapuzilla que he hecho xDDD.

Os pongo el codigo relacionado. Gracias a los que quieran ayudar:


u8 Lector;
fatInitDefault();

if (!fatInitDefault)
{
PA_OutputSimpleText(0,21,6,"Error!");
PA_OutputSimpleText(0,2,12,"No se pudo acceder a fat!");
PA_OutputSimpleText(0,1,16,"Asegurese de haber parcheado");
PA_OutputSimpleText(0,1,18,"con dldi");

while (1){
PA_WaitForVBL();
}
}

FILE* prueba = fopen ("Twotm.sav","rb");

if(prueba == NULL) {

FILE* prueba5 = fopen ("Twotm.sav", "wb");
fwrite("1",1,1, prueba5);
fclose(prueba5);
}

fread(Lector,1,1,prueba);
if (Lector == 1){
while (1){
PA_WaitForVBL();
}
}

Hola Amchacon!

Tu problema es que estás intentando reabrir un archivo que ya está abierto. Si lo que vas a hacer primero es escribir, ábrelo desde el principio como "wb", escribe, luego ciérralo y después ábrelo con "rb", lees y cierras. También está la opción de abrirlo como escritura y lectura. Si mal no recuerdo era con "rb+" o con "wb+". Tienes más información sobre ficheros AQUI.

Creo que también está mal el fwrite("1",1,1, prueba5); , puesto que le estás diciendo que guarde un "1" como carácter y no como un número. Puedes probar a quitarle las comillas, aunque, como ya he dicho, no estoy muy seguro de que esté mal.

Sobre lo del fat, has probado a poner PA_InitFat(); ?

Saludos ^^

EDITO: Vale, creo que lo del fat es porque tiene que ser directamente if (!fatInitDefault()){ (fíjate que le he añadido los paréntesis para que sea considerado como una función), porque, si mal no recuerdo, el fat no se puede iniciar dos veces.
gracias!! yo tambien me voy a poner a hacer pruebas con fat... espero que no sea muy complicao (lo chungo es tener ke meter sacar la SD para cada prueba)

no hay ningun emulador ke de verdad emule fat.. porque muchos lo dicen pero yo no lo he conseguido. asi ke tocara hacer las pruebas con la consola, que no seran pocas

saludos!!
Aguilera_87 escribió:gracias!! yo tambien me voy a poner a hacer pruebas con fat... espero que no sea muy complicao (lo chungo es tener ke meter sacar la SD para cada prueba)

no hay ningun emulador ke de verdad emule fat.. porque muchos lo dicen pero yo no lo he conseguido. asi ke tocara hacer las pruebas con la consola, que no seran pocas

saludos!!


Puedes utilizar dsftp + firezilla para no tener que estar sacando la SD. A mi me va muy bien ^^

Y no os preocupéis que el fat no es tan complicado, es cuestión de pillarle el truco.
keda escribió:Hola Amchacon!

Tu problema es que estás intentando reabrir un archivo que ya está abierto. Si lo que vas a hacer primero es escribir, ábrelo desde el principio como "wb", escribe, luego ciérralo y después ábrelo con "rb", lees y cierras. También está la opción de abrirlo como escritura y lectura. Si mal no recuerdo era con "rb+" o con "wb+". Tienes más información sobre ficheros AQUI.

Creo que también está mal el fwrite("1",1,1, prueba5); , puesto que le estás diciendo que guarde un "1" como carácter y no como un número. Puedes probar a quitarle las comillas, aunque, como ya he dicho, no estoy muy seguro de que esté mal.

Sobre lo del fat, has probado a poner PA_InitFat(); ?

Saludos ^^

EDITO: Vale, creo que lo del fat es porque tiene que ser directamente if (!fatInitDefault()){ (fíjate que le he añadido los paréntesis para que sea considerado como una función), porque, si mal no recuerdo, el fat no se puede iniciar dos veces.

Aqui llega mi salvador xD.

Pos lo de fatinitdefault ya esta resuelto. Hay que ver pego era... Lo otro creo que no me has entendido. Quiero que acceda a un archivo y lo lea, en caso de que no encuentre el archivo, el progama lo crearia automaticamente... Eso funciona de maravilla, crea el archivo e introduce los caracteres que le pongo. Pero no consigo que lo lea...

He hecho una pequeña prueba modificando codigo, pero me sigue sin salir... Os dejo nds+source:




PD: Gracias por la pagina, me sera muy util [ginyo]

Aguilera_87 escribió:gracias!! yo tambien me voy a poner a hacer pruebas con fat... espero que no sea muy complicao (lo chungo es tener ke meter sacar la SD para cada prueba)

no hay ningun emulador ke de verdad emule fat.. porque muchos lo dicen pero yo no lo he conseguido. asi ke tocara hacer las pruebas con la consola, que no seran pocas

saludos!!

Pero tu que haces por aqui arguilera??. Creia que solo estabas en espalnds y en el msn xDD.

Yo lo que he hecho es meter el proyecto dentro de la sd, de esa forma cuando lo quiera probar solo tengo que pulsar build y listo XD.

EDITO: Solucionado gracias a copete!!. Aqui os dejo el codigo por si quereis mirarlo:

http://www.megaupload.com/?d=JGRZ3Q6L
Sigo opinando que el problema está en que abres el mismo archivo dos veces.

Si lo que quieres es realizar la acción según si existe el archivo o no, utiliza la función access("archivo"); que devuelve 0 en caso de existir el archivo, y 1 en caso de no existir (el compilador te mostrará un warning, pero no pasa absolutamente nada). En el caso de tu ejemplo, sería algo así:

if (!fatInitDefault()){
   PA_OutputSimpleText(0,21,6,"Error!");
   PA_OutputSimpleText(0,2,12,"No se pudo acceder a fat!");
   PA_OutputSimpleText(0,1,16,"Asegurese de haber parcheado");
   PA_OutputSimpleText(0,1,18,"con dldi");
           
   while (1){
      PA_WaitForVBL();
   }

}else{
   // comprobamos que exista el archivo
   if (!access("Twotm.sav")){ // si existe, leemos
      FILE* prueba = fopen ("Twotm.sav","rb");
      fread(&lector,sizeof(lector),1,prueba); //el & es necesario (lee más abajo por qué)
      fclose(prueba);
   }else{ // si no existe, lo creamos
      FILE* prueba = fopen ("Twotm.sav", "wb");
      fwrite("I",sizeof(lector),1, prueba); // es recomendable el uso de sizeof(variable) para no tener que calcular tu mismo
      fclose(prueba);                           // el espacio que se necesita o lo que ocupa cada variable
   }

   if (lector == 'I'){ // los caracteres se indican con comillas simples; las dobles indican cadenas de texto
      PA_OutputSimpleText(0,5,5,"Conseguido!");
      while (1){
         PA_WaitForVBL();
      }
   }else{
      PA_OutputSimpleText(0,5,5,"Fallido");
   }
}


Fíjate en que he cambiado alguna cosilla.

Vale, después de hacer este cacho de código me he dado cuenta de otro error que tenías, y que probablemente fuese la causa de todo. Tu has puesto fread(lector,1,1,prueba); con lo que estás pasándole a fread el contenido de "lector", cuando lo que necesitas es pasarle la dirección. Deberías haber puesto fread(&lector,1,1,prueba); para que fuese bien (ten en cuenta que si cambias el "I" del fwrite por alguna variable, esta debe llevar también el & delante del nombre). De todas formas, creo que es mejor usar la función acces que reabrir un archivo abierto, aunque eso ya queda a tu elección.

Espero haberte sido de ayuda. Ya nos cuentas qué tal te ha ido.

Un saludo ^^
keda escribió:Puedes utilizar dsftp + firezilla para no tener que estar sacando la SD. A mi me va muy bien ^^

Y no os preocupéis que el fat no es tan complicado, es cuestión de pillarle el truco.


ajola tubiera router wifi.... XDDDD

me tocara sacar y meter la SD 80 veces, pero mirando los fallos ke cometa amchacon ya voy guiandome y no tendre que hacer tantas pruebas ^^
Como ya dije en scenebeta, esto ya lo solucione antes de leer tu comentario. Pero aun asi gracias, asi comprendo mejor el arreglo que me ha hecho copete [ginyo]

Pos sigo teniendo problemas con fat otra vez XD. Ahora quiero que haga lo mismo pero en vez de un caracter, que sean 9. He puesto esto:

char lector[9];
if (!fatInitDefault())
{
PA_OutputSimpleText(0,21,6,"Error!");
PA_OutputSimpleText(0,2,12,"No se pudo acceder a fat!");
PA_OutputSimpleText(0,1,16,"Asegurese de haber parcheado");
PA_OutputSimpleText(0,1,18,"con dldi");

while (1){
PA_WaitForVBL();
}
}
else{
if (!access("Twotm.sav")){
FILE* prueba = fopen ("Twotm.sav","rb");
fread(&lector[9],9,1,prueba);
fclose(prueba);
}else{
FILE* prueba5 = fopen ("Twotm.sav", "wb");
fwrite("I",1,1, prueba5);
fclose(prueba5);
}
}

if (lector[9] == "niveles=2"){
while (1){
PA_OutputSimpleText(0,5,5,"Conseguido!");
PA_WaitForVBL();
}
}


Se supone que deberia detenerse el progama pero nada... Ah, en el archivo de texto pone niveles=2 eso si esta bien XDDD.

Saludos

PD: Perdon por tardar tanto en contestar, pero por la maldita prohibicion de doble post. Prefiero que cada mensaje mio sea lo mas util posible que sino, me tengo que callar despues XDD
Las cadenas de caracteres no se pueden comparar con el operador "==". Debes comprobar carácter a carácter o bien utilizar la función strcmp(cadena1,cadena2). Esta función devuelve 0 en caso de que las cadenas sean iguales y otro número en caso contrario. En tu caso sería algo así:

if (strcmp(lector, "niveles=2") == 0){
while (1){
PA_OutputSimpleText(0,5,5,"Conseguido!");
PA_WaitForVBL();
}
}

Por cierto, necesitarás añadir la librería string (#include <string.h>).

Ya nos cuentas que tal ^^
Una funcion muy util [ginyo]
Bueno pos tras arreglar la comparacion de cadenas usando el strcmp me sigue dando problemas. Uf...

No lo he podido mirar mucho porque me tengo que ir, pero aqui te dejo mi carpeta de pruebas con el codigo+ el archivo por si te hiciera falta:


Tranks

PD: 5 minutos!. Has batido tu record [ginyo]
if (strcmp(lector[9],"niveles=2")== 0){

esto lo que hace es comparar el carácter número 9 de lector con la cadena entera. La forma correcta es
if (strcmp(lector,"niveles=2")== 0){

Y también está mal el fread(&lector[9],9,1,prueba); por lo mismo de antes. Debe ser fread(&lector,9,1,prueba);

A parte de eso, con fwrite("I",1,1, prueba5); solo estas escribiendo un carácter, no una cadena de texto entera, por lo que lo que compara el strcmp es en realidad "I" y "niveles=2", cosa que nunca será igual -.-U

suerte ^^

PD: Es que a este tema estoy suscrito y me avisa cuando contesta alguien ^^
Ahhh. Esque cuando vi el ejemplo de palib y vi esta linea:

char Lector[9];


Creia que era una especie de array que creaba nueve variables lector para almacenar cada caracter, y claro. Yo declare mi presunta "array" en todas... Las idioteces que se me ocurren xDDD

Bueno pos con eso ya esta solucionado, muchisimas gracias :) .

PD: Lo del fwrite no tenia nada que ver, esa linea se activa si el archivo sav no existe. Y el archivo sav si que existe. Asi que...
Seguimos con los problemas jeje.
Bueno, he grabado la variable "idioma" al final del fichero:
FILE* prueba = fopen ("Twotm.sav", "ab");
fwrite(&idioma,1,1, prueba);
fclose(prueba);

Cuando se inicia el programa lee el fichero, y la variable idioma se configura:

FILE* prueba = fopen ("Twotm.sav","rb");
fread(&lector,3,1,prueba);
fseek(prueba, 4, 1);
fread(&idioma,1,1,prueba);
fclose(prueba);


Sin embargo, por razones desconocidas, no funciona. Lo curioso es que si coloco la variable idioma al principio en otro fichero va perfecto. Lo que me dice que es algo de la posicion... Pero el que?. Yo no veo ningun fallo a primera vista...

Saludos!
el fread directamente mueve el indicador del archivo de texto, con lo cual, al hacer el primer fread el indicador ya está en la posición 4, así que sobra el fseek.

Saludos ^^
keda escribió:el fread directamente mueve el indicador del archivo de texto, con lo cual, al hacer el primer fread el indicador ya está en la posición 4, así que sobra el fseek.

Saludos ^^

No sabia eso... Lo he corregido y va perfecto [ginyo]

Gracias!
aprovechando el hilo.. hay alguna forma de reproducir sonido en formato mod via fat? Porque he probado esto:

#include "sonido.h"

int main(){
PA_InitSound();
PA_PlayMod(sonido)
}
y no funciona, me da error en PA_InitSound, es como si estuviera obsoleto.
Eso no es fat ^^. Estas incluyendo el sonido a la rom...

Las funciones de Palib para los sonidos estan ya anticuadas, ahora tienes que usar librerias aparte. Como por ejemplo mikmod para la reproduccion de archivos mod.

En este ejemplo de palib explican su funcionamiento:
Palib\examples\Sound\MikMod

Creo que no es compatible con fat...

Saludos!
amchacon escribió:Eso no es fat ^^. Estas incluyendo el sonido a la rom...

Las funciones de Palib para los sonidos estan ya anticuadas, ahora tienes que usar librerias aparte. Como por ejemplo mikmod para la reproduccion de archivos mod.

En este ejemplo de palib explican su funcionamiento:
Palib\examples\Sound\MikMod

Creo que no es compatible con fat...

Saludos!


Ya se que no es fat, pero por eso mismo pregunto que si hay algun modo de hacerlo mediante fat, porque de la forma normal (incluyendo el archivo mod en la carpeta data) no me funciona, al contrario que antes que si rulaba. Podría usar la librería aslib pero creo que solo es para mp3 y no me gusta la calidad del sonido obtenido. Miraré lo de MikMod, y espero que sea compatible con las librerias efs. Espero mas respuestas, xaop
La libreria ASLIB no es solo para mp3, yo lo uso para los efectos de sonido de mi juego que estan en raw...

Aqui te dejo un ejemplo (no es por fat, pero supongo que no habra mucha diferencia...):
\palib\examples\Sound\SoundPlayback

Asi mismo, aqui tengo un hilo de duda con las aslib. A lo mejor te resulta util [ginyo] :
hilo_dos-funciones-en-aslib_1281669

Saludos!
18 respuestas