无名之辈-视觉脚本编译器开发
上一个篇幅中我们提到要想完成一个独立的脚本编译器,则需要的最基础的三个条件:新建变量、计算变量、逻辑运算。前两个在上文中已经做了解析,逻辑运算将是本文的重点介绍对象。
提示:本文所有内容皆为原创,如有雷同联系我(WeChat:Conbo_iwork)。
前言
无论是if、for还是switch在实现逻辑运算的时候往往是最基础的运算方式,这种方式在C、C++、Java、Python、ST、SCL(DIN EN 61131-3 ‘国际标准为 IEC 1131-3’ )等都是一样的逻辑。但就是如果让这些逻辑运算符里面的变量变成我们编译后创建的变量,这就引出了我们的问题所在。
一、如何调用函数
1、函数在自定义的程序段中一定是一行一行被执行的,每个函数都一定有其独特的函数名,该函数名在自定义封装的函数库内不允许被重复写入,否则将会在调用的时候因不知道调用哪个而出现错误。
2、为了方便传递函数名,可以给每个函数床架一个函数ID,即FunctionID。在传递函数名的时候只需要int变量即可,减小运行所需内存也是优化程序的一种方式。
3、在执行函数调用的入口处会有一个庞大的“Switch”结构,根据函数ID将得到的参数传递给相应的函数以运行。
4、函数要么提供return返回值,要么有稳定的全局变量以供数据存储使用,如果要调试中间变量建议使用全局变量的方式储存,否则return是最优选择。
5、函数库需要单独封装为Dll调用,否则后续更新库文件还需要整个项目重新编译,不可取。
6、勤用结构体,结构化文本的调用使用结构体是最安全最不容易出问题的。结构体也有构造函数,可以初始化值使用。
二、如何传入参数
1、参数的读取一定是从程序段中拿到的参数值,并且只需要参数值即可,因为在封装函数库的时候,函数对应位置的对应参数是一定的,所以顺序拿到参数值后进行转变传递给参数即可。
2、如果要跨函数传感参数值,则需要将参数名称设定成链表(主要是不同参数的值的数量也不一样),然后在需要调用的位置自行识别参数的值,然后再使用。
3、针对具有条件意义的参数,特殊处理其条件即可,没必要以参数形式存放。
三、效果展示
脚本基本运算逻辑演示。点击查看视频(下面图模糊)
脚本基础逻辑运算
代码如下(视频逻辑):
for(int Count = 0;;Count<5;Count++){
switch(Count){
case 0: qDebug("this is 0");
case 1: qDebug("this is 1");
case 2: qDebug("this is 2");
case 3: qDebug("this is 3");
case 4: qDebug("this is 4");
}
if(Count>2){
qDebug("If yes");
}
else{
qDebug("If No");
}
}
运算结果:
1: "this is 0"
2: "If No"
3: "this is 1"
4: "If No"
5: "this is 2"
6: "If No"
7: "this is 3"
8: "If yes"
9: "this is 4"
10: "If yes"
想要实现基础的独立脚本编译器,最基础的运算单元应该能够正常运行,并且在调试过程中通过颜色变化等,可视化程序调试过程,能够输出、打印错误信息,能够将中间变量保存下来可以查看,这样的脚本编译器能够正常使用。
总结
脚本编译器的基础逻辑就到这里,后面会有更精彩的QTableWidget简单拖拽、在QLableWidget上打印错误信息、如何显示中间变量等等操作。包括注册时间过滤器、优化使用信号与槽的机制问题。
万年不变结尾:以上仅代表本人在这个行业、这个岗位的个人看法。以及针对遇到的此种问题提出的个人建议,不代表公司以及社会任何组织的任何利益或行为。本文所使用的所有库文件皆可追溯,若有侵权可联系本人(WeChat:Conbo_iwork)删除帖子。