2014-07-16 9 views
6

我正在寫一個非常有限的資源嵌入式處理器。我有一個捕獲時間序列事件的結構,我想對不同類型的不同值使用相同的圖形函數。喜歡的東西(非常精簡,不出汗初始化值等):在函數中使用不同結構成員的最有效方法?

#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++類,這可以打開其他方法。

這些都不對。有沒有更好的方法,最好是非常輕量級的方法?

回答

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非常接近。 :)

+0

在C.的上下文中解釋'accessor()'函數在哪裏定義? (C++?) – ryyker

+0

@ryyker:他沒有定義它,但它的一個明確的例子是前兩個函數。 – wallyk

+0

在我上面的示例中,'getSensor1'和'getSensor2'是訪問函數(有時稱爲「getters」),因爲它們用於訪問數據而不會完全揭示如何實現。好處是它們提供了一個接口,後面的數據結構('event_t')可以自由更改。 –

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和小數部分是天(因此中午= 0.5)的一部分。

+1

這很聰明:+1。我最初的反應是,你失去了人類可讀的名字,你的數據在結構體中(現在是一個數組),但你可以使用'#define'來命名數組中的索引以保持清晰性:'MyEvents [我] [SENSOR_ONE]'而不是'MyEvents [i] .sensorOne'。如果所有數據都可以共享一個通用類型,這將起作用。如果它是異構的,那麼你可能需要使用訪問函數。 –

+0

這絕對是聰明的,我將它保存下來供將來參考。今天,數據量的增加使其對這個項目沒有吸引力。謝謝! – user977705

相關問題