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

标签 c struct

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

#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/

相关文章:

c - C 中的 sizeof 返回类型

C - 如何打印罗马数字?

c++ - Tokyo Cabinet : Segmentation fault at hdb->close()

c - 这些数组声明有什么区别?

c - 如何将一个结构体指针赋值给另一个结构体指针

json - 将字符串映射到具有不同值的映射

C - 嵌套 for 循环模式

go - 方法在结构副本上的应用反射(reflect)在原始结构中

c - 将日期(声明为字符)打印为字符串

c - 有序二叉树中的查找方法