Retourner aux forums || Retourner au forum Programmation.c

Programmation.c : Bugs étranges avec localtime()

Posté par Yves Dessertine (page perso, ) le 27 avril 2005
0
Bonjour.

Nous avons un problème avec la fonction localtime. Le but de la fonctoin est de réafficher seulement les chiffres qui changent dans une horloge numérique.

Pour cela, nous avons crée la fonction suivante :
void reaffiche_heure(time_t heurea, time_t heurep, WINDOW** chiffres) {
struct tm* sheurea = localtime(&heurea);
struct tm* sheurep = localtime(&heurep);
.......
}


Mais, bien que les timestamps soient différents (ce qui est normal), localtime() nous renvoie la même structure.

Voici un log GDB :

Breakpoint 1, reaffiche_heure (heurea=1114614994, heurep=1114614811,
chiffres=0x805d5c0) at horloge.c:67
67 struct tm* sheurea = localtime(&heurea);
(gdb)
68 struct tm* sheurep = localtime(&heurep);
(gdb)
76 ecrire_double_point(chiffres[2], unites(sheurea->tm_sec));
(gdb) print heurep
$5 = 1114614811
(gdb) print heurea
$6 = 1114614994
(gdb) print *sheurep
$7 = {tm_sec = 31, tm_min = 13, tm_hour = 17, tm_mday = 27, tm_mon = 3,
tm_year = 105, tm_wday = 3, tm_yday = 116,
tm_isdst = 1, tm_gmtoff = 7200, tm_zone = 0x8060138 "CEST"}
(gdb) print *sheurea
$8 = {tm_sec = 31, tm_min = 13, tm_hour = 17, tm_mday = 27, tm_mon = 3,
tm_year = 105, tm_wday = 3, tm_yday = 116,
tm_isdst = 1, tm_gmtoff = 7200, tm_zone = 0x8060138 "CEST"}
(gdb)


On voit bien heurep et heurea différents et *sheurep et *sheurea identiques.

Une idée ?

Merci bien,

--
Yves Dessertine
http://yvesd.net
> Lire le message (5 commentaires, moyenne: 3).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

Variable static

Posté par Provencher Luc () le 27/04/2005 à 16:07. (lien). Évalué à 6.

localtime() utilise une variable static, autrement dit, l'appelle de "localtime(&heurep)" ecrase l'apelle "localtime(&heurea)". Les 2 pointeur retourne sont les même.

void reaffiche_heure(time_t heurea, time_t heurep, WINDOW** chiffres) {


     struct tm sheurep;
     struct tm sheurea;
     struct tm *sheuret;

     sheuret = localtime(&heurea);
     memcpy(&sheurea,sheuret,sizeof(sheurea));

     sheuret = localtime(&heurep);
     memcpy(&sheurep,sheuret,sizeof(sheurep));

  • [^]Re: Variable static

    Posté par galactikboulay () le 27/04/2005 à 17:29. (lien). Évalué à 4.

    Il y a aussi possibilité d'utiliser "localtime_r" qui est la version réentrante.

    Par exemple:

    localtime_r(&heurea,&sheurea);
    localtime_r(&heurep,&sheurep);

    est équivalent et évite les memcpy().

    My 2 cents.

[ça marche !] Merci !

Posté par Yves Dessertine (page perso, ) le 27/04/2005 à 19:57. (lien). Évalué à 1.

Merci ça marche nickel avec la solution de galakticboulay (je resterai l'autre aussi).

Je comprends mieux ce que ça veut dire quand la fonction est donnée pour renvoyer un struct tm * lol

--
Yves Dessertine
http://yvesd.net
  • [^]Re: [ça marche !] Merci !

    Posté par Yves Dessertine (page perso, ) le 27/04/2005 à 19:58. (lien). Évalué à 1.

    non, je veux dire, quand la fonction PREND un const qqch en paramètre....

    --
    Yves Dessertine
    http://yvesd.net
    • [^]Re: [ça marche !] Merci !

      Posté par gc (page perso, ) le 28/04/2005 à 08:07. (lien). Évalué à 3.

      C'est surtout la description suivante, dispo dans le man, qui est importante :

      The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions.

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.c