0
2

More than 5 years have passed since last update.

c / c++ > RingBuffer (N個のmargin) の実装

Last updated at Posted at 2015-12-01
動作確認
C++ Builder XE4

グラフ描画において古いデータは描画域に入らなくなり不要のため、古いデータを削除する処理が欲しかった。

TListなど使えば簡単ではあるが、同じ処理をCプロジェクトでも使えるように自分で実装した。

処理としては

  • keepnum: 最低限保持したいデータ数
  • margin : 余裕を持たせるデータ数

(keepnum+ margin)にデータ数が達した時に、margin分をごっそり取り除く。
こうすることでデータを取り除く処理をデータ追加時に毎回実行せずに、あるインターバルで実行できるという意図。

処理本体
int TimeGraph_KeepLatestNsets(int keepnum, int margin, TG_graphData_t *graphDataPtr, int *dataCount)
{
    if (*dataCount < (keepnum + margin) ) {
        return *dataCount;
    }

    for(int idx = 0; idx < keepnum; idx++) {
        TG_graphData_t *src = &graphDataPtr[idx + margin];
        TG_graphData_t *dst = &graphDataPtr[idx];
        TimeGraph_SetEachData(dst, src->sampleDt, src->val, src->errStatus);
        // set 0 to moved one
        TimeGraph_SetEachData(src, src->sampleDt, 0.0, src->errStatus);
    }
    *dataCount = keepnum;

    return *dataCount;
}
テスト関数
void Test_TimeGraph_KeepLatestNsets()
{
    TG_graphData_t data[10];
    int dataCnt = 0;

    const int keepnum= 5;
    const int margin = 3;

    for(int idx = 0; idx < (keepnum + margin); idx++) {
        if (idx < keepnum) {
            TimeGraph_SetEachData(&data[idx], Now(), 3.141592, TG_DATA_OK); 
        } else {
            TimeGraph_SetEachData(&data[idx], Now(), 2.7182, TG_DATA_OK);       
        }
        dataCnt++;
    }

    int preCnt = dataCnt;
    int nowCnt = TimeGraph_KeepLatestNsets(keepnum, margin, &data[0], &dataCnt);
    if (preCnt != nowCnt) {
        // after removal of old data
        int nop551 = 1;
        (void) nop551; // 警告「xxxに代入した値は使われていない」の回避
    } else {
        int nop554 = 1;
        (void) nop554; // 警告「xxxに代入した値は使われていない」の回避
    }
}

TG_graphData_t はデータ用の構造体。TDateTimeというメンバ変数を使っているが、Cで使う時はビルトインのデータ型に適宜変更することになる。

TimeGraph_SetEachData(dst, src->sampleDt, src->val, src->errStatus);
はdstポインタの構造体にsampleDt以降のデータをセットする。メンバ変数の一部への代入忘れ防止のためこうしている。

変数の名前はもう少し検討しなおす方がいいかもしれない。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2