• Viernes 15 de Noviembre de 2024, 04:52

Mostrar Mensajes

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


Mensajes - Atreyu

Páginas: [1]
1
C/C++ / Re: Cargar Archivo
« en: Jueves 15 de Septiembre de 2005, 21:01 »
Ufff.
Siento haber tardado tanto en responder. En realidad no lo se :blink: . Escaneaba un salto de linea en ese punto y fscanf devolvia 0, con lo que era un fallo del fscanf. Lo que hice fue volvera reescribir todo en una unica linea de scanf mas el bucle de la tabla.
Un saludo.

2
C/C++ / Re: Cargar Archivo
« en: Martes 13 de Septiembre de 2005, 21:03 »
Resuelto el ultimo problema. Gracias por toda esta ayuda, Diodo.

3
C/C++ / Re: Cargar Archivo
« en: Martes 13 de Septiembre de 2005, 19:04 »
El caso no es que me lea basura, es que no me lo lee correctamente:

Código: Text
  1.  
  2. num = fscanf (f, "%s", x->jugada.partida);
  3. if (!num)
  4.    return ERROR_ABRE;
  5.  
  6. num = fscanf (f, "%c", &x->jugada.ficha);//en este esta el problema
  7. if (num!=1)
  8.    return ERROR_ABRE;
  9.  
  10. num = fscanf (f, "%c", &y->ficha);
  11. if (num!=1)
  12.   return ERROR_ABRE;
  13.  
  14.  

Este es un error muy extraño: la primera fila que escanea la cadena de caracteres partida la introduje por error al copiar y pegar para experimentar y solucionar los problemas que he tenido, pero cuando la quito, fscanf no devuelve como deberia 1 y me da ERROR_ABRE, si no lo quito me modifica de nuevo el nombre de partida y me desordena la tabla y datos que vienen a continuacion. Es un error muy extraño.

4
C/C++ / Re: Cargar Archivo
« en: Martes 13 de Septiembre de 2005, 18:10 »
¿No tendra tambien fflush() su equivalente para cargar archivos con fscanf? Tambien me lee basura en un punto de la apertura de archivo. Llevo un buen rato buscando en internet pero no he encontrado nada

5
C/C++ / Re: Cargar Archivo
« en: Martes 13 de Septiembre de 2005, 17:21 »
Si, :bravo:  muchisimas gracias otra vez. Esta si que no la hubiera podido resolver yo solo en mucho tiempo. Y tengo otra funcion que añadir a mis apuntes. :gracias:

6
C/C++ / Re: Cargar Archivo
« en: Martes 13 de Septiembre de 2005, 16:46 »
Si, era eso. Ahora me parece la duda un tanto tonta y la solucion demasiado obvia, no me puedo creer que me haya tirado tanto tiempo comiendome la cabeza y dandole vueltas. Muchas gracias.

Tenia otra duda que me ha pasado ya dos veces en este mismo programa: al escanear una variable tipo char del teclado, directamente no deja teclear la letra y automaticamente le da el valor 10 en ASCII, que creo que es el salto de linea. Pero en cambio al escanear la variable siguiente no da ningun problema:

printf ("\nJugador 2 introduzca el caracter que desea que sea su ficha: ");
scanf  ("%c", &jugador2->ficha); // Aqui es donde salta directamente al ejecutar hasta el siguiente scanf dando el valor 10, es del tipo jugadorsec

   
printf ("\nJugador 1 introduzca el caracter que desea que sea su ficha: ");
scanf  ("%c", &jugador1->jugada.ficha); //jugador1 es del tipo jugprinc y si que escanea este
 _________________________________________________________

printf ("\n¿Cargar %s? s/n: ", x->jugada.partida);
scanf ("%c", &afirm); // Aqui me pasa lo mismo y pasa olimpicamente de leer nada de la pantalla (afirm es un char)


Si me resolvierais tambien esta duda por fin podria poner punto y final a mi programa. Muchas gracias.
 Un saludo.

7
C/C++ / Re: Cargar Archivo
« en: Martes 13 de Septiembre de 2005, 11:58 »
Hola de nuevo:

Creo que me he excedido con la pregunta, la voy a resumir e intentar aclarar un poco porque me he dado cuenta que es totalmente intratable:

Al cargar un archivo desde esta función:

int cargar (char * archivo, Jugador * x, Jugadorsec * y)
{
   int num;

   FILE * f;

   f = fopen (archivo, "r");

   if (!f)
      return ERROR_ABRE;

   num = fscanf (f, "%s", x->jugada.partida);
   if (num!=1)
       return ERROR_ABRE;

   num = fscanf (f, "%d", x->filas);
   if (num!=1)
       return ERROR_ABRE;

   num = fscanf (f, "%d", x->columnas);
   if (num!=1)
       return ERROR_ABRE;


   return OK;
}

LLamo a la funcion correctamente y me lee la primera fila de datos del archivo de texto sin ningun problema (la correspindiente a la cadena de caracteres), pero al leer, la segunda linea (x->filas) me da un error al ejecutar el programa. No tengo ni idea a que se debe ni si realmente podría escribir la lectura de datos en un único fscanf en lugar de tener que repetir lo mismo varias veces.

