gpt4 book ai didi

c - 在函数中使用结构的不同成员的最有效方法?

转载 作者:太空狗 更新时间:2023-10-29 17:20:35 25 4
gpt4 key购买 nike

我正在为资源非常有限的嵌入式处理器写作。我有一个捕获时间序列事件的结构,我想对不同类型的不同值使用相同的图形函数。类似的东西(非常精简;不要担心未初始化的值等):

#define GRAPH_ONE 1
#define GRAPH_TWO 2

struct _event_t {
unsigned long timestamp;
int sensorOne;
float sensorTwo;
}

typedef struct _event_t event_t;

event_t[10] MyEvents;

void GraphSensor(byte graphType) {
for (unsigned int i = 0; i < 9; i++) {
// Get minimum value from series
if (MyEvents[i].?????) ...
}
}

如何让我的函数对结构的不同成员进行操作?我可以看到用大量的 switch (graphType) 语句来完成它,但这非常难看。该结构很容易有 8 或 10 个成员。我可以将所有这些移动到一个单独的函数中,并使每一位数据访问都调用该函数,始终返回一个 float (这对我的图表来说应该没问题)。最后我可以转换为 C++ 类,这打开了其他方式。

这些都不对。是否有更好的方法,最好是非常轻量级的方法?

最佳答案

您可以将所需的访问器包装在一个函数中,并将其传递给遍历数组并聚合结果的函数。例如

float getSensor1(const event_t* t)
{
return t->sensorOne;
}

float getSensor2(const event_t* t)
{
return t->sensorTwo;
}

void GraphSensor(float (*accessor)(const event_t*)) {
// Get minimum value from series
float min_value = MAX_FLOAT;
for (unsigned int i = 0; i < 9; i++) {
float x = accessor(MyEvents + i);
if (x < min_value)
min_value = x;
}
}

/* later on . . . */
GraphSensor(getSensor1);
GraphSensor(getsensor2);

您基本上是将数据访问与其操作分离,并将其全部同质化为 float 。聚合操作也可以封装到一个函数中。但这已经非常接近 map-reduce 了。 :)

关于c - 在函数中使用结构的不同成员的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24791795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com