Forum Programmation.c Bugs étranges avec localtime()

Posté par  .
Étiquettes : aucune
0
27
avr.
2005
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,
  • # Variable static

    Posté par  . É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  . É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  . É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
    • [^] # Re: [ça marche !] Merci !

      Posté par  . Évalué à 1.

      non, je veux dire, quand la fonction PREND un const qqch en paramètre....
      • [^] # Re: [ça marche !] Merci !

        Posté par  (site web personnel) . É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.

Suivre le flux des commentaires

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