El archivo es "save.txt" y tiene una pinta tal que asi:

Partida
12
21

8
C/C++ / Cargar Archivo
« en: Lunes 12 de Septiembre de 2005, 20:10 »
Wenasss:

Estaba yo guardando y cargando una partida guardada de mi cuatro en raya, pero me da serios problemas a la hora de cargar el archivo guardado (es largo :argh:  pero espero dejarlo bastante claro):

int cargar (char * archivo, Jugprinc * x, Jugadorsec * y)
{
   char afirm;
   int num;
   int i, j;

   FILE * f;

   f = fopen (archivo, "r");

   if (!f)
      return ERROR_ABRE;

   do
   {
      num = fscanf (f, "%s", x->jugada.partida);
      if (num<10)
         return ERROR_ABRE;

/*Estas lineas son basicamente lo mismo que tenia en una unica orden pero separe porque me daban problemas tambien*/

      num = fscanf (f, "%d", x->filas);
      if (num!=1)
         return ERROR_ABRE;

      num = fscanf (f, "%d", x->columnas);
      if (num!=1)
         return ERROR_ABRE;

      num = fscanf (f, "%c", x->jugada.ficha);
      if (num!=1)
         return ERROR_ABRE;

      num = fscanf (f, "%c", y->ficha);
      if (num!=1)
         return ERROR_ABRE;

      num = fscanf (f, "%s", x->jugada.nombre);
      if (num!=1)
         return ERROR_ABRE;

      num = fscanf (f, "%s", y->nombre);
      if (num!=1)
         return ERROR_ABRE;

      num = fscanf (f, "%d", x->jugada.turno);
      if (num!=1)
         return ERROR_ABRE;

      for (i=0; i<x->filas; i++) //Se guarda el tablero que se crearia antes de este bucle
         for (j=0; j<x->columnas; j++)
         {
            num = fscanf (f, "%c", x->tablero[j]);
            if (num != 1)
               return ERROR_CARGA;
         }

      do
      {
         printf ("\n¿Cargar %s? s/n: ", x->jugada.partida);
         scanf ("%c", &afirm);
      }while ( afirm == 's' || afirm =='n');
   }while (afirm == 's');

   return OK;
}


Pues bien, el fallo me lo da al tratar de cargar el segundo dato (x->filas) que da un error de esos tan catastroficos de windows de enviar informe de errores... y con el depurador me da una ventana de error de unhanled expresion... acces violation.

Si os sirve el archivo guardado tiene una pinta tal que asi:

Antonieta
12
21
1
X
adsf
fda
0
(                                                                                                                                                                                                                                        1X1     X           )

Lo que hay entre parentesis es la tabla, ya que la mayoria son casillas en blanco, esta toda escrita sin espacios (igual tambien deberia guardarla como 0 de ASCII y no como espacios).

typedef struct
{
   char nombre [30];
   char ficha;
   int  turno;
   char partida [30];
} Jugadorsec;

typedef struct
{
   Jugadorsec jugada;
   int        filas, columnas;
   char       **tablero;   
} Jugprinc;

Agradeceria cualquier ayuda en este tema. ¿Puedo meter todo el cargado hasta la tabla en una linea como queria al principio o tengo que separarlo como he hecho aqui?

9
C/C++ / Re: Memoria Dinamica
« en: Martes 30 de Agosto de 2005, 21:05 »
Si. Muchas gracias :D. Nunca me termine de aclarar con los punteros. Pense que al declarar un puntuero de una estructura que contenia un puntero bastaba. Gracias de nuevo

10
C/C++ / Memoria Dinamica
« en: Martes 30 de Agosto de 2005, 14:38 »
Hola:
Estaba intentando crear una tabla de dos dimensiones con memoria dinamica. Lo que no se es si puedo crearla en otra funcion que no sea main y que esta, después de meter el parámetro cuando la llamo desde main tambien se pueda usar sin problemas en void main()
Ademas me da una serie de problemas:


short crear_tablero (Jugadorrommel *tabla)
{
   int i;

   tabla->tablero = (char **) malloc (tabla->filas * sizeof (char *));

   if (tabla->tablero == NULL)
      return ERROR_MEMORIA;

   for (i=0; i< tabla->filas; i++)
      tabla->tablero = (char *) malloc (tabla ->columnas * sizeof (char));

}





typedef struct
{
   Jugadorsec   jugada;
   int                filas, columnas;
   char             *tablero;   
} Jugadorrommel;


Parece ser que la funcion siempre devuelve error y nunca crea la memoria con los siguientes warnings:

warning C4047: '=' : 'char *' differs in levels of indirection from 'char ** '
warning C4047: '=' : 'char ' differs in levels of indirection from 'char *'
warning C4715: 'crear_tablero' : not all control paths return a value

Agradeceria cualquier ayuda en esto

Páginas: [1]