PDA

Ver la versión completa : Problema con fopen



Salustian
24/05/2006, 18:00
Hola a todos,
No sé si se habrá tocado este tema antes, pero el buscador no funciona.

Mi problema es que no consigo abrir un fichero con fopen (sí, es así de triste :confused: )

Uso las SDL de Chui, y por lo que tenía entendido, con inicializar el acceso a la tarjeta de memoria con SmcInit() era suficiente... pero no traga, podeis ver el código que uso a continuación:

FILE *ffi;

#ifdef GP32
SmcInit(); /* Iniciar acceso a la SMC */

ffi = fopen("datos/art.dat","rb");
if(ffi == NULL) ffi = fopen("gp:\\gpmm\\datos\\art.dat","rb");
if(ffi == NULL) ffi = fopen("gp:/gpmm/datos/art.dat","rb");
if(ffi == NULL) ffi = fopen("./datos/art.dat","rb");
if(ffi == NULL) ffi = fopen(".\\datos\\art.dat","rb");
if(ffi == NULL) ffi = fopen("datos\\art.dat","rb");
#else /* Código para windows */
ffi = fopen("datos/art.dat","rb");
#endif

Compilado en windows, no hay ningún problema, pero con el DevKitArm_r17 la variable ffi siempre es NULL :mad:

¿Algún alma caritativa me echa un cable?

Infinitas gracias.

Malenko
24/05/2006, 18:33
pregunta tonta... has hecho el include correcto para GP32?

Salustian
24/05/2006, 19:07
Sí, hay un #include <x_gp32.h> al principio, de hecho las funciones para cambiar de velocidad la CPU van a la perfección. Y el <stdio.h> también está incluido.

Malenko
24/05/2006, 19:10
Has visto el error que te devuelve en errno?

LTK666
24/05/2006, 19:39
Prueba en la ruta con "/datos/loque.sea"

tipo:

ffi = fopen("/datos/art.dat","rb");

Salustian
24/05/2006, 21:44
Prueba en la ruta con "/datos/loque.sea"

tipo:

ffi = fopen("/datos/art.dat","rb");

