2015-09-01 34 views
1

我在寫一個簡單的CLI日曆,並將計劃活動的數據存儲在由幾個整數,一個字符串和一個指向tm結構體的指針組成的簡單結構中。在向量中推結構體覆蓋時間組件

但是,當我將這些結構推入矢量中時,所有*tm(僅限於那些)被我推送的最新版本覆蓋。其他一切都保持不變。因此,如果我在2016年10月2日推出「A」,並在2016年5月11日推出「B」,我將按計劃於2016年5月11日發佈兩項參賽作品,不過其他細節仍保留相同。

任何人都可以幫我弄清楚有什麼問題嗎?

如果你想看到的代碼,它在這裏

while (getline(caleList, tempstring)) { 
    cout << tempstring << endl; 
    Appointment tempapp = unwrapAppointment(tempstring); 
    apps.push_back(tempapp); 
} 

在這裏,我從SAVEFILE閱讀,通過unwrapAppointment解碼條目(我檢查是工作),並簡單地推回。

編輯:

struct Appointment 
{ 
    int ID; 
    bool alarm; 
    tm* dateAndTime; 
    string text; 
}; 

這是給麻煩

嘗試讀取活動時,該日誌的結構:

Calendar Module Activated. 1 to mark an activity, 2 to read all activities, anything else to return to main. 
> 2 
Encoded activities: 
0|61397616601|First|1 
0 First Fri Aug 13 14:30:01 3915 1 
1|61424667901|Second|0 
1 Second Wed Jun 21 16:45:01 3916 0 
2|61416011701|Third|1 
2 Third Mon Mar 13 12:15:01 3916 1 
Decoded activities: 
Activity number 0: First, set for the day 13/2/2016 at 12:15 
Activity number 1: Second, set for the day 13/2/2016 at 12:15 
Activity number 2: Third, set for the day 13/2/2016 at 12:15 

編碼的活動代碼的附加件使用mktime和localtime將tm轉換爲time_t,反之亦然。另外,我只注意到我把幾個月和幾年的轉換搞砸了,難道可以解決問題嗎?

+2

請張貼[MCVE(http://stackoverflow.com/help/mcve)。 –

+2

問題在於你沒有向我們顯示的代碼。 –

+0

發表了更多的代碼,但是當我完成粘貼時,問題已經得到解答,無論如何感謝您的時間! – Brabantis

回答

1

投機性地寫了一個沒有代碼的答案,因爲我敢肯定,這是問題所在:如果你存儲的tm *timestamp由返回struct tm*在你的對象中的幾個函數之一返回,那麼簡單看一下調試器中的數據將顯示所有這些時間戳將具有相同的指針值 - 指向您調用的函數內部的一個static struct tm。所以無論何時再次調用該函數,所有值都將更改爲新值。

更改它,讓你有tm timestamp;,然後做timestamp = *(whatever());,而不是timestamp = whatever(); [不需要額外的技術括號]

+0

謝謝,修好了! – Brabantis

1

我猜你的tm指針設置使用gmtimelocaltime。你知道這些函數總是返回相同的指針嗎?如果存儲該指針,則其下一個對gmtime或localtime的調用將覆蓋其內容?

+0

謝謝,我不知道。 – Brabantis