学习网站建设总结做区位图的网站

张小明 2026/1/3 6:01:53
学习网站建设总结,做区位图的网站,西安做网站价格,昆山注册公司流程费用第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进行投诉反馈,一经查实,立即删除!

怎么做二手房网站wordpress支持大文件上传

在学术探索的浩瀚星空中,本科与硕士阶段的论文写作犹如一场充满未知的星际旅行。面对选题迷茫、文献梳理耗时、逻辑构建混乱、语言表达不专业等重重挑战,许多学子在知识的深海中挣扎求索。但如今,一款名为“书匠策AI”的科研工具正悄然成为这…

张小明 2025/12/30 12:06:56 网站建设

男孩子怎么做网站赚钱东莞市手机网站

文章目录系统截图项目技术简介可行性分析主要运用技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统截图 python-flask-django_6aq5cjpg 农业技术信息种植基地管理系统 项目技术简介 Python版本&…

张小明 2026/1/3 0:34:54 网站建设

商业网站开发与设计市场营销研究生好考吗

10分钟玩转RimSort:RimWorld模组管理终极指南 【免费下载链接】RimSort 项目地址: https://gitcode.com/gh_mirrors/ri/RimSort RimSort是一款专为RimWorld玩家设计的开源模组管理工具,通过智能排序算法和直观的拖拽界面,让复杂的模组…

张小明 2025/12/30 12:05:41 网站建设

做群头像的网站在线制作常州网络公司鼎豪网络网站建设

小红书数据采集实战:从零掌握xhs工具的高效应用 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs 在数字营销竞争日益激烈的今天,小红书作为内容电商的…

张小明 2025/12/30 12:04:22 网站建设

电商网站总体设计方案网上怎么查自己是不是团员

Git提交前用pre-commit钩子检查PyTorch代码风格 在深度学习项目开发中,你是否遇到过这样的场景:团队成员提交的代码缩进混乱、import语句无序排列,甚至混入调试用的print()语句?更糟的是,当这些代码进入CI流程后才被发…

张小明 2026/1/1 12:23:53 网站建设