Sábado 14 de Diciembre de 2024, 10:58
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Error al imprimir un campo de un registro, devuelve "ZERO"
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Error al imprimir un campo de un registro, devuelve "ZERO" (Leído 3504 veces)
huevofritopamojarpan
Nuevo Miembro
Mensajes: 22
Error al imprimir un campo de un registro, devuelve "ZERO"
«
en:
Sábado 20 de Junio de 2009, 21:23 »
0
Código: C
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
//Constantes
#define USUARIO "root"
#define PASSWORD "7"
#define STRING_CORTO 21
#define STRING_LARGO 42
///////////////////////////////////////////////////////////////////////////////////////////////////
//Declaración de los tipos de variables
//Tipo de dato fecha.
typedef
struct
{
int
ano
,
mes
,
dia
,
hora
,
min
,
seg
;
}
tipo_fecha
;
//Tipo de dato usuario.
typedef
struct
{
char
login
[
21
]
,
password
[
21
]
,
nombre
[
21
]
,
apellido
[
42
]
,
ext
[
6
]
;
tipo_fecha ult_reserva
;
}
tipo_usuario
;
//Tipo de dato reserva
typedef
struct
{
unsigned
short
int
ocupado
;
tipo_usuario usuario
;
}
tipo_reserva
;
///////////////////////////////////////////////////////////////////////////////////////////////////
//OK Inserta en el primer usuario los datos del segundo
void
copiar_usuario
(
tipo_usuario
*
usuario_d
,
tipo_usuario
*
usuario_s
)
{
strcpy
(
usuario_d
->
login
,
usuario_s
->
login
)
;
strcpy
(
usuario_d
->
password
,
usuario_s
->
password
)
;
strcpy
(
usuario_d
->
nombre
,
usuario_s
->
nombre
)
;
strcpy
(
usuario_d
->
apellido
,
usuario_s
->
apellido
)
;
strcpy
(
usuario_d
->
ext
,
usuario_s
->
ext
)
;
}
//OK Compara dos usuarios, devuelve 0 si no coinciden en nada, 1 si coinciden en login y password, y 2 si coinciden en todo
unsigned
short
int
usuario_cmp
(
tipo_usuario
*
usuario1
,
tipo_usuario
*
usuario2
)
{
if
(
(
strcmp
(
usuario1
->
login
,
usuario2
->
login
)
==
0
)
&&
(
strcmp
(
usuario1
->
password
,
usuario2
->
password
)
==
0
)
&&
(
strcmp
(
usuario1
->
nombre
,
usuario2
->
nombre
)
==
0
)
&&
(
strcmp
(
usuario1
->
apellido
,
usuario2
->
apellido
)
==
0
)
&&
(
strcmp
(
usuario1
->
ext
,
usuario2
->
ext
)
==
0
)
)
{
printf
(
"2"
)
;
return
2
;
}
else
if
(
(
(
strcmp
(
usuario1
->
login
,
usuario2
->
login
)
==
0
)
&&
(
strcmp
(
usuario1
->
password
,
usuario2
->
password
)
==
0
)
)
||
(
(
strcmp
(
usuario1
->
nombre
,
usuario2
->
nombre
)
==
0
)
&&
(
strcmp
(
usuario1
->
apellido
,
usuario2
->
apellido
)
==
0
)
)
)
return
1
;
else
return
0
;
}
//OK Devuelve un 1 si se loguea correctamente como usuario y un 0 si no. Si se loguea el root devuelve 2;
unsigned
short
int
login
(
tipo_usuario
*
usuario
,
tipo_usuario
*
lista_usuarios
)
{
unsigned
short
int
i
;
printf
(
"Login: "
)
;
gets
(
(
usuario
->
nombre
)
)
;
printf
(
"Password %d: "
,*
(
usuario
->
nombre
)
)
;
scanf
(
"%20s"
,&
(
usuario
->
password
)
)
;
if
(
(
strcmp
(
usuario
->
login
,
USUARIO
)
==
0
)
&&
(
strcmp
(
usuario
->
password
,
PASSWORD
)
==
0
)
)
{
printf
(
"nLogueado como administradorn"
)
;
return
2
;
}
else
{
for
(
i
=
0
;
i
<
10
;
i
++
)
{
if
(
usuario_cmp
(
usuario
,
lista_usuarios
+
i
)
==
0
)
{
copiar_usuario
(
usuario
,
(
lista_usuarios
+
i
)
)
;
printf
(
"Hola %s"
,
(
usuario
->
nombre
)
)
;
return
1
;
break
;
break
;
}
}
return
0
;
}
}
//OK Intruce en la matriz de reservas, en la fecha (formato real) una reserva realizada por el usuario.
void
reservar
(
tipo_reserva
*
matriz_reservas
,
tipo_fecha
*
fecha
,
tipo_usuario
*
usuario
)
{
if
(
usuario
==
NULL
)
(
matriz_reservas
+
13
*
31
*
(
fecha
->
mes
-
1
)
+
13
*
(
fecha
->
dia
-
1
)
+
fecha
->
hora
-
8
)
->
ocupado
=
0
;
else
{
(
matriz_reservas
+
13
*
31
*
(
fecha
->
mes
-
1
)
+
13
*
(
fecha
->
dia
-
1
)
+
fecha
->
hora
-
8
)
->
ocupado
=
1
;
copiar_usuario
(
&
(
(
matriz_reservas
+
13
*
31
*
(
fecha
->
mes
-
1
)
+
13
*
(
fecha
->
dia
-
1
)
+
fecha
->
hora
-
8
)
->
usuario
)
,
usuario
)
;
}
}
//OK Inicializa a cero y luego carga el fichero de datos. El formato del fichero es "mes:dia:hora:nombre:apellidos:"
void
inicializar_reservas
(
tipo_reserva
*
matriz_reservas
)
{
tipo_fecha fecha
;
unsigned
short
int
i
;
char
linea
[
64
]
,*
aux
;
tipo_usuario usuario
;
for
(
fecha.
mes
=
0
;
fecha.
mes
<
12
;
fecha.
mes
++
)
for
(
fecha.
dia
=
0
;
fecha.
dia
<
31
;
fecha.
dia
++
)
for
(
fecha.
hora
=
0
;
fecha.
hora
<
13
;
fecha.
hora
++
)
{
(
matriz_reservas
+
(
31
*
13
)
*
fecha.
mes
+
13
*
fecha.
dia
+
fecha.
hora
)
->
ocupado
=
0
;
}
FILE
*
archivo_reservas
;
archivo_reservas
=
fopen
(
"reservas.dat"
,
"r"
)
;
while
(
!
feof
(
archivo_reservas
)
)
//Por qué no funciona ftell solo?
{
fseek
(
archivo_reservas
,-
1
,
SEEK_CUR
)
;
fscanf
(
archivo_reservas
,
"%d"
,&
fecha.
mes
)
;
fseek
(
archivo_reservas
,
1
,
SEEK_CUR
)
;
fscanf
(
archivo_reservas
,
"%d"
,&
fecha.
dia
)
;
fseek
(
archivo_reservas
,
1
,
SEEK_CUR
)
;
fscanf
(
archivo_reservas
,
"%d"
,&
fecha.
hora
)
;
fseek
(
archivo_reservas
,
1
,
SEEK_CUR
)
;
fgets
(
linea
,
64
,
archivo_reservas
)
;
//revisar, hay una forma mejor????
aux
=
linea
;
aux
=
strtok
(
linea
,
":"
)
;
strcpy
(
usuario.
nombre
,
aux
)
;
aux
+=
strlen
(
usuario.
nombre
)
+
1
;
aux
=
strtok
(
aux
,
":"
)
;
strcpy
(
usuario.
apellido
,
aux
)
;
reservar
(
matriz_reservas
,&
fecha
,&
usuario
)
;
}
fclose
(
archivo_reservas
)
;
}
// Inicializar usuarios. Carga los usuarios del archivo de texto en un array.
void
inicializar_usuarios
(
tipo_usuario
*
lista_usuarios
)
{
unsigned
short
int
i
;
char
*
aux
,
linea
[
128
]
;
FILE
*
archivo_usuarios
;
archivo_usuarios
=
fopen
(
"usuarios.dat"
,
"r"
)
;
if
(
archivo_usuarios
==
NULL
)
printf
(
"anArchivo de usuarios no encontradon"
)
;
else
{
fread
(
&
i
,
1
,
1
,
archivo_usuarios
)
;
i
=
(
int
)
i
;
//????????????????????????Es imprescindible esto??????????????????
lista_usuarios
=
(
tipo_usuario
*
)
malloc
(
i
*
sizeof
(
tipo_usuario
)
)
;
i
=
0
;
while
(
!
feof
(
archivo_usuarios
)
)
{
//fseek(archivo_usuarios,-1,SEEK_CUR);
fgets
(
linea
,
128
,
archivo_usuarios
)
;
//login
aux
=
strtok
(
linea
,
":"
)
;
strcpy
(
(
lista_usuarios
+
i
)
->
login
,
aux
)
;
//password
aux
=
aux
+
strlen
(
(
lista_usuarios
+
i
)
->
login
)
+
1
;
aux
=
strtok
(
aux
,
":"
)
;
strcpy
(
(
lista_usuarios
+
i
)
->
password
,
aux
)
;
//nombre
aux
=
aux
+
strlen
(
(
lista_usuarios
+
i
)
->
password
)
+
1
;
aux
=
strtok
(
aux
,
":"
)
;
strcpy
(
(
lista_usuarios
+
i
)
->
nombre
,
aux
)
;
//apellido
aux
=
aux
+
strlen
(
(
lista_usuarios
+
i
)
->
nombre
)
+
1
;
aux
=
strtok
(
aux
,
":"
)
;
strcpy
(
(
lista_usuarios
+
i
)
->
apellido
,
aux
)
;
//extensión
aux
=
aux
+
strlen
(
(
lista_usuarios
+
i
)
->
apellido
)
+
1
;
aux
=
strtok
(
aux
,
":"
)
;
strcpy
(
(
lista_usuarios
+
i
)
->
ext
,
aux
)
;
printf
(
"%sn"
,
(
lista_usuarios
+
i
)
->
apellido
)
;
i
++;
}
}
fclose
(
archivo_usuarios
)
;
}
//OK Guarda las reservas en reservas.dat
void
guardar
(
tipo_reserva
*
matriz_reservas
)
{
unsigned
short
int
hora
,
dia
,
mes
;
FILE
*
archivo_reservas
;
archivo_reservas
=
fopen
(
"reservas.dat"
,
"w"
)
;
for
(
mes
=
0
;
mes
<
12
;
mes
++
)
for
(
dia
=
0
;
dia
<
31
;
dia
++
)
for
(
hora
=
0
;
hora
<
13
;
hora
++
)
if
(
(
matriz_reservas
+
(
31
*
13
)
*
mes
+
13
*
dia
+
hora
)
->
ocupado
==
1
)
{
fprintf
(
archivo_reservas
,
"%d:%d:%d:%s:%s:n"
,
mes
+
1
,
dia
+
1
,
hora
+
8
,
(
matriz_reservas
+
(
31
*
13
)
*
mes
+
13
*
dia
+
hora
)
->
usuario.
nombre
,
(
matriz_reservas
+
(
31
*
13
)
*
mes
+
13
*
dia
+
hora
)
->
usuario.
apellido
)
;
}
fclose
(
archivo_reservas
)
;
}
//OK Muestra el menú en pantalla y devuelve el int opción
unsigned
short
int
menu
(
)
{
unsigned
short
int
opcion
;
printf
(
"n1 - Introduccion de datos personalesn"
)
;
printf
(
"2 - Consulta de reservas por mesn"
)
;
printf
(
"3 - Consulta de reservas del usuarion"
)
;
printf
(
"4 - Creacion de reservasn"
)
;
printf
(
"5 - Borrado de reservasn"
)
;
printf
(
"6 - Volver al menu inicialn"
)
;
scanf
(
"%d"
,&
opcion
)
;
return
opcion
;
}
//OK Introduce usuario. Ahora es inútil. Dejo el código por si me fuese útil posteriormente.
void
introducir_datos
(
tipo_usuario
*
usuario
)
{
printf
(
"nSu nombre: "
)
;
gets
(
usuario
->
nombre
)
;
printf
(
"nSus apellidos: "
)
;
gets
(
usuario
->
apellido
)
;
printf
(
"nSu extensión telefónica: "
)
;
gets
(
usuario
->
ext
)
;
}
//OK Saca por pantalla una fecha de la matriz_reserva, y muestra si está ocupada o libre
void
imprimir_reserva
(
tipo_reserva
*
matriz_reservas
,
tipo_fecha
*
fecha
)
{
if
(
(
matriz_reservas
+
13
*
31
*
(
fecha
->
mes
-
1
)
+
13
*
(
fecha
->
dia
-
1
)
+
fecha
->
hora
-
8
)
->
ocupado
==
1
)
{
printf
(
"nEl dia %d del mes %d a las %d la sala ha sido reservada por %s %sn"
,
fecha
->
dia
,
fecha
->
mes
,
fecha
->
hora
,
(
matriz_reservas
+
13
*
31
*
(
fecha
->
mes
-
1
)
+
13
*
(
fecha
->
dia
-
1
)
+
fecha
->
hora
-
8
)
->
usuario.
nombre
,
(
matriz_reservas
+
13
*
31
*
(
fecha
->
mes
-
1
)
+
13
*
(
fecha
->
dia
-
1
)
+
fecha
->
hora
-
8
)
->
usuario.
apellido
)
;
}
else
printf
(
"nEl dia %d del mes %d a las %d el aula está libren"
,
fecha
->
dia
,
fecha
->
mes
,
fecha
->
hora
)
;
}
//OK Presenta en pantalla las reservas de un mes o de un usuario
void
consultar_reservas
(
tipo_reserva
*
matriz_reservas
,
tipo_usuario
*
usuario
)
{
tipo_fecha fecha
;
int
numero
;
numero
=
0
;
if
(
usuario
==
NULL
)
{
while
(
1
)
{
printf
(
"nNumero del mes a consultar: "
)
;
scanf
(
"%d"
,&
fecha.
mes
)
;
printf
(
"%d"
,
fecha.
mes
)
;
if
(
(
fecha.
mes
>
12
)
||
(
fecha.
mes
<
1
)
)
printf
(
"nNumero de mes no valido.n"
)
;
else
break
;
}
for
(
fecha.
dia
=
1
;
fecha.
dia
<
32
;
fecha.
dia
++
)
for
(
fecha.
hora
=
8
;
fecha.
hora
<
21
;
fecha.
hora
++
)
{
if
(
(
matriz_reservas
+
(
13
*
31
*
(
fecha.
mes
-
1
)
)
+
(
13
*
(
fecha.
dia
-
1
)
)
+
(
fecha.
hora
-
8
)
)
->
ocupado
!=
0
)
{
imprimir_reserva
(
matriz_reservas
,
&
fecha
)
;
numero
++;
}
}
}
else
{
for
(
fecha.
mes
=
1
;
fecha.
mes
<
13
;
fecha.
mes
++
)
for
(
fecha.
dia
=
1
;
fecha.
dia
<
32
;
fecha.
dia
++
)
for
(
fecha.
hora
=
8
;
fecha.
hora
<
21
;
fecha.
hora
++
)
if
(
(
(
matriz_reservas
+
(
13
*
31
*
(
fecha.
mes
-
1
)
)
+
(
13
*
(
fecha.
dia
-
1
)
)
+
(
fecha.
hora
-
8
)
)
->
ocupado
!=
0
)
&&
(
usuario_cmp
(
&
(
(
matriz_reservas
+
(
13
*
31
*
(
fecha.
mes
-
1
)
)
+
(
13
*
(
fecha.
dia
-
1
)
)
+
(
fecha.
hora
-
8
)
)
->
usuario
)
,
usuario
)
>
0
)
)
{
imprimir_reserva
(
matriz_reservas
,
&
fecha
)
;
numero
++;
}
}
if
(
usuario
!=
NULL
)
printf
(
"nEl usuario actual ha realizado %d reservasn"
,
numero
)
;
else
printf
(
"nHay %d reservas en el mes %dn"
,
numero
,
fecha.
mes
)
;
}
//OK Funcion para comprobar que una fecha tiene un formato correcto
unsigned
short
int
validar_fecha
(
tipo_fecha f
)
{
unsigned
short
int
valida
=
1
;
//Compruebo si la fecha "existe"
if
(
(
f.
dia
<
1
||
f.
dia
>
31
||
f.
mes
>
12
||
f.
mes
<
1
)
||
(
f.
hora
<
8
||
f.
hora
>
20
)
)
valida
=
0
;
else
{
if
(
f.
mes
==
2
)
{
if
(
f.
dia
>
29
)
valida
=
0
;
else
if
(
(
(
f.
ano
%
4
!=
0
)
||
(
(
f.
ano
%
100
==
0
)
&&
(
f.
ano
%
400
!=
0
)
)
)
&&
(
f.
dia
>
28
)
)
valida
=
0
;
}
else
{
if
(
f.
mes
%
2
==
0
)
{
if
(
(
f.
mes
<=
7
)
&&
(
f.
dia
>
30
)
)
valida
=
0
;
}
else
if
(
(
f.
mes
>
8
)
&&
(
f.
dia
>
30
)
)
valida
=
0
;
}
}
//Compruebo que la fecha sea mayor que el momento actual;
if
(
valida
==
1
)
{
struct
tm
*
ahora
;
time_t segundos
=
time
(
0
)
;
ahora
=
localtime
(
&
segundos
)
;
if
(
ahora
->
tm_mon
+
1
>
f.
mes
||
(
ahora
->
tm_mon
+
1
==
f.
mes
&&
ahora
->
tm_mday
>
f.
dia
)
||
(
ahora
->
tm_mon
+
1
==
f.
mes
&&
ahora
->
tm_mday
==
f.
dia
&&
ahora
->
tm_hour
>
f.
hora
)
)
valida
=
0
;
}
return
valida
;
}
//OK Crear reserva
void
tratar_reserva
(
tipo_reserva
*
matriz_reservas
,
tipo_usuario
*
usuario
,
int
opcion
)
{
tipo_fecha fecha
,
fecha1
,
fecha2
;
//Cambiar esto para usar la librería time.h
fecha.
ano
=
2009
;
char
confirmacion
;
unsigned
short
int
contador
=
0
;
do
{
printf
(
"nDatos de la reserva:n Mes: "
)
;
scanf
(
"%d"
,&
fecha1.
mes
)
;
printf
(
" Dia: "
)
;
scanf
(
"%d"
,&
fecha1.
dia
)
;
printf
(
" Horas de la reserva (de 8 a 21)n hora de inicio: "
)
;
scanf
(
"%d"
,&
fecha1.
hora
)
;
fecha2
=
fecha
;
printf
(
" hora de finalizacion: "
)
;
scanf
(
"%d"
,&
fecha2.
hora
)
;
if
(
validar_fecha
(
fecha1
)
&&
(
fecha2.
hora
<
22
)
&&
(
fecha2.
hora
>=
fecha1.
hora
)
)
break
;
else
printf
(
"anFecha y/u hora incorrectasn"
)
;
}
while
(
1
)
;
fecha
=
fecha1
;
//Comprobar si las horas están ocupadas o no
if
(
opcion
==
1
)
contador
=
fecha2.
hora
-
fecha1.
hora
;
do
{
if
(
(
opcion
*
(
matriz_reservas
+
13
*
31
*
(
fecha.
mes
-
1
)
+
13
*
(
fecha.
dia
-
1
)
+
fecha.
hora
-
8
)
->
ocupado
)
==
1
)
contador
--;
else
if
(
usuario_cmp
(
&
(
(
matriz_reservas
+
13
*
31
*
(
fecha.
mes
-
1
)
+
13
*
(
fecha.
dia
-
1
)
+
fecha.
hora
-
8
)
->
usuario
)
,
usuario
)
>
0
)
contador
++;
imprimir_reserva
(
matriz_reservas
,&
(
fecha
)
)
;
fecha.
hora
++;
}
while
(
fecha.
hora
<
fecha2.
hora
)
;
fecha
=
fecha1
;
if
(
!
contador
>
0
)
if
(
opcion
==
1
)
printf
(
"nHoras no disponiblesn"
)
;
else
printf
(
"No ha realizado ninguna reserva en estas horas"
)
;
if
(
contador
>
0
)
{
if
(
opcion
==
1
)
{
printf
(
"nEstán disponibles %d de las %d horas que ha solicitado.nRealizar la reserva? (S/N): "
,
contador
,
fecha2.
hora
-
fecha1.
hora
)
;
scanf
(
"%s"
,&
confirmacion
)
;
if
(
(
strcmp
(
&
confirmacion
,
"S"
)
==
0
)
||
(
strcmp
(
&
confirmacion
,
"s"
)
==
0
)
)
{
time_t segundos
;
segundos
=
time
(
0
)
;
struct
tm
*
ahora
;
ahora
=
localtime
(
&
segundos
)
;
//Esto es uan chapuza, hay que cambiar el tipo fecha por el estándar de time;
usuario
->
ult_reserva.
ano
=
ahora
->
tm_year
;
usuario
->
ult_reserva.
mes
=
ahora
->
tm_mon
;
usuario
->
ult_reserva.
dia
=
ahora
->
tm_mday
;
usuario
->
ult_reserva.
hora
=
ahora
->
tm_hour
;
usuario
->
ult_reserva.
min
=
ahora
->
tm_min
;
usuario
->
ult_reserva.
seg
=
ahora
->
tm_sec
;
do
{
reservar
(
matriz_reservas
,
&
fecha
,
usuario
)
;
imprimir_reserva
(
matriz_reservas
,
&
fecha
)
;
fecha.
hora
++;
}
while
(
fecha.
hora
<
fecha2.
hora
)
;
}
else
printf
(
"nReserva no realizadan"
)
;
}
if
(
opcion
==
0
)
{
printf
(
"nPueden borrarse %d de las %d horas que ha solicitado.nRealizar la reserva? (S/N): "
,
contador
,
fecha2.
hora
-
fecha1.
hora
)
;
scanf
(
"%s"
,&
confirmacion
)
;
if
(
(
strcmp
(
&
confirmacion
,
"S"
)
==
0
)
||
(
strcmp
(
&
confirmacion
,
"s"
)
==
0
)
)
{
do
{
reservar
(
matriz_reservas
,
&
fecha
,
NULL
)
;
imprimir_reserva
(
matriz_reservas
,
&
fecha
)
;
fecha.
hora
++;
}
while
(
fecha.
hora
<
fecha2.
hora
)
;
printf
(
"nBorrado realizadon"
)
;
}
else
printf
(
"nBorrado no realizadon"
)
;
}
}
}
///////////////////////////////////////////////////////////////////////////////
int
main
(
)
{
//Declaración de las variables
char
basura
,
log
;
unsigned
short
int
mes
,
dia
,
hora
;
char
opcion
,
confirmacion
;
char
nombre
[
STRING_CORTO
]
,
password
[
STRING_CORTO
]
;
tipo_usuario usuario
,
*
lista_usuarios
;
tipo_fecha fecha
;
//los índices de los arrays: mes,dia,hora
tipo_reserva matriz_reservas
[
122
]
[
31
]
[
13
]
;
inicializar_reservas
(
&
(
matriz_reservas
[
0
]
[
0
]
[
0
]
)
)
;
inicializar_usuarios
(
lista_usuarios
)
;
do
{
printf
(
"nEscoja una opcion:n"
)
;
printf
(
"n1 - Loguearsen2 - Salirn"
)
;
scanf
(
"%d"
,&
opcion
)
;
scanf
(
"%c"
,&
basura
)
;
if
(
opcion
==
1
)
{
log
=
login
(
&
usuario
,
lista_usuarios
)
;
do
{
opcion
=
menu
(
log
)
;
scanf
(
"%c"
,&
basura
)
;
switch
(
opcion
)
{
case
1
:
introducir_datos
(
&
usuario
)
;
break
;
case
2
:
consultar_reservas
(
&
(
matriz_reservas
[
0
]
[
0
]
[
0
]
)
,
NULL
)
;
break
;
case
3
:
consultar_reservas
(
&
(
matriz_reservas
[
0
]
[
0
]
[
0
]
)
,&
usuario
)
;
break
;
case
4
:
tratar_reserva
(
&
(
matriz_reservas
[
0
]
[
0
]
[
0
]
)
,&
usuario
,
1
)
;
break
;
case
5
:
tratar_reserva
(
&
(
matriz_reservas
[
0
]
[
0
]
[
0
]
)
,&
usuario
,
0
)
;
break
;
case
6
:
usuario.
nombre
[
0
]
=
0
;
usuario.
apellido
[
0
]
=
0
;
guardar
(
&
(
matriz_reservas
[
0
]
[
0
]
[
0
]
)
)
;
break
;
default
:
printf
(
"anOpcion incorrectan"
)
;
break
;
}
}
while
(
opcion
!=
6
)
;
}
else
if
(
opcion
==
2
)
break
;
else
printf
(
"anOpcion incorrectan"
)
;
}
while
(
1
)
;
printf
(
"nFIN DEL PROGRAMAnn"
)
;
}
Por qué la linea 69 imprime "ZERO" en lugar del contenido del registro? Llevo rayándome pero no encuentro el error.
Muchas gracias y un saludo!
Tweet
«
última modificación: Domingo 21 de Junio de 2009, 21:03 por huevofritopamojarpan
»
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #1 en:
Domingo 21 de Junio de 2009, 03:06 »
0
¡La hostia! ¡Un mudo!
Fr33k K0mpu73r
locazopro
Miembro activo
Mensajes: 51
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #2 en:
Domingo 21 de Junio de 2009, 03:52 »
0
jaoajaojaoja no pude evitar el no postear
huevofritopamojarpan
Nuevo Miembro
Mensajes: 22
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #3 en:
Domingo 21 de Junio de 2009, 21:12 »
0
Por qué la linea 69 imprime "ZERO" en lugar del contenido del registro? Llevo rayándome pero no encuentro el error.
Muchas gracias y un saludo!
------------------------------------
He editado el post pero no he conseguido que mostrase el código, supongo que por ser demasiado extenso. Así que adjunto el código fuente.
Un saludo y muchas gracias!!!!!
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #4 en:
Lunes 22 de Junio de 2009, 10:42 »
0
Ya te vale con el primer post, chavalot@
La línea 69 no imprime ningún registro, sino que recibe una cadena en el registro. A lo mejor te refieres a otra línea...
Y hacía tanto tiempo que no veía
gets()
que me emocionado. Usa
scanf()
.
Fr33k K0mpu73r
huevofritopamojarpan
Nuevo Miembro
Mensajes: 22
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #5 en:
Lunes 22 de Junio de 2009, 17:01 »
0
Hola. Primero me dirijo a "mo0squit0". Si bien tu primero contestación me pareció sin duda graciosa, en la segundo noto un tono de superioridad que espero que sea sólo interpretación mía, porque aquí vengo a aprender y a enseñar lo que buenamente pueda, y no a perder el tiempo recordándole a nadie por qué su madre sale todas las noches de casa.
Me centro pues en el problema. Tengo un registro con varios campos, y al imprimir uno de estos campos, un array de caracteres, me imprime "ZERO". Adjunto de nuevo el código porque lo he modificado bastante. La línea a la que me refiero es ahora la número 365.
Un saludo y muchas gracias!
PD: Por qué es mejor scanf que gets?
El mensaje contiene
1 archivo adjunto
. Debes
ingresar
o
registrarte
para poder verlo y descargarlo.
huevofritopamojarpan
Nuevo Miembro
Mensajes: 22
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #6 en:
Lunes 22 de Junio de 2009, 23:42 »
0
Bueno, planteo la pregunta de otro modo. ¿Cuando devuelve C "ZERO"?
A mi esto me parece muuuuuy raro.
Un saludo!
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #7 en:
Martes 23 de Junio de 2009, 00:47 »
0
linea 421: warning C4700: uninitialized local variable 'lista_usuarios' used
tipo_usuario usuario, *lista_usuarios;
tipo_fecha fecha;
//los índices de los arrays: mes,dia,hora
tipo_reserva matriz_reservas[122][31][13];
reservas_inicializar(&(matriz_reservas[0][0][0]));
usuarios_inicializar(lista_usuarios);
<<<< puntero indefinido
Se me ocurren dos cosas para el ZERO, una es que sea efectivamente ese el contenido de la cadena y otra que al ser un puntero nulo tu RTL (asumo que estas usando gcc ya que VC++ no compila este codigo) use esa cadena. La funcion usuario_add deberia retornar algo.
linea 249: warning C4804: '>' : unsafe use of type 'bool' in operation
No entiendo el objetivo de la misma:
if (!contador>0)
¿Tal vez queres menor o igual a 0?
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
huevofritopamojarpan
Nuevo Miembro
Mensajes: 22
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #8 en:
Martes 23 de Junio de 2009, 01:09 »
0
Muchísimas gracias Eternal Idol por contestar.
El puntero no está definido, pero luego hago malloc dentro de la función. ¿Esto es un error?
Sobre la función usuario_add, nada, eso es una función a más, que aún tengo que hacer.No influye en el resto del programa, ya que mientras no doy solucionado lo de ZERO intento avanzar por otros lados para no perder el tiempo.
Y por último !contador>0 equivale a contador<=0, sí, jeje. A mi me parecía normal ponerlo así :-P
Mil gracias!!
Agur!
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #9 en:
Martes 23 de Junio de 2009, 09:58 »
0
De nadas
Si, esta mal debido a que dentro de la funcion usuarios_inicializar lista_usuarios tendra un valor pero ese no se vera reflejado en las funciones que la llaman, para eso tenes que usar un doble puntero o una referencia (asi pasas la direccion de memoria donde esta el puntero y de esa manera podes hacerlo apuntar a otro lado, si solo pasas el puntero en si mismo no podes hacer eso). Un ejemplo simple, fijate que p (equivalente a lista_usuarios en tu codigo) es simplemente una variable local y esta en la pila, si pasas su contenido no podes hacerla apuntar a otro lado (inicializar_mal) si pasas su direccion si (inicializar_bien):
Código: C++
#include <stdio.h>
#include <stdlib.h>
void
inicializar_mal
(
char
*
p
)
{
printf
(
"%s %prn"
, __FUNCTION__, p
)
;
p
=
(
char
*
)
malloc
(
1024
)
;
printf
(
"%s %prn"
, __FUNCTION__, p
)
;
}
void
inicializar_bien
(
char
**
p
)
{
printf
(
"%s %p %prn"
, __FUNCTION__, p,
*
p
)
;
*
p
=
(
char
*
)
malloc
(
1024
)
;
printf
(
"%s %p %prn"
, __FUNCTION__, p,
*
p
)
;
}
int
main
(
)
{
char
*
p
=
0
;
printf
(
"%s %p %prn"
, __FUNCTION__,
&
p, p
)
;
inicializar_mal
(
p
)
;
printf
(
"%s %p %prn"
, __FUNCTION__,
&
p, p
)
;
inicializar_bien
(
&
p
)
;
printf
(
"%s %p %prn"
, __FUNCTION__,
&
p, p
)
;
return
0
;
}
Un output de ejemplo:
main
0022FF74
00000000
inicializar_mal 00000000
inicializar_mal
003E4FA8
main
0022FF74
00000000
inicializar_bien
0022FF74
00000000
inicializar_bien
0022FF74
003E53B0
main
0022FF74
003E53B0
El azul es la direccion de memoria de la variable en la pila, nunca cambiara, lo rojo es la memoria dinamica reservada. Fijate que antes de entrar a inicializar_mal p apunta a 0 y despues de salir tambien, en el caso de inicializar_bien al entrar apunta a 0 pero al salir apunta a la memoria dinamica reservada.
En ningun caso libere la memoria PERO en el segundo podria hacerlo desde main, en el primero no, es un memory leak seguro
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
huevofritopamojarpan
Nuevo Miembro
Mensajes: 22
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #10 en:
Martes 23 de Junio de 2009, 13:53 »
0
Gracias de nuevo tío.
Entiendo lo que dices. Modifiqué y ahora tengo la función así:
Código: C
// Inicializar usuarios. Carga los usuarios del archivo de texto en un array.
int
usuarios_inicializar
(
tipo_usuario
**
lista_usuarios
)
{
//Memoria dinámica!!!!!!
unsigned
short
int
i
;
char
*
aux
,
linea
[
128
]
;
FILE
*
archivo_usuarios
;
archivo_usuarios
=
fopen
(
"usuarios.dat"
,
"r"
)
;
//Comprobar que existe el archivo
fscanf
(
archivo_usuarios
,
"%d"
,&
i
)
;
printf
(
"n%p"
,
*
lista_usuarios
)
;
*
lista_usuarios
=
(
tipo_usuario
*
)
malloc
(
i
*
sizeof
(
tipo_usuario
)
)
;
printf
(
"n%p"
,
*
lista_usuarios
)
;
fscanf
(
archivo_usuarios
,
"%c"
,
linea
)
;
//para leer el salto de línea
i
=
0
;
while
(
fgetc
(
archivo_usuarios
)
!=
EOF
)
{
fseek
(
archivo_usuarios
,-
1
,
SEEK_CUR
)
;
fgets
(
linea
,
128
,
archivo_usuarios
)
;
//login
aux
=
strtok
(
linea
,
":"
)
;
strcpy
(
(
*
(
lista_usuarios
)
+
i
)
->
login
,
aux
)
;
//password
aux
=
aux
+
strlen
(
(
*
(
lista_usuarios
)
+
i
)
->
login
)
+
1
;
aux
=
strtok
(
aux
,
":"
)
;
strcpy
(
(
*
(
lista_usuarios
)
+
i
)
->
password
,
aux
)
;
//nombre
aux
=
aux
+
strlen
(
(
*
(
lista_usuarios
)
+
i
)
->
password
)
+
1
;
aux
=
strtok
(
aux
,
":"
)
;
strcpy
(
(
*
(
lista_usuarios
)
+
i
)
->
nombre
,
aux
)
;
//apellido
aux
=
aux
+
strlen
(
(
*
(
lista_usuarios
)
+
i
)
->
nombre
)
+
1
;
aux
=
strtok
(
aux
,
":"
)
;
strcpy
(
(
*
(
lista_usuarios
)
+
i
)
->
apellido
,
aux
)
;
//extensión
aux
=
aux
+
strlen
(
(
*
(
lista_usuarios
)
+
i
)
->
apellido
)
+
1
;
aux
=
strtok
(
aux
,
":"
)
;
strcpy
(
(
*
(
lista_usuarios
)
+
i
)
->
ext
,
aux
)
;
i
++;
(
*
(
lista_usuarios
)
+
i
)
->
activo
=
1
;
printf
(
"n%s %s"
,
(
*
lista_usuarios
+
i
)
->
nombre
,
(
*
lista_usuarios
+
i
)
->
apellido
)
;
}
fclose
(
archivo_usuarios
)
;
return
i
;
}
E invoco la función así:
Código: C
usuarios_size
=
usuarios_inicializar
(
&
lista_usuarios
)
;
Pero esta línea, printf("n%s %s",(*lista_usuarios+i)->nombre, (*lista_usuarios+i)->apellido); , no muestra nada.
¿Sigo fallando en algo?
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #11 en:
Martes 23 de Junio de 2009, 15:39 »
0
No se, tendria que depurarlo (o analizarlo pero soy muy vago) pero no tengo el reservas.dat, fijate si podes depurarlo vos.
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
huevofritopamojarpan
Nuevo Miembro
Mensajes: 22
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #12 en:
Martes 23 de Junio de 2009, 19:47 »
0
La madre que me parió... Ahora tengo otro problema. Será otra estupidez, pero no la veo.
Adjunto el código por si el error viene de otro lado.
Explico el error: Dentro de la función usuarios_inicializar llamo a la función usuario_cpy. Ahí esta el error (Bus error), porque si comento esta linea el error desaparece.
Al ejecutar gdb (todavía no sé utilizarlo bien), el error me sale en otro lado, en un strlen(), que hasta ahora funcionaba sin problemas.
Joer, cada vez estoy más desesperado
Ayuda, please!
El mensaje contiene
1 archivo adjunto
. Debes
ingresar
o
registrarte
para poder verlo y descargarlo.
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #13 en:
Martes 23 de Junio de 2009, 22:09 »
0
El primer problema que tengo es que fseek no funciona, puse esto:
Código: Text
for (char x = fgetc(archivo_usuarios); x != EOF; x = fgetc(archivo_usuarios))
{
ungetc(x, archivo_usuarios);
Y ahora el problema es que en el archivo no hay "extensión" (despues del apellido viene otro usuario).
Y sacando el * que no hace falta aca ya imprimo los logins al menos:
Código: Text
printf("nLogin:%s",(lista_usuarios+log)->login);
Desde ahi segui vos
PD.Donde comparas un caracter contra una cadena esta mal, ejemplo:
if ((i=="S")
tiene que ser
if ((i=='S')
if (*lista_usuarios==NULL) printf("me cago en la puta");
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
huevofritopamojarpan
Nuevo Miembro
Mensajes: 22
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #14 en:
Martes 23 de Junio de 2009, 22:49 »
0
Joder tío, mil gracias! He cambiado eso pero sigo teniendo el mismo error. El error no viene de fseek, sino de un strlen.
Subo una captura de la terminal pa que veas. Estoy leyendo un manual de gdb, que no sé hacer prácticamente nada con él (avanzar línea y poco más
).
Bueno, sigo investigando...
Agur!
PD: Que dios te pague la ayuda que prestas con pocos hijos y muchos intentos...
El mensaje contiene
2 archivos adjuntos
. Debes
ingresar
o
registrarte
para poder verlos y descargarlos.
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Error al imprimir un campo de un registro, devuelve "ZERO"
«
Respuesta #15 en:
Martes 23 de Junio de 2009, 23:01 »
0
Yo lo edite un poco y estoy usando VC++ + WinDbg (Windows), pone en pantalla la linea leida con fgets, tal vez por ahi esta el problema. Otro error, tenes al principio del archivo 7 usuarios pero en realidad son 9, eso hace que escribas en cualquier lado. Me parece que ahora la joda esta en
reservas_inicializar
, si lo comento me funciona hasta con gcc ...
¿usuario_cpy es llamado por reservar? Demasiada complejidad le veo a esto ... lo siento.
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Error al imprimir un campo de un registro, devuelve "ZERO"