Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - amchacon

#341
Tomo nota del getchar(), no sé porqué siempre pienso que devuelve un char (ese nombre puñetero  :¬¬).

Lo del MAX está perfecto, fijate que:
Código (cpp) [Seleccionar]
char Cadena[MAX+1]= {""};

La razón de ese cambio es que me parece más intuitivo y menos propenso a errores usar como unidad de longitud MAX que MAX - 1.
#342
Código (cpp) [Seleccionar]
State::State(StateStack& stack, State::Context context)
: mContext(context)
{

}


Te dije que pasaras el Context por referencia:

Código (cpp) [Seleccionar]
State::State(StateStack& stack, State::Context &context)
: mContext(context)
{

}


Y en cuanto al error. ¿Seguro que no es un tema de archivos?
#343
Cita de: leosansan en 20 Enero 2014, 11:17 AMY lo de los nueve caracteres es por el tamaño que le dí a MAX, Si lo pongo mayor más "traga". Pero no es plan, claro.
No es eso, sino que se salta un caso. Y si le pongo aún más se salta más casos.
#344
Código (cpp) [Seleccionar]
State::State(StateStack& stack, State::Context context)

Pasa ese context por referencia y usa el constructor copia para inicializar tu Context:

Código (cpp) [Seleccionar]
State::State(StateStack& stack, State::Context &context) : mContext(context)
#345
Programación C/C++ / Re: Process returned 0
19 Enero 2014, 23:59 PM
Tienes que diferenciar entre 3 clases de errores:

- Errores de compilación. Los que detecta el compilador.
- Error de ejecución, es cuando el progama aborta inesperadamente. Se puede "comprobar" con del return 0, ya que eso indica que ha conseguido llegar hasta la última línea del progama. Si tienes un error de ejecución y quieres saber que línea lo provoca, te recomiendo que pongas pausas en el progama (o varios printf que te vayan diciendo la linea) así sabrás a partir de que línea falla.
- Errores lógicos, el progama funciona pero no hace lo que debería.

Y yendo al grano, el error (que no puedo porque no tengo ni el archivo ni el código completo). Ahora bien, hay algunas cosas que no me gustan:

Código (cpp) [Seleccionar]
void buscarFinLinea(FILE *fd)
{
  int car;
  while((car = fgetc(fd))!= '\n')
      ;
}

void ignorarEspacios(FILE *fd)
{
  int car;
  do
  {
      car = fgetc(fd);
  }while(car == '\t' || car == ' ');
}

char *Tabla_Operandos(FILE *hc12)
{
  int car,lon = 0,pos;
  char *cadena;
  fseek(hc12,-1,SEEK_CUR);
  pos = ftell(hc12);
  do
  {
      car = fgetc(hc12);
      lon++;
  }while(car != '\t' && car != ' ');
 
  //...
}


Que pasa si mientras estas leyendo, te encuentras un final de archivo?. Deberías comprobar que car != EOF en esos 3 bucles.

Y yendo al bucle principal:

Código (cpp) [Seleccionar]
do
{
   ignorarEspacios(hc12);
   dir[i] = Tabla_Operandos(hc12);
   printf("\t\t%s\t",dir[i]);
   ignorarEspacios(hc12);
   maq[i] = Tabla_Operandos(hc12);
   printf("%s\t",maq[i]);
   ignorarEspacios(hc12);
   cal[i] = Tabla_Operandos(hc12);
   printf("%s\t",cal[i]);
   ignorarEspacios(hc12);
   x_cal[i] = Tabla_Operandos(hc12);
   printf("%s\t",x_cal[i]);
   ignorarEspacios(hc12);
   suma[i] = Tabla_Operandos(hc12);
   printf("%s\n",suma[i]);
   buscarFinLinea(hc12);
   i++;
}
while(car == '\t');

¿Que pasa si i se hace más grande que MAX?

Otro consejo es que separes las líneas en bloques. Se ve más claro el código:
Código (cpp) [Seleccionar]
do
{
   //dir

   ignorarEspacios(hc12);
   dir[i] = Tabla_Operandos(hc12);
   printf("\t\t%s\t",dir[i]);

   //maq
   
   ignorarEspacios(hc12);
   maq[i] = Tabla_Operandos(hc12);
   printf("%s\t",maq[i]);

    //cal
   
   ignorarEspacios(hc12);
   cal[i] = Tabla_Operandos(hc12);
   printf("%s\t",cal[i]);

   //x_cal
   
   ignorarEspacios(hc12);
   x_cal[i] = Tabla_Operandos(hc12);
   printf("%s\t",x_cal[i]);

   //suma
   
   ignorarEspacios(hc12);
   suma[i] = Tabla_Operandos(hc12);
   printf("%s\n",suma[i]);

   //fin de linea
   
   buscarFinLinea(hc12);
   i++;
}
#346
El parametro window es un objeto, pero en la estructura lo tienes declarado como un puntero. Lo mismo con las texturas y las fuentes.

