Foros del Web » Programación para mayores de 30 ;) » C/C++ »

no entiendo esto

Estas en el tema de no entiendo esto en el foro de C/C++ en Foros del Web. Hola amigos... tengo un codigo con el que trabajo con listas enlazadas en un sistema para una empreza de arriendo de autos tengo 3 listas ...
  #1 (permalink)  
Antiguo 13/09/2006, 20:40
Avatar de El_Metallick  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.718
Antigüedad: 21 años, 5 meses
Puntos: 16
no entiendo esto

Hola amigos... tengo un codigo con el que trabajo con listas enlazadas en un sistema para una empreza de arriendo de autos tengo 3 listas una auto una usuario y una arriendo, la cosa es qeu todo me funciona correctamente pero el tema es que cuando la fecha de vencimiento del arriendo es menor que la fecha del dia por ejemplo que el arriendo vence el 2006/09/12 y hoy es 2006/09/13 (en ese formato trabajo las fechas) el arriendo tiene que cambiar el estado a Vencido... lo hago de la siguiente manera:

Código:
typedef struct Arriendo {
       int codigo_arriendo;       //Código del arriendo 
       int codigo_auto;           //Código del auto
       char rut[11];               //Rut arrendatario
       char fecha_arriendo[11];    //Fecha en la que se arrendo
       char fecha_vencimiento[11]; //Fecha en la que vence el arriendo
       char estado[8];            //Estado del arriendo
       struct Arriendo *next;
}Arriendo;

.
.
.

void ModificarArriendo(struct Arriendo **CabezaArriendo)
{
   struct Arriendo *Modificar;
   time_t tiempo;
   char fecha[11];
   struct tm *tmPtr;

   if (!VaciaArriendo(*CabezaArriendo))
   {
      tiempo = time(NULL);
      tmPtr = localtime(&tiempo);
      strftime( fecha, 11, "%Y/%m/%d", tmPtr); 
      
      if (strcmp((*CabezaArriendo)->fecha_vencimiento,fecha) < 0)
      {
         Modificar = *CabezaArriendo;
         
         strcpy(Modificar->estado,"Vencido");
      }
      else
      {
         Modificar = (*CabezaArriendo)->next; 
               
         while ((Modificar != NULL) && (strcmp(Modificar->fecha_vencimiento,fecha) < 0))
         {
            strcpy(Modificar->estado,"Vencido");
            
            Modificar = Modificar->next;
          }
      }
   }
}
el problema es que en esta funcion entra a las condiciones pero no modifica el estado y no logro entender porque, de hecho uso una funcion con la misma estructura para modificar los autos y los usuarios y me funcionan bien... agradeceria si me pudieran hechar una mano para ver porque no funciona... quiza sea una tontera pero despues de tantos dias y horas y horas en esto uno ya no los ve... saludos

---- Editado ----
saque el free que en realidad es una tontera que no me habia percatado
__________________
Haz la guerra en la cama y el amor donde se te de la gana...
El tiempo es el mejor maestro, lo único malo es que te mata...¡¡Aprovecha tu tiempo!!

Última edición por El_Metallick; 13/09/2006 a las 20:56
  #2 (permalink)  
Antiguo 13/09/2006, 20:47
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Buf, buf, buf...

Así a ojo veo cosas que me asustan.

"estado" es un array [8] de la estructura Arriendo.

¡Y vas y haces esto!

Código:
free(Modificar->estado);
¡Lo liberas! Y luego peor aun vas y:

Código:
strcpy(Modificar->estado,"Vencido");
¡Rellenas la memoria que acabas de liberar!

Por favor, no estás entendiendo lo que haces. Relee tus apuntes/tutorial/lo que tengas a mano porque estás haciéndolo a ciegas.
  #3 (permalink)  
Antiguo 13/09/2006, 20:52
Avatar de El_Metallick  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.718
Antigüedad: 21 años, 5 meses
Puntos: 16
mmm tienes razon... originalmente no lo tenia puesto, mi compañero iso eso y ni lo pense y lo pegue aca... pero sin el free tampoco funciona... saludos
__________________
Haz la guerra en la cama y el amor donde se te de la gana...
El tiempo es el mejor maestro, lo único malo es que te mata...¡¡Aprovecha tu tiempo!!
  #4 (permalink)  
