cuelgue al llamar a una función

Hola:

Me pasa una cosa muy extraña, tengo un programa main, que va llamando a diferentes funciones, cuando ejecuto este programa en el emulador Desmume, todo el programa funciona bien, el problema viene cuando meto el fichero .nds en el cartucho para ejecutarlo en la máquina física, lo lanzo y empieza el programa, que al llegar a una función que lee de un fichero de base de datos, el programa se queda colgado, al principio pensé que no se estaba inicializando bien la libfat pero luego puse una printf en la primera línea de la función, justo antes de hacer nada y me sorprendió porque se cuelga en la llamada, es decir, no llega a ejecutar esa primera línea que le puse como traza...me resulta muy extraño que se quede colgado al llamar a la función y no es que sea la primera función del main que se ejecuta, antes que esa pasa por otras funciones sin problema...no sé estoy estancado...a ver si me podéis echar una mano.

Gracias de antemano, un saludo.
¿Se cuelga en qué función?
Hola:

La función es una función que es implementada por mi, no es ninguna función de algún API de C estilo "strcmp","strcpy"....te pongo la cabecera si quieres y el trozo de código, aunque no sé si servirá de mucho...:

int GetInfo(int *numNiveles)
{
int n;
FILE *fd;
IPregunta p;

Poniendo una traza aquí, vemos que no se ejecuta esta línea

/* recorrer las preguntas e ir incrementando el nivel */
fd = fopen(idiomas[idiomauso].fichero, "rb");
if (fd == NULL)
return 1;
printf("GetInfo: cargando %s\n", idiomas[idiomauso].fichero);
n = 0;
while (fread(&p, sizeof(IPregunta), 1, fd)) {
/* se supone que las preguntas están ordenadas por niveles: 1, 2, 3, 4... */
printf("GetInfo: nivel %d\n", p.nivel);
if (p.nivel > n)
n++;
//PA_WaitForVBL();
}
*numNiveles = n;
printf("GetInfo: numNiveles %d\n", *numNiveles);
fclose(fd);
return 0;
}

La máquina se bloquea nada más llama a esta función, ni siquiera ejecuta la primera línea...

Gracias, un saludo.
Pon el cacho de código donde llamas a esa función, de ahí poco se puede sacar...
Ok, te pongo el main entero hasta la llamada a la función, se basa en un switch case, lo tipico empiezas en la pantalla de elección de idioma, luego del tipo juego y demás, el problema ocurre cuando entramos en el caso de "juego_en_solitario" que está la función esta GetInfo() que es llamarla y petar, sin embargo como puedes ver antes que esa ejecuta bastantes funciones más sin ningún problema...¿Puede ser algún problema de definición de variables?, la verdad es que es bastante difícil explicar el problema porque es muy raro [agggtt] , espero que con ésto puedas ver algo más....

#include "Funciones.h"
#include "Idiomas.h"
#include "Preguntas.h"
#include <PA9.h>       // Include para PA_Lib
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <vector>
#include <list>
#include <cstdlib>
#include "dibio.h"

using namespace std;

int main()
{
   int tamList;
   int leng = 0;
   bool start = false;
   int estado = ESTADO_ELEGIR_IDIOMA;
   char* idioma = NULL;
   int id = 0;
   int tam = 0;
   int numNiveles = 0;
   //int nivel;
   int contadorNivel = 0;
   bool correcto = false;
   bool todasContestadas = false;
   bool iniciado = false;
   bool pulsado = false;//control
   int numRespondidas = 0;
   pregunta sigPreg;
   idiomas structIdioma;
   vector<pregunta> listaPreguntas;
   vector<control> listaControl;
   pregunta *listaNivel;
   time_t hora = 0;
   int i;
   
   /*unsigned seed = (unsigned)time(0);
   seed ++;*/

   PA_Init();    // Inicializa PA_Lib
   PA_InitVBL(); // Inicializa una VBL estándar

   //srand(time(NULL));
   PA_InitRand();
   hora = time(NULL);

   PA_InitText(1, 0);
   PA_OutputText(1,9,10,"aleatorio: %d",hora);
   
   // bucle infinito para mantener el programa funcionando
   while (1)
   {
      switch (estado)
      {
      
      case ESTADO_ELEGIR_IDIOMA:

         LimpiarPantallaNormal();
         
         estado = ElegirIdioma(&idioma);
            
         if (strcmp(idioma,"ingles") == 0)
         {
            CargarIdiomaIngles(structIdioma);

         }else if (strcmp(idioma,"castellano") == 0)
         {
            CargarIdiomaCastellano(structIdioma);

         }else
         {
            CargarIdiomaEuskara(structIdioma);
         }

         leng = EstablecerIdioma(idioma); //ALAIN

         if (leng != 0)
         {
            PA_InitText(1, 0);
            PA_OutputSimpleText(1,15,10,"error");
            PA_InitText(1,1);
            PA_OutputText(1,20,20,"%d",leng);
            
         }

         while (start == false)
         {
            PA_InitText(1, 2);
            PA_OutputText(1,1,2,"%s",structIdioma.inicio);

            if (Pad.Newpress.Start)
            {
               LimpiarPantallaNormal();
               start = true;
            }
            PA_WaitForVBL();
         }
         start = false;
         
         break;

      case ESTADO_INICIO:

         //este será el menu de juego, aquí se podrá meter más funcionalidad en el futuro.

         estado = PantallaInicio(idioma);

         break;

      case ESTADO_ELEGIR_TIPO_JUEGO:

         LimpiarPantallaNormal();
   
         estado = ElegirTipoJuego(structIdioma.tipoJuego);
         break;

      case ESTADO_JUEGO_SOLITARIO: //JUEGO EN SOLITARIO;

         LimpiarPantallaTactil();
         LimpiarPantallaNormal();

         SecuenciaInicio(structIdioma);
         
         if (iniciado == false)
         {
                      GetInfo (&numNiveles); //devuelve el número de niveles diferentes existentes en la BD (AQUI SE CUELGA)
            iniciado = true;
         }

         ...
   }

   
   return 0;
}
}


