2016-11-27 12 views
9

Mam tablicę czasu tutaj:C++ struct tm & time_t

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

a następnie:

cl sadi[10]; 

Ale na przykład mam sadi[5] na 21:58, a kiedy mam sadi[6] na 21:59 . Następnie ponownie sprawdzam wszystkie moje sadi[].ct->tm_min59. Jaki jest tego problem? Czy to nie może zatrzymać chwili, w której ją przechwycisz, czy zawsze się zaktualizuje? Jeśli tak, jak mogę uchwycić ten moment i nie aktualizować w ten sposób.

+0

Czy to jest nawet poprawne C++? Kiedy stało się możliwe zainicjowanie członków takiej struktury? –

+3

@ AndonM.Coleman od C++ 11. Możesz inicjować członków w klasie. – vsoftco

+0

podobnie jak odpowiedź poniżej, to był mój błąd, nie powinienem inicjować członka z takim wskaźnikiem w tym przypadku, – VirusPTIT

Odpowiedz

15

linię:

struct tm* ct = localtime(&t); 

Problemem jest to, że wskaźnikże localtime(&t) powraca jest pamięć buforowa statyczne. Tak więc zwraca dokładnie taką samą wartość wskaźnika (adres) za każdym razem, gdy jest wywoływana. Oznacza to, że wszystkie twoje elementy tablicy mają wskaźniki do tego samego obiektu struct tm.

Jednym z rozwiązań jest stworzenie skopiować danych za każdym razem, kiedy zadzwonić localtime:

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

Więc teraz Oświadczam struct tm ct; (nie wskaźnik) i zainicjować go z wartością dereferencjonowane na z zwrócił wskaźnik *localtime(&t).