哪里有网站制作设计商贸有限公司起名字

张小明 2026/1/12 11:03:01
哪里有网站制作设计,商贸有限公司起名字,做文案选图片素材的网站,用wordpress videopro第5天#xff1a;数据处理层深入攻略#xff08;ExpressionParser与GraphDataHandler#xff09; 目标#xff1a;用5-6小时掌握表达式解析、寄存器替换、数学计算的核心流程#xff0c;理解原始数据如何转化为最终曲线数值。上午#xff08;3小时#xff09;#xff1…第5天数据处理层深入攻略ExpressionParser与GraphDataHandler目标用5-6小时掌握表达式解析、寄存器替换、数学计算的核心流程理解原始数据如何转化为最终曲线数值。上午3小时ExpressionParser解析引擎学习目标理解如何将用户输入的表达式{40001}{40002*2}转换为可计算的数学表达式。详细攻略从场景出发理解表达式格式示例表达式{40001[1][:f32b]} {40002[2][:32b]} * 2打开软件验证启动ModbusScope添加一个寄存器在表达式编辑框中输入类似格式观察软件如何接受这种语法对照笔记查看ExpressionParser类的_cRegisterFunctionTemplate理解目标是将{...}替换为r(索引)分析ExpressionParser类结构打开expressionparser.h和expressionparser.cpp对照笔记仔细阅读ExpressionParser类的数据成员部分找到关键成员QStringList _processedExpressions;// 处理后的表达式列表QListModbusRegister_registerList;// 解析出的寄存器列表QRegularExpression _findRegRegex;// 查找寄存器表达式的正则QRegularExpression _regParseRegex;// 解析单个寄存器的正则查看正则表达式定义打开expressionregex.h如果存在或在代码中搜索cMatchRegister、cParseReg理解正则模式笔记中提到寄存器表达式形如{40001[1][:f32b]}或{h0[1][:f32b]}中括号内为可选项连接编号[N]和数据类型[:type]关键学习点理解这种语法设计为什么便于用户使用同时支持十进制地址和助记符地址深入解析算法找到ExpressionParser::processExpression函数逐步分析算法流程1.使用_findRegRegex查找所有{...}模式2.对每个匹配使用_regParseRegex进一步解析3.解析结果地址、连接ID、数据类型4.创建ModbusRegister临时对象5.检查是否已存在于_registerList不存在则添加6.获取寄存器在列表中的索引7.用r(索引)替换原表达式中的{...}动手实验在代码中添加调试输出观察解析过程// 在processExpression函数中添加qDebug()原始表达式:graphExpr;qDebug()匹配到的寄存器:match.captured();qDebug()解析后的寄存器对象:modbusRegister;qDebug()替换为:QString(r(%1)).arg(regIdx);测试不同表达式格式创建测试用例QStringList testExpressions{{40001},// 简单地址{40001} {40002},// 两个寄存器相加{h0[1][:f32b]},// 助记符地址连接1浮点数{30001[2][:s16b] * 0.1},// 带乘法的表达式sin({40001}) {40002}// 使用数学函数};编写简单测试程序可选创建一个小程序测试ExpressionParser的解析结果理解寄存器索引映射关键概念相同的寄存器相同地址、相同连接、相同类型只会出现在_registerList中一次思考为什么需要这样设计避免重复读取同一个寄存器验证表达式{40001} {40001}中的两个{40001}会被映射到同一个索引上午学习成果✅ 理解用户表达式的语法规则和设计原理✅ 掌握ExpressionParser将{...}格式替换为r(索引)的完整流程✅ 理解寄存器去重机制和索引映射原理✅ 能手动解析简单表达式并确定寄存器索引检验表达式{40001[1]} {40002[1]} * {40001[1]}会被解析成几个不同的寄存器替换后的表达式是什么下午2-3小时GraphDataHandler与QMuParser计算引擎学习目标掌握表达式如何从字符串变为实际数值的计算过程理解数据流如何衔接。详细攻略理解GraphDataHandler的桥梁作用打开graphdatahandler.h和graphdatahandler.cpp对照笔记阅读GraphDataHandler类部分理解它的三个关键容器QListModbusRegister_registerList;// 寄存器列表QListquint16_registerIndexList;// 寄存器索引列表可能已弃用或笔记有误QListQMuParser_expressionParserList;// 表达式解析器列表注意根据实际代码_registerIndexList可能不存在。以实际代码为准。分析数据处理流程找到GraphDataHandler::processActiveRegisters函数理解调用时机何时会调用这个函数图形激活状态变化时图形表达式修改时连接设置变化时跟踪流程从GraphDataModel获取激活图形的表达式创建ExpressionParser实例解析表达式获取解析后的寄存器列表和表达式列表用处理后的表达式初始化QMuParser对象深入QMuParser计算核心打开qmuparser.h和qmuparser.cpp对照笔记仔细阅读QMuParser类部分理解静态数据成员staticQListResultdouble_registerValues;// 所有解析器共享的寄存器值关键问题为什么寄存器值要设计为静态成员答案所有表达式计算都需要访问相同的寄存器值静态成员避免了重复传递数据。分析计算回调机制找到QMuParser构造函数和mu::ParserRegister::setRegisterCallback理解回调链1.QMuParser构造函数设置回调函数为registerValue2.registerValue通过索引从静态_registerValues获取值3.mu::ParserRegister在计算表达式时调用此回调查看回调函数// 伪代码示意voidregisterValue(intidx,double*val,bool*ok){if(idx0idx_registerValues.size()){*val_registerValues[idx].value();*ok_registerValues[idx].isValid();}}跟踪实时计算流程找到GraphDataHandler::handleRegisterData函数分析执行步骤1.接收来自RegisterValueHandler的原始寄存器值2.调用QMuParser::setRegistersData更新静态寄存器值3.遍历_expressionParserList中的每个QMuParser4.调用evaluate()计算表达式结果5.收集所有结果发出graphDataReady信号调试技巧在此函数设置断点观察每次数据到达时的计算过程理解mu::ParserRegister的扩展功能查看muparserregister.h和muparserregister.cpp理解设计mu::ParserRegister继承自mu::ParserBase关键方法SetExpr设置表达式Eval计算表达式扩展能力除了基本数学运算还支持哪些函数sin, cos, log等动手实验观察表达式计算修改表达式在软件中设置不同的数学表达式简单加法{40001} {40002}带函数sin({40001} * 3.14159 / 180)条件运算{40001} 100 ? {40001} : 0观察计算在QMuParser::evaluate设置断点查看不同表达式的计算过程综合调试任务设置完整的断点链// 从接收到数据到计算出结果GraphDataHandler::handleRegisterDataQMuParser::setRegistersData(静态方法)QMuParser::evaluate mu::ParserRegister::Eval(第三方库)GraphDataHandler::graphDataReady(信号发射处)创建测试场景配置2个寄存器40001值为1040002值为20设置表达式{40001} {40002} * 2预期结果10 20*2 50调试观察逐步执行观察寄存器值如何传递查看_registerValues静态成员的变化观察回调函数registerValue被调用的次数和参数异常情况测试寄存器值无效模拟一个寄存器读取失败观察表达式计算结果语法错误表达式输入{40001} 不完整表达式观察错误处理除零错误表达式包含除法且除数为0的情况数据处理层学习总结核心概念掌握表达式解析双阶段阶段一ExpressionParser将用户友好语法转换为机器友好语法阶段二QMuParser基于muParser执行数学计算数据流清晰分离寄存器值管理GraphDataHandler负责接收和分发表达式管理每个激活图形对应一个QMuParser实例值共享机制静态成员_registerValues确保所有表达式使用相同数据扩展性设计语法易于扩展通过正则表达式可支持新格式计算能力强大借助muParser库支持复杂数学运算错误处理完善无效寄存器值不会导致崩溃典型问题解答Q: 如果表达式包含10个{40001}引用这个寄存器会被读取几次A: 只读取1次。ExpressionParser会去重所有引用指向同一个寄存器索引。Q: 表达式计算是同步还是异步的A: 在handleRegisterData中是同步计算的但这个过程很快不会阻塞UI。Q: 如何添加自定义函数A: 可以扩展mu::ParserRegister添加新的函数定义。实际应用思考性能优化表达式解析只在配置改变时进行计算时直接使用预编译的解析器错误恢复单个寄存器读取失败不会影响其他寄存器的计算灵活性支持复杂的数学运算和条件判断满足各种数据处理需求今日完整成果✅ 掌握从用户表达式到可执行代码的完整转换流程✅ 理解静态寄存器值共享机制的设计原理✅ 能解释回调函数如何将寄存器索引映射到实际数值✅ 掌握表达式计算过程中的错误处理机制✅ 能设计测试用例验证表达式解析和计算的正确性明日预告第6天将进入数据模型层GraphDataModel学习数据如何存储、组织以及模型如何与视图交互。这是连接数据处理和图形显示的关键桥梁。建议行动晚上可以尝试修改一个简单表达式观察软件行为变化巩固今天所学。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做网站赚多少钱灌云网站制作

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个企业级应用认证模块,处理以下场景:1. 新版本应用使用SCRAM-SHA-256,但部分旧客户端只支持SCRAM-SHA-1;2. 需要确保认证过程不…

