From b53c061f95c1e90c7ea05bcdd831d4f70a7337be Mon Sep 17 00:00:00 2001 From: Huamonarch Date: Fri, 15 May 2026 16:48:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20ExpressionEngine=20=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E9=A2=84=E5=88=9D=E5=A7=8B=E5=8C=96=20mm=5Fv?= =?UTF-8?q?ars=EF=BC=88=E6=81=A2=E5=A4=8D=E5=8E=9F=20ExpModule::init()=20?= =?UTF-8?q?=E8=A1=8C=E4=B8=BA=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eqpalg/utility/expression_engine.cpp | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) 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) {