Antiguo 13/09/2006, 22:09
Avatar de El_Metallick  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.718
Antigüedad: 21 años, 5 meses
Puntos: 16
ya lo solucione... despues de tomarme un cafe y fumarme un cigarro se me ocurrio la solución...

Código:
void ModificarArriendo(struct Arriendo **CabezaArriendo)
{
   struct Arriendo *Modificar;
   time_t tiempo;
   char fecha[11];
   struct tm *tmPtr;

   if (!VaciaArriendo(*CabezaArriendo))
   {
      tiempo = time(NULL);
      tmPtr = localtime(&tiempo);
      strftime( fecha, 11, "%Y/%m/%d", tmPtr); 
      
      Modificar = *CabezaArriendo; 
               
         while ((Modificar != NULL))
         {
            if(strcmp(Modificar->fecha_vencimiento,fecha) < 0)
            {
              strcpy(Modificar->estado,"Vencido");
            }
            Modificar = Modificar->next;
          }     
   }
}
Saludos

PD: MaxExtreme gracias por "retarme"... de verdad que estaba copiando, pegando y modificando funciones anteriores sin analisar mucho lo que hacia... encontre varios errores similares al analisar las cosas...
__________________
Haz la guerra en la cama y el amor donde se te de la gana...
El tiempo es el mejor maestro, lo único malo es que te mata...¡¡Aprovecha tu tiempo!!
  #5 (permalink)  
Antiguo 14/09/2006, 07:07
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por El_Metallick Ver Mensaje
ya lo solucione... despues de tomarme un cafe y fumarme un cigarro se me ocurrio la solución...

PD: MaxExtreme gracias por "retarme"... de verdad que estaba copiando, pegando y modificando funciones anteriores sin analisar mucho lo que hacia... encontre varios errores similares al analisar las cosas...
¿Ves? Puedes encontrar la solución tu mismo ;)

Aún así, te diré que aunque te funcione un programa, no significa que esté del todo bien. Esto es importante si el programa es para un proyecto serio, o para que te lo evalúen en la universidad.

El profesor va a contarte, aparte de que funcione:

1. Que no haya memory leaks
2. La claridad
3. La estabilidad ante entradas de datos incorrectas
4. ...

Lo peor de todo es que hay programas que lo hacen solos, los profesores se limitan a usar otro programa para que analize el tuyo.

Te diré:

1. void ModificarArriendo(struct Arriendo **CabezaArriendo);

De verdad, _muy_ pocas veces vas a necesitar un doble puntero, si no es nunca. No entiendo porque usas un doble puntero ahí. Es fuente constante de errores si no sabes muy bien lo que haces.

En cualquier caso, ¿por qué lo usas? No tienes necesidad.

2. strftime() ¿Qué es eso? ¿Es una función tuya? Si no lo es, te diré que puedes formatear el tiempo usando funciones ANSI C.

3. No te hace falta la variable local "Modificar". Puedes usar CabezaArriendo para recorrer la lista.

4. Puedes escribir un for en vez de un while:

