2016-11-27 1 views
9

은 나는 여기에 시간의 배열이C++ 구조체 TM 및 time_t

cl sadi[10]; 

을하지만, 예를 들어 나는 21:58에서 sadi[5]을 가지고, 나는 21:59에서 sadi[6]을 받았을 때 . 그런 다음 다시 확인하십시오. sadi[].ct->tm_min59입니다. 그게 무슨 문제입니까? 그것이 당신이 그것을 포착하는 순간을 견딜 수 없다는 것입니다, 그것은 항상 업데이 트합니까? 그렇다면 시간을 어떻게 캡처 할 수 있으며 그렇게 업데이트되지는 않습니다.

+0

유효한 C++일까요? 언제 구조체의 멤버를 초기화 할 수 있습니까? –

+3

@ AndonM.Coleman C++ 이후 11. 클래스 멤버 초기화를 할 수 있습니다. – vsoftco

+0

답은 아래와 같았습니다. 내 실수였습니다.이 경우 포인터를 사용하여 멤버를 초기화하면 안됩니다. – VirusPTIT

답변

15

이 라인 :

struct tm* ct = localtime(&t); 

문제는 포인터localtime(&t) 그 리턴은 정적 내부 버퍼 때문이다. 따라서 호출 될 때마다 정확히 동일한 포인터 값 (주소)을 반환합니다. 즉, 모든 배열 요소에는 동일한 struct tm 객체에 대한 포인터가 있습니다. 내가 struct tm ct;을 선언 (안 포인터)과의 역 참조 된 값으로 초기화 이제

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

:

하나의 솔루션은 데이터의 사본 당신이 localtime 호출 할 때마다 만드는 것입니다 포인터 *localtime(&t)을 반환했습니다.