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

时间:2014-07-16 22:18:42

标签: 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个结构成员。我可以将所有这些移动到一个单独的函数并使每一位数据访问调用该函数,总是返回一个浮点数(对于我的图表应该是可以的)。最后我可以转换为C ++类,这会打开其他方法。

没有人认为对。是否有更好的方法,最好是非常轻便的方法?

2 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:3)

您可以将结构更改为使用可能所有浮点数的数组。通过这种方式,数据处理是完全同质的。

#define N_SENSORS   12
#define N_EVENTS    10 

float MyEvents [N_EVENTS] [N_SENSORS];

void GraphSensor(byte graphType)
{
    float min = 1e38;
    for (unsigned int i = 0; i < N_EVENTS; i++)
    {
       // Get minimum value from series
       if (MyEvents[i][graphType] < min)
            min = MyEvents[i][graphType];
    }
}

也许时间戳也可以在元素零中使用电子表格约定:整数部分是1970年或1900年以来的天数,小数部分是当天的一部分(所以中午= .5)。