for(;CabezaArriendo!=NULL;CabezaArriendo=CabezaArr iendo->next) {
  #6 (permalink)  
Antiguo 14/09/2006, 10:59
Avatar de El_Metallick  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.718
Antigüedad: 21 años, 5 meses
Puntos: 16
1. Lo del doble puntero es por algo que nos enseñaron los ayudantes del ramo :S pero como dices que es raro usarlo voy a probar con punteros simples

2.strftime es una funcion de la libreria time.h por ende ANSI C

3. Lo hago asi para que sea mas facil entender el funcionamiento de la función y por una cosa nemotecnica (estoy acostumbrado a eso aunque se que no es lo optimo)

4. Pero no le veo la diferencia entre un while y un for :S

Saludos
__________________
Haz la guerra en la cama y el amor donde se te de la gana...
El tiempo es el mejor maestro, lo único malo es que te mata...¡¡Aprovecha tu tiempo!!
  #7 (permalink)  
Antiguo 14/09/2006, 11:52
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por El_Metallick Ver Mensaje
1. Lo del doble puntero es por algo que nos enseñaron los ayudantes del ramo :S pero como dices que es raro usarlo voy a probar con punteros simples

2.strftime es una funcion de la libreria time.h por ende ANSI C

3. Lo hago asi para que sea mas facil entender el funcionamiento de la función y por una cosa nemotecnica (estoy acostumbrado a eso aunque se que no es lo optimo)

4. Pero no le veo la diferencia entre un while y un for :S

Saludos
1. Puedes usar sólo uno y va a funcionar igual, puesto que todo el rato estás haciendo *CabezaArriendo, puedes quitarlo.

2. Ciertamente, perdona mi desliz, estoy acostumbrado a ver ctime().

3. Ah, bien ;) Tampoco es que influya en el rendimiento... pero sería lo correcto usar sólo las variables necesarias.

4. El for expresa un bucle: "Ve al siguiente hasta que no haya más". While se usa para expresar "Mientras no haya más..." y se suele usar para expresar otras cosas, no bucles.

Todo for es un while con inicialización y paso:

for(a;b;c)
{
XXX;
}

es lo mismo que

a;
while(b)
{
XXX;
if(b) c;
};

(Salvo que el for hace el if y el while juntos sin repetir evaluar la condición)

Última edición por MaxExtreme; 14/09/2006 a las 11:57
  #8 (permalink)  
Antiguo 15/09/2006, 18:15
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
EStoy de acuerdo en algunas cosas con MaxExtreme, especialmente en el doble puntero.

veamos esto:

if (!VaciaArriendo(*CabezaArriendo))

pareciera que la funcion VaciaArriendo(... trabaja con un parametro copia del tipo Arriendo por estar desrreferenciando, a menos que verifiques que CabezaArriendo es un puntero a puntero.

si tus funciones o las operacione a realizar usaran un puntero, pues es sufuciente con pasar tu dato como un puntero, a menos que tengas una funcion que trabaje con tablas(matrices).
de lo contrario, puede ser confuso y causa de problemas.

pero supongo que con modificar eso, tu programa queda muy bien.
asta quedo mas compacto que el anterior.
y con relacion al for y while, pues es cuestion de estilos, pero generalmente :
el while lo uso para verificar la activacion de una bandera, ya sea para seguir o slir de una seccion del programa, y el for es para hacer recorridos en arrays u otro tipo de contenedores.

Saludos.
  #9 (permalink)  
Antiguo 15/09/2006, 18:17
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Nivel7 Ver Mensaje
EStoy de acuerdo en algunas cosas con MaxExtreme, especialmente en el doble puntero.

veamos esto:

if (!VaciaArriendo(*CabezaArriendo))

pareciera que la funcion VaciaArriendo(... trabaja con un parametro copia del tipo Arriendo por estar desrreferenciando, a menos que verifiques que CabezaArriendo es un puntero a puntero.

si tus funciones o las operacione a realizar usaran un puntero, pues es sufuciente con pasar tu dato como un puntero, a menos que tengas una funcion que trabaje con tablas(matrices).
de lo contrario, puede ser confuso y causa de problemas.

pero supongo que con modificar eso, tu programa queda muy bien.
asta quedo mas compacto que el anterior.
y con relacion al for y while, pues es cuestion de estilos, pero generalmente :
el while lo uso para verificar la activacion de una bandera, ya sea para seguir o slir de una seccion del programa, y el for es para hacer recorridos en arrays u otro tipo de contenedores.

Saludos.
Es simple: En todas las veces que escribe CabezaArriendo lo hace desreferenciándolo, *CabezaArriendo.

Que quite un * en la definición y en todos los demás sitios, y funcionará igual.

Y aún en el raro caso de que fuera una matriz de dos dimensiones, funcionaría igual, al final solo estaría accediendo a CabezaArriendo[0] continuamente.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:13.