2016-11-27 2 views
9

j'ai un tableau de temps ici:de C++ tm & time_t

struct cl{ 
    unsigned char *buffer; 
    time_t t = time(0); 
    struct tm * ct = localtime(&t); 
}; 

puis:

cl sadi[10]; 

Mais par exemple je suis arrivé sadi[5] à 21:58, et quand je suis arrivé un sadi[6] à 21:59 . Ensuite, je vérifie à nouveau tous mes sadi[].ct->tm_min sont 59. Quel est le problème avec ça? Est-ce qu'il ne peut pas tenir le moment que vous le capturez, sera-t-il toujours mettre à jour? Si oui, comment puis-je capturer le moment et ne pas mettre à jour comme ça.

+0

Est-ce encore C++ valide? Quand est-il devenu possible d'initialiser les membres d'une structure comme ça? –

+3

@ AndonM.Coleman Depuis C++ 11. Vous pouvez avoir une initialisation de membre en classe. – vsoftco

+0

comme la réponse ci-dessous, c'était mon erreur, je ne devrais pas initialiser un membre avec pointeur comme ça dans ce cas, – VirusPTIT

Répondre

15

Cette ligne:

struct tm* ct = localtime(&t); 

Le problème est que le pointeur que les rendements localtime(&t) est une mémoire tampon interne statique . Il renvoie donc exactement la même valeur de pointeur (adresse) à chaque appel. Cela signifie que tous vos éléments de tableau ont des pointeurs vers le même objet struct tm.

Une solution consiste à faire une copie des données chaque fois que vous appelez localtime:

struct cl { 
    unsigned char* buffer; 
    time_t t = time(0); 
    struct tm ct = *localtime(&t); 
}; 

Alors maintenant, je déclare struct tm ct; (pas un pointeur) et l'initialiser avec la déréférençant du pointeur renvoyé *localtime(&t).