Mi consejo esque cambies los punteros por referencias:
Código (cpp) [Seleccionar]
struct Context
{
   //Constructor
   Context(sf::RenderWindow& window, TextureHolder& textures, FontHolder& fonts, Player& player);
   sf::RenderWindow& window;
   TextureHolder& textures;
   FontHolder& fonts;
   Player& player;
};


Eso si debería irte, también puedes dejarlos como punteros y hacer esto:

Código (cpp) [Seleccionar]
State::Context::Context(sf::RenderWindow& window, TextureHolder& textures, FontHolder& fonts, Player& player)
//Lista de inicialización
: State::Context::window(&window)
, State::Context::textures(&textures)
, State::Context::fonts(&fonts)
, State::Context::player(&player)
{

}


Pero son bastantes más comodas las referencias, te olvidas poner el * o los -> cada vez que vayas a usarlo.
#347
Vaya pues no había caído en eso :-X. Muy buen ojo Leo.

Tú solución no funciona adecuadamente si le metes 9 caracteres o más. El buffer de escritura es una fulana de cuidado.

La solución que se me ocurre es leerlo caracter a caracter:
Código (cpp) [Seleccionar]
#include <stdio.h>
#define MAX 5
#define TONUM 48

int main()
{
   char Cadena[MAX+1]= {""};
   int i,Numero;
   char ch;

   while (1)
   {
       printf("\nIntroduce un numero de 4 digitos: \n");

       i = 0;

       //ch = getchar();

       while ((ch = getchar()) != '\n')
       {
           if (i < MAX)
               Cadena[i++] = ch;
       }

       Cadena[i] = 0;

       printf("Cadena = %s \t Numero = ",Cadena);

       // Ahora convertimos la cadena a numerico

       for(i=0; Cadena[i]; i++)
       {
           Numero = Cadena[i] - TONUM;
           printf("%d", Numero);
       }

       printf("\n");
   }
   return 0;
}
#348
Cita de: MeCraniDOS en 19 Enero 2014, 16:53 PMEn un principio habia pensado lo del caracter nulo, pero al pasarlo por el debugger tampoco me ponia el '\0', asi que lo he descartado
'\0' es solo un simbolo para ti, el compilador lo traduce como un 0:
Código (cpp) [Seleccionar]
for(int i=0;Cadena[i] != 0;i++)
#349
Cita de: MeCraniDOS en 19 Enero 2014, 15:41 PMEso es lo que habia hecho, poner (MAX + 1), pero no sabia el porque con 5 cogia 4, con 4 cogia 3, etc
Pues esa no era la solución xD.

El código original funciona perfectamente, lo que pasa esque el último elemento es el caracter nulo. Por eso te sale -48.

Si pones en el fgets un (MAX+1), lo que pasará esque pondrá el caracter nulo FUERA de la cadena, modificar memoria que no te toca no es nada bueno nunca. Te funciona porque la cadena es la última variable que habías reservado de modo que solo estás modificando espacio vacio, si no fuera así estarías modificando el contenido de otra variable xD. Y si haces eso con memoria dinámica tu progama directamente abortará.

La solución es poner MAX = 5, también cambiara el for por:
Código (cpp) [Seleccionar]
for(int i=0;Cadena[i] != '\0';i++)
{
   Numero[i] = Cadena[i] - TONUM;
   printf("%d", Numero[i]);
}


De esa forma leerá hasta que encuentre el caracter nulo, lo que te permitirá meter cadenas de 1,2,3,4 caracteres. Tú código actual solo permite cadenas de 4 caracteres (si le metes 3, te saldrán un dato "extraño".
#350
La mayoría de los errores "extraños" que tengas van a ser por depistes, te lo digo yo ;-)

Por cierto en vez de gets se recomienda fgets, la razón es porque puedes limitar el número de caracteres leídos:
Código (cpp) [Seleccionar]
fgets(nombre,10,stdin); // Leer HASTA 10 caracteres del teclado
http://www.cplusplus.com/reference/cstdio/fgets/

Si no lo limitas, leerías todo y si son más de los 10 caracteres la puedes liar. En el mejor de los casos el SO te abortará el progama, en el peor de los casos sobreescribirás otras variables, con lo que te encontrarás "problemas extraños".