张小明 2026/1/13 2:17:00 网站建设

佛山建站公司哪家好网页微博打不开

第一章:Open-AutoGLM 二次开发灵活性横向测评Open-AutoGLM 作为新一代开源自动语言模型框架,其设计核心在于支持高度灵活的二次开发能力。本章将从模块解耦性、插件扩展机制、API 设计规范三个维度,对主流二次开发场景下的适应性进行横向对比…

张小明 2025/12/24 8:06:15 网站建设

网站会员注册系统下载wordpress付款后查看内容

文章目录程序改错题(20分)项目结构改错题01改错题02改错题03改错题04改错题05改错题06程序改错题(20分) 项目结构 改错题01 考察知识点:构造函数,构造函数的定义P92: 构造方法的名称必须与类名一致; 构造方法名称前不能有任何返…

张小明 2026/1/1 4:21:20 网站建设

有了域名后怎么建设网站制作展示型网站的公司

在当今快速迭代的开源世界中,高效的版本管理和自动化发布已成为项目成功的关键因素。GitHub Actions作为业界领先的CI/CD平台,配合专业的发布工具action-gh-release,能够为开发者提供无缝的发布体验。本文将通过深度解析action-gh-release项目…

张小明 2025/12/24 8:06:18 网站建设

公司网站运营维护单位联系昆明网站建设

还在为IDM 30天试用期到期而烦恼吗?想要持续使用这款强大的下载管理器却不想花钱购买?IDM试用期重置工具为你提供了合适的解决方案。这款开源工具通过注册表调整技术,让你轻松实现IDM持续使用,无需担心试用期限制。 【免费下载链接…

张小明 2026/1/9 15:42:12 网站建设

深圳市龙岗区住房和建设局官网网站企业微信开发

首先看一下学网络安全有什么好处: 1、可以学习计算机方面的知识 在正式学习网络安全之前是一定要学习计算机基础知识的。只要把网络安全认真的学透了,那么计算机基础知识是没有任何问题的,操作系统、网络架构、网站容器、数据库、前端后端等等…

张小明 2026/1/1 14:04:40 网站建设