動作確認
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以降のデータをセットする。メンバ変数の一部への代入忘れ防止のためこうしている。
変数の名前はもう少し検討しなおす方がいいかもしれない。