Ayuda con C y time.h.

Hola y gracias por leer ésto.
Vereis, tengo que hacer un proyecto que consiste en la gestión de un supermercado en C (utilizo entorno de desarrollo Dev-C++. Tengo que hacer una función que me liste todos los productos que estén caducados. Esta información (fecha de caducidad) esta almecenada en una estructura mediante otra estructura. La fecha actual he de obtenerla de la hora local del PC. Nos dijo el profesor en clase que lo buscasemos en internet (toda la información de time.h porque él no nos ha dado nada ni nos ha explicado nada).
Lo que me gustaría saber es cómo puedo obterner la fecha con la funciones de la librería time.h (sé obtener los segundos pasados desde 1 de Enero de 1970 pero necesitaría saber la fecha exacta.
Por ahora yo he hecho este código con lo que he estado mirando por internet pero me da el siguiente error al compilar:
`tm' undeclared (first use in this function)


El código es el siguiente:

void ListarCaducidad(void)
{
//printf("Funcion Listar Caducidad.\n");
time_t fecha;
struct sStock Stock;
struct tm *gmtime(const time_t *);
int i, encontrado;
i = 0;
encontrado = 0;
struct tm *tiempoFechaPtr;
fecha = time (NULL);
CargarArchivosProductos (&Stock);
tiempoFechaPtr = gmtime (&fecha);
time_t rawtime;
tm *ptm;
time (&rawtime);
ptm = gmtime (&rawtime);
printf ("Fecha actual: %s\n", asctime (tiempoFechaPtr));
printf ("Productos caducados:\n");
while (i {
if (FECHA.anyo < ptm->tm_year)
encontrado = 1;
else if ((FECHA.anyo == ptm->tm_year) && (FECHA.mes < (ptm->tm_mon + 1)) //Enero equilvadria a 0, por lo que sumamos 1.
encontrado = 1;
else if ((FECHA.anyo == ptm->tm_year) && (FECHA.mes == (ptm->tm_mon + 1) && (FECHA.dia < ptm->tm_mday))
encontrado = 1;
if (encontrado)
MostrarProducto(Stock.Producto[i]);
++i;
}
Pausa();
}


¿Cóme qué tipo de variable debería declarar tm? ¿Existe alguna forma más sencilla de hacer lo que quiero?

Muchas gracias y feliz navidad [bye]
Hola:

Mi c es horrible, hace mucho que no lo toco pero diria que delante de los "tm" te has dejado los "struct", como haces en la linea 6 y 10 pero no en la 15.

Por otra parte no entiendo la mitad del codigo pero seguramente es debido a que no ha salido tabulado, a que estoy espeso y a que no habras puesto todo el codigo. O eso o el FECHA esta sin definir.

Ademas diria que te matas haciendo demasiadas comparaciones, no hace falta comprovar que si el año, el mes o el dia, pasa las dos fechas al formato time_t (ese de los segundos desde 1970) y haz una sola comprovacion. Que si funciona da igual, pero yo lo veo mucho mas claro de esa manera.

Saludos
Como bien decías el fallo era que se me había olvidado el struct. Además he revisado un poco el código y la verdad esq había mucha paja que me sobraba, ahora ha quedado más limpio.
Por otra parte, ¿Cómo podría convertir las fechas que tengo almacenadas (en tres variables: dia, mes, anyo) en formato time_t?. Supongo que habrá alguna función en la librería time.h, sino sería empezar a hacer cuentas y con lo de los años bisiestos y tal se complica bastante xD.
Saludos [bye]
Hola:

Si, hay una funcion, simplemente seria crear una estructura tm_time, rellenarla y llamar a mktime. Como ya he dicho antes mi c es horrible asi que es probable que me deje definiciones o acceda mal a la estructura, pero diria que es algo asi:

struct tm * timeinfo;
time_t rawtime;

// esta llamada a localtime es para que asigne si se usa el
// horario de verano/invierno, se podria hacer a mano,
// pero lo haria asi por seguridad. A parte de que he hecho
// copy paste de un ejemplo

timeinfo = localtime ( &rawtime );
timeinfo->tm_year = FECHA.anyo - 1900;
timeinfo->tm_mon = FECHA.mes - 1;
timeinfo->tm_mday = FECHA.dia;
timeinfo->tm_hour = 0;
timeinfo->tm_min = 0;
timeinfo->tm_sec =0;

//rawtime es lo que compararas con la fecha actual
rawtime =  mktime ( timeinfo );


La definicion de la estructura la tienes aqui:
http://www.cplusplus.com/ref/ctime/tm.html

La libreria la puedes mirar aqui:
http://www.mis-algoritmos.com/c.ref.time.h.html
http://www.cplusplus.com/ref/ctime/

No hace falta asignar el dia de la semana (lunes, martes ....), ni el dia del año, mktime los ignora y al volver los rellena con los datos adecuados. Son los campos tm_wday y tm_yday.

Saludos
Muchas gracias. Ya he acabado con la función y todo correcto.
Saludos [bye]
4 respuestas