文章目录
前言
见《研发日记,Matlab/Simulink避坑指南(三)------向上取整Bug》
见《研发日记,Matlab/Simulink避坑指南(四)------transpose()转置函数Bug》
见《研发日记,Matlab/Simulink避坑指南(五)------CAN解包 DLC Bug》
见《研发日记,Matlab/Simulink避坑指南(六)------字节分割Bug》
见《研发日记,Matlab/Simulink避坑指南(七)------数据溢出钳位Bug》
背景介绍
在一个嵌入式软件项目中,需要对一个信号进行分段处理。思路是使用Simulink中的Matlab Funcyion模块,采用else if的结构进行处理,示例如下:
R
function y = fcn(u)
if u < 0
y = -int16(u);
else if u < 10
y = 10*int16(u);
else if u < 20
y = 20*int16(u);
else if u < 30
y = 30*int16(u);
else if u < 40
y = 40*int16(u);
else
y = int16(u);
end
end
end
end
end
问题描述
按照上述示例,程序运行功能都是正常的,但是代码中一直有标红的警告,示例如下:
分析排查
看警告的提示信息,意思是代码的排版有问题,按照提示对代码进行修改,示例如下:
这样标红的警告消失,说明前面确实是代码排版问题。看上面的if else结构,Matlab认可的是这种逐层嵌套的框架,而不是C语言中惯用的else if并列分支框架。
解决方案
如果采用上述逐层嵌套的结构,需要经常调整前后if和end的对齐问题,而且这种庞杂的框架难免会增加代码出现逻辑错误的可能性。于是我们查阅Matlab官方关于if else的文档,找到了类似C语言中并列的分支结构(elseif是一个专用的关键词,中间没有空格分隔),示例如下:
按照上述语法对我们的算法进行调整,示例如下:
这样没有出现标红的警告,也没有引入新的问题,程序运行起来功能也符合要求, Bug修复完工。
总结归纳
Matlab中的else if并列分支结构,与C语言中的有一个细微区别。C语言中是else if作为一个关键词充当一个语法结构,但是在Matlab中如果中间有空格会被认为是两个关键词,按照两个语法结构被对待。所以在Matlab中要实现和C语言中一样的效果,就要去掉else和if之间的空格。这是两种编程语言在不同使用环境中的一点差别,需要开发者自己留意。
版权声明:原创文章,转载和引用请注明出处和链接,侵权必究!
上述例程使用的Demo工程,可以到笔者的主页查找和下载。