No funciona. :(

El errno después de hacer un fopen fallido es 0. Nunca había usado errno antes, y por lo que he investigado, con un #include <errno.h> y leer la variable errno después de la llamada a fopen es suficiente... ¿cierto?

Gracias por responder.

Malenko
24/05/2006, 21:50
No, si fopen devuelve NULL el valor de errno te indica el motivo del error. Pero si es cero diria que no ha habido ningún tipo de error :loco:

Como sabes que te da siempre NULL? Prueba a asignarle un valor antes de utilizar fopen, a ver si lo cambia a NULL.

Salustian
24/05/2006, 22:14
He cambiado el código a ésto:

FILE *ffi = (FILE *)0xFF;

char cadena[100];

#ifdef GP32
SmcInit(); /* Iniciar acceso a la SMC */

ffi = fopen("datos/art.dat","rb");
if(ffi == NULL)
sprintf(cadena,"errno: %d - ffi: NULL",errno);
else
sprintf(cadena,"errno: %d - ffi: no es NULL",errno);

if(ffi == NULL) ffi = fopen("gp:\\gpmm\\datos\\art.dat","rb");
if(ffi == NULL) ffi = fopen("gp:/gpmm/datos/art.dat","rb");
if(ffi == NULL) ffi = fopen("./datos/art.dat","rb");
if(ffi == NULL) ffi = fopen(".\\datos\\art.dat","rb");
if(ffi == NULL) ffi = fopen("datos\\art.dat","rb");
#else
ffi = fopen("datos/art.dat","rb");
#endif


En la variable "cadena" veo que "errno" es 0 y "ffi" es NULL.

Gracias por el interés.

rlyeh
24/05/2006, 22:22
leete la docu de mirko
no creo q sea fopen, con el sdk oficial era GpFileRead

Salustian
24/05/2006, 22:38
leete la docu de mirko
no creo q sea fopen, con el sdk oficial era GpFileRead

¿¿¿???? Pero el SDL de Chui no había eliminado la necesidad del SDK oficial ???

fopen tiene que poder usarse, si no, no se harían ports tan rápidos de programas SDL de otros sistemas, creo yo.

theNestruo
25/05/2006, 03:29
Te pego fragmentos de mi código (que funcionan)


F_HANDLE file;

GpFatInit();
GpRelativePathSet("gp:\\gpmm\\crush\\");

GpFileOpen(fileName, OPEN_R, &file);
GpFileRead(file, &(img->width), sizeof(unsigned int), &readSize);
GpFileRead(file, &(img->height), sizeof(unsigned int), &readSize);
GpFileRead(file, &numberOfImages, sizeof(unsigned int), &readSize);
/* ... */
GpFileClose(file);

Aiken
26/05/2006, 00:57
Te pego fragmentos de mi código (que funcionan)


Pero en que programais vosotros!!??
GpFatInit();
GpRelativePathSet("gp:\\gpmm\\crush\\");
GpFileOpen(fileName, OPEN_R, &file);
GpFileRead(file, &(img->width), sizeof(unsigned int), &readSize);

Todas esas llamadas no son el SDK oficial? del primero que hubo vamos ...

Yo uso fopen y me funciona, pero no uso el devkitARM, ni las ultimas SDL, sino un wraper antiguo que existia, y estoy de acuerdo contigo en que en las nuevas SDL va como tu dices, a no serque en las nuevas SDL haya funciones creadas por Chui que sustituyan al fopen :confused:

Aiken

kmkzk
26/05/2006, 01:42
HOla,
recuerdo haber tenido problemas con el fopen cuando hacia cosillas pa la gp32.
Mira haber si has hecho GpFatInit().
Sino, prueba a declarar la variable de fichero sin puntero. Creo que en me daba algun problema si lo declaraba como puntero, pero no lo recuerdo muy bien.

Algo asi como:

FILE ffi;
&ffi = fopen("datos/art.dat","rb");

(tal vez esto sea una burrada, ando algo oxidado ultimamente)

Suerte

theNestruo
26/05/2006, 01:54
Pero en que programais vosotros!!??
Pues a la vista del código, está claro que en MSX-BASIC, ¿no? xD

Todas esas llamadas no son el SDK oficial? del primero que hubo vamos ...
Yeah! ¡¡¡Documentadas en pseudo-inglés en GP32 GPSDK API REFERENCE Ver 1.0!!!

Mi código no utiliza SDL, pero también es cierto que no utiliza el SDK oficial para nada más (aparte de cargar las imágenes), así que supongo que también funcionaría con SDL.

< - >

Sino, prueba a declarar la variable de fichero sin puntero.
Efectivamente, ahora que me lo recuerdas: FILE *ya* es un puntero per sé (está así 'typedef'inido o '#define'ido, no recuerdo bien).
Salustian, prueba a declarar ffi como 'FILE ffi;' en tu código original (el del primer post) y mira a ver si así tira.

Salustian
26/05/2006, 14:46
Lo primero agradecer vuestro interés.

Me temo que el problema viene con la inicialización del acceso a la tarjeta, como si SmcInit() no hiciese nada, ya que he probado ha cargar una imagen con:

sprite = IMG_Load("datos/sprite.png");

y no funciona. He probado a poner el path absoluto y relativo, con los dos tipos de barra (/ y \), sencillas y dobles, y nada de nada, siempre me devuelve NULL.

Compilado en windows funciona perfectamente.

Y según he leido en varios post de los foros IMG_Load funciona sin problemas en la GP32.

Voy a actualizar a devkitarm_r18 y creo que A600 había recompilado las SDL, así que haré más pruebas.

¿Alguna sugerencia más?

anibarro
26/05/2006, 16:26
Salustian prueba a incluir este wrapper que te adjunto, creo que ahora funciona muy bien.
De todas formas es raro que con las ultimas SDL de chui te haga falta tanto rollo...si puedes habla con A600 que el domina el tema ;)

Salustian
26/05/2006, 19:08
En la página de Chui pone ésto:

LIBC REPLACEMENT.
Core library. Standard C library replacement, newlib based but contains code of RobBrown, Chui and Mirko.
Also you can read 'x_gp32.h' header file for extra low level functions: video mode select, draw messages with internal fonts, enable/disable IRQs, etc...

