diff --git a/eqpalg/utility/expression_engine.cpp b/eqpalg/utility/expression_engine.cpp index c1e8dd8..4687336 100644 --- a/eqpalg/utility/expression_engine.cpp +++ b/eqpalg/utility/expression_engine.cpp @@ -7,7 +7,33 @@ ExpressionEngine::ExpressionEngine(std::map& mm_vars, std::vector& 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::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( + 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) {