1

我真的不确定如何正确解释这一点,但让我试试。我有一个 C++ 程序正在侦听 CAN 总线(车辆通信总线)上的数据。每隔 1 秒,我就会从总线上收到一条新消息,其中包含有关错误消息的诊断信息。消息不是固定长度的,所以消息一次可能包含5个故障,下一次可能包含3个故障。消息来自两个(或多个)不同的来源,每个来源每 1 秒发送一次。在我的 UI 中,我需要以每 5 秒 1 次的速度循环显示活动故障列表。

这是我的问题。如何有效地使用最新信息更新列表?添加到列表中没有问题,但是如何删除不应再出现在列表中的项目?换句话说,如果我在消息中只收到 3 个错误,这意味着其中 2 个不再存在。我唯一能想到的是使用时间戳和一堆 for 循环来比较 2 条消息并添加/删除/更新列表。对于这类事情,是否已经存在更有效的东西?

编辑:为了澄清,我需要从列表中删除项目,因为这些故障不再有效。如果我有一个数组如下:

// Message that is received: (psudo code)
Fault newFaults1[5] { Fault1, Fault2, Fault3, Fault4, Fault5 };
Fault newFaults2[7] { Fault1, Fault2, Fault3, Fault4, Fault5, Fault6, Fault7 };

// Populate the array that holds both array values
for (int i = 0; i  < newFaults1.Count(); i++)
    Faults[i] = newFaults1[i];

for (int i = 0; i < newFaults2.Count(); i++)
    Faults[i + newFaults1.Count()] = newFaults2[i];

// Now, the next time a message is received, there are fewer faults.
Fault newFaults1[2] { Fault1, Fault2 };
Fault newFaults2[1] { Fault1 };

// TODO: How do I remove all of the old items in the Faults array?
4

2 回答 2

0

目前还不是很清楚。如果您收到的新故障代表当前状态,那么您只需清除旧数组,并将新故障推入其中,例如:

onNewFaultsReceived(Faults *faults) {
    clear old Faults array;
    insert faults into Faults array
于 2013-08-28T13:24:12.713 回答
0

好的,我认为问题可能比最初出现的要简单得多。您的问题似乎是关于如何调整数组的大小?

简单的答案不是使用数组而是使用 a std::vector。例如

#include <vector>
std::vector<Fault> faults;

// add a fault to vector
faults.push_back(f);

// remove all faults from vector
faults.clear();

// resize the faults vector
faults.resize(2);

// get size of vector
num = faults.size();

// loop through all faults
for (i = 0; i < faults.size(); ++i)
{
    f = faults[i];
    // do something with f
}

抱歉,如果我误解了。

于 2013-08-28T06:42:42.460 回答