fix: ExpressionEngine 构造函数预初始化 mm_vars(恢复原 ExpModule::init() 行为)

This commit is contained in:
Huamonarch 2026-05-15 16:48:59 +08:00
parent 975845963a
commit b53c061f95

View File

@ -7,7 +7,33 @@
ExpressionEngine::ExpressionEngine(std::map<std::string, double>& mm_vars,
std::vector<std::string>& m_tags)
: mm_vars_(mm_vars), m_tags_(m_tags) {}
: mm_vars_(mm_vars), m_tags_(m_tags) {
// 预初始化变量,等效于原 ExpModule::init()
// 确保 mm_vars 中有 tagN/pN/pvN/now 等键,防止后续表达式求值时变量缺失
if (!m_tags_.empty()) {
ensureVarCache(var_cache_, m_tags_.size());
auto now = std::chrono::system_clock::now();
for (size_t i = 0; i < m_tags_.size(); i++) {
double value = 0.0;
try {
value = SingletonTemplate<GlobaltemSharedMemory>::GetInstance()[m_tags_[i]];
} catch (...) {
value = 0.0;
}
mm_vars_[var_cache_.p_keys[i]] = value;
mm_vars_[var_cache_.tag_keys[i]] = value;
for (size_t j = 0; j < PV_NUM; j++) {
mm_vars_[var_cache_.pv_keys[i][j]] = value;
}
}
mm_vars_["now"] = std::chrono::duration_cast<std::chrono::milliseconds>(
now.time_since_epoch())
.count();
mm_vars_["stime"] = 0;
mm_vars_["etime"] = 0;
mm_vars_["time"] = 0;
}
}
// 惰性初始化 VarsCache首次变量刷新时调用
static void ensureVarCache(VarsCache& vc, size_t tag_count) {