在函数中使用struct的不同成员的最有效方法?

use*_*705 6 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].?????) ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如何让我的函数对结构的不同成员进行操作?我可以看到大量的switch (graphType)陈述,但这非常难看.可能很容易有8或10个结构成员.我可以将所有这些移动到一个单独的函数并使每一位数据访问都调用该函数,总是返回一个浮点数(对于我的图表应该没问题).最后我可以转换为C++类,这会打开其他方法.

没有人觉得对.有更好的方法,最好是非常轻便的方法吗?

Ran*_*ook 6

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

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);
Run Code Online (Sandbox Code Playgroud)

您基本上将数据访问与其上的操作分离,并将其全部均匀化为浮点数.聚合操作也可以封装到函数中.但这与map-reduce非常接近.:)

  • @ryyker:`accessor`是`GraphSensor`函数的函数指针参数.基本上,`GraphSensor`的调用者在函数的地址中传递一个匹配的签名,它应该在需要时调用它们.我的例子的最后两行证明了这一点. (2认同)