Según entiendo yo, esto quiere decir que Chui ha reescrito fopen y demás funciones... ¿cierto?

Anibarro, gracias por tu ofrecimiento, pero tengo entendido que con las SDL no hace falta para nada el SDK oficial y preferiría evitarlo.

Un saludo.

anibarro
26/05/2006, 21:57
haces bien ;P Ya te digo que intentes contactar con A600 que hizo muchos ports SDL en los que se manejaban archivos

Aiken
26/05/2006, 22:08
ayer mirando codigo ... vi que hacian un smc_init y me acorde de ti :) porque luego usaban smc_open, smc_close, smc_read, lo has probado? :)

Aiken

< - >

sprite = IMG_Load("datos/sprite.png");
Y según he leido en varios post de los foros IMG_Load funciona sin problemas en la GP32.


yo uso el gpwrap.h que te han adjuntado, pero ya te digo que es mas antiguo que la propia gp32 :D

Y en cuanto al Img_Load de las SDL, yo he leido en algun foro que daba problemas y recomendaban usar fopen y fread para leerlo a un buffer, y luego en lugar de cargarlo con Img_Load cargarlo con Img_LoadRW directamente de la memoria.


de todas formas prueba el smc_open y smc_read que creo que pertenecen a las x_gp32.h :)

Aiken

Salustian
26/05/2006, 22:30
Solucionado. Era un problema con los paths.

Lo que en windows es "datos/art.dat" para la GP32 debe ser "gpmm/datos/art.dat", a pesar de que la posición relativa entre el ejecutable y el fichero de datos sea la misma en ambos casos :confused:

Lo pillé por un ejemplo que publicó the_Guolin hace un tiempo (gracias tío).

Seguramente estará escrito en algún lugar de una documentación que debería haber leido :D



Y en cuanto al Img_Load de las SDL, yo he leido en algun foro que daba problemas y recomendaban usar fopen y fread para leerlo a un buffer, y luego en lugar de cargarlo con Img_Load cargarlo con Img_LoadRW directamente de la memoria.
Aiken

Es lo que precisamente estaba intentando hacer (y lo he conseguido :D )

El IMG_Load tambien funciona perfectamente.


de todas formas prueba el smc_open y smc_read que creo que pertenecen a las x_gp32.h

En el x_gp32.h que viene con las SDL no tiene esas funciones.

Y fopen, fread, fclose , etc. funcionan a la perfección, gracias al magnífico trabajo de Chui.

Gracias a todos por vuestro interés y vuestro tiempo :brindis:

Aiken
26/05/2006, 22:38
Lo que en windows es "datos/art.dat" para la GP32 debe ser "gpmm/datos/art.dat", a pesar de que la posición relativa entre el ejecutable y el fichero de datos sea la misma en ambos casos :confused:



Eso es porque la gp32 lee por defecto de gp:// no de la carpeta donde esta el ejecutable, hay una funcion que se llama algo asi como GpRelativePathSet en el que le dices cual es el path inicio, supongo que habra su equivalente en x_gp32.h ;)

PD. Lo digo porque si pones al principio una llamada a GpRelativePathSet, podras usar el mismo path para windows y gp32 ;)

Aiken

esp3tek
26/05/2006, 22:57
Lo pillé por un ejemplo que publicó the_Guolin hace un tiempo (gracias tío).

lo se, no viene a cuento, pero the goulin perdio su vieja pagina web y los ejemplos o ejercicios o explicaciones de su web, si lo stienes pasaselos que el otro dia hizo un llamamiento aver si alguien los tenia

rlyeh
27/05/2006, 15:47
Y fopen, fread, fclose , etc. funcionan a la perfección, gracias al magnífico trabajo de Chui.


Fue LD_Chen xD

Salustian
29/05/2006, 16:18
lo se, no viene a cuento, pero the goulin perdio su vieja pagina web y los ejemplos o ejercicios o explicaciones de su web, si lo stienes pasaselos que el otro dia hizo un llamamiento aver si alguien los tenia

El ejemplo que vi de goulin lo saque del foro, no sabía de su web.


Fue LD_Chen xD

Pues magnífico trabajo de LD_Chen. :rolleyes: