在向量中推送结构会覆盖时间分量

Posted

技术标签:

【中文标题】在向量中推送结构会覆盖时间分量【英文标题】:Pushing struct in vector overwrites time component 【发布时间】:2015-09-01 21:37:33 【问题描述】:

我正在编写一个简单的 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);

我在这里从保存文件中读取,通过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,反之亦然。另外,我刚刚注意到我搞砸了几个月和几年的转换,可能是问题所在吗?

【问题讨论】:

请发帖MCVE。 问题在于你没有给我们展示的代码。 贴了更多代码,但是我粘贴完问题就已经回答了,谢谢你的时间! 【参考方案1】:

在没有代码的情况下推测性地编写答案,因为我很确定这是问题所在:如果您将 tm *timestamp 存储为由在您的对象中返回 struct tm* 的几个函数之一返回,那么在调试器中简单查看您的数据将显示所有这些时间戳都将具有相同的指针值 - 指向您调用的函数内的单个 static struct tm。因此,每当您再次调用该函数时,所有值都会更改为新值。

将其更改为 tm timestamp;,然后使用 timestamp = *(whatever()); 而不是 timestamp = whatever(); [技术上不需要额外的括号]

【讨论】:

【参考方案2】:

我猜你的tm 指针是使用gmtimelocaltime 设置的。您确实意识到这些函数总是返回相同的指针吗?如果您存储该指针,它的内容将被下一次调用 gmtime 或 localtime 覆盖?

【讨论】:

谢谢,我不知道。

以上是关于在向量中推送结构会覆盖时间分量的主要内容,如果未能解决你的问题,请参考以下文章

试图覆盖文件中间的数据而不影响文件的开头

使用结构对象

本地通知中的应用程序图标徽章是不是会被推送通知有效负载徽章覆盖?

覆盖/强制推送 gemfury 中的现有软件包版本

如何在 ios 的横幅栏上发送未覆盖的苹果推送通知

Onesignal 网络推送覆盖