Muchas gracias de antemano!!
Te falta:

#include <fat.h>


Y al principio del código, después de PA_Init() y demás...

fatInitDefault();


Un fallo bastante común. xD


Ams, y comprueba que en el makefile en "LIBS :=" tienes puesto "-lfat", si no no te compilará.
mmmm...creo que no es eso, de hecho hay una función antes que la de GetInfo() , se llama EstablecerIdioma, esa es la que hace el primer acceso a la base de datos y en esa se hace el FatInitDefault(), pero esa función la hace bien.

De todas formas, he cambiado el código para hacer como tu me has dicho y tampoco ha habido suerte...Igual como dato extra igual te sirve de algo saber que si lo ejecuto sobre el emulador Ideas, se bloquea en la pantalla inicial y sale el texto de manera intermitente...osea que sólo funciona en Desmume bien [buuuaaaa].

Un saludo!
Pues ni idea... ¿Llega a pasar de "SecuenciaInicio(structIdioma);"?
Sí, de hecho le puse unas trazas y entra en el If de después, luego ya llega a la función GetInfo() y pierde el control totalmente...
¿Te salen warnings en el compilador a la hora de compilar?
yo_tu_el escribió:mmmm...creo que no es eso, de hecho hay una función antes que la de GetInfo() , se llama EstablecerIdioma, esa es la que hace el primer acceso a la base de datos y en esa se hace el FatInitDefault(), pero esa función la hace bien.

De todas formas, he cambiado el código para hacer como tu me has dicho y tampoco ha habido suerte...Igual como dato extra igual te sirve de algo saber que si lo ejecuto sobre el emulador Ideas, se bloquea en la pantalla inicial y sale el texto de manera intermitente...osea que sólo funciona en Desmume bien [buuuaaaa].

Un saludo!


No soy muy ducho con palib, pero....

¿Inicializas la fat en una función? ¿No te dará problemas luego en la otra? Yo lo inicializaria en el main....... no sé como lo tendrás extructurado, pero recuerda los ámbitos que puede tener. Quizás al terminar la funcion EstablecerIdioma "borra" el FatInitDefault (o lo q carajos haga esa función) por eso, al intentar correr GetInfo no rula! :)

Ah, y estás seguro que llega a GetInfo? ¿Pusiste algun print justo delante de la función, en el main?
Eleazar escribió:¿Inicializas la fat en una función? ¿No te dará problemas luego en la otra? Yo lo inicializaria en el main....... no sé como lo tendrás extructurado, pero recuerda los ámbitos que puede tener. Quizás al terminar la funcion EstablecerIdioma "borra" el FatInitDefault (o lo q carajos haga esa función) por eso, al intentar correr GetInfo no rula! :)

No, eso no tiene nada que ver. Todo lo que hace esa función se mantiene fuera del alcance del programador, da igual donde se llame.
En cuanto a lo de los warnings, pues sí hay alguno de variables sin uso, y hay otros dos que me dicen lo siguiente:

1>c:/PFC/VisualCPP/TrivIO/TrivIO/source/db_preg.c: In function 'db_pregc2i':
1>c:/PFC/VisualCPP/TrivIO/TrivIO/source/db_preg.c(19): warning: passing argument 1 of 'c2i' from incompatible pointer type
1>c:/PFC/VisualCPP/TrivIO/TrivIO/source/db_preg.c(19): warning: passing argument 2 of 'c2i' from incompatible pointer type
1>c:/PFC/VisualCPP/TrivIO/TrivIO/source/db_preg.c: In function 'db_pregi2c':
1>c:/PFC/VisualCPP/TrivIO/TrivIO/source/db_preg.c(35): warning: passing argument 1 of 'i2c' from incompatible pointer type
1>c:/PFC/VisualCPP/TrivIO/TrivIO/source/db_preg.c(35): warning: passing argument 2 of 'i2c' from incompatible pointer type

Aunque no les he dado mucha importancia viendo que me funcionaba en el emulador (aunque se que en c es mejor quitarse los warnings), puede afectar esto a lo que me está pasando?

En cuanto a lo de la inicialización del fat, ayer me comento ANTONIOND que podría ser eso, pero ya lo tengo hecho y sigue pasando y he probado a inicializar de las dos maneras,tanto como lo tenía yo que era en la primera función que hace uso de la base de datos e inicializandola desde el main...pero nada.

Un saludo.
12 respuestas