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.
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.
Has visto el error que te devuelve en errno?
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.
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.
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);
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
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
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:
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
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
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:
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.