研发日记,Matlab/Simulink避坑指南(八)——else if分支结构Bug

文章目录

前言

背景介绍

问题描述

分析排查

解决方案

总结归纳


前言

见《研发日记,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工程,可以到笔者的主页查找和下载。

相关推荐
Dev7z1 天前
基于 MATLAB 的铣削切削力建模与仿真
开发语言·matlab
fengfuyao9851 天前
基于MATLAB的表面织构油润滑轴承故障频率提取(改进VMD算法)
人工智能·算法·matlab
机器学习之心1 天前
基于随机森林模型的轴承剩余寿命预测MATLAB实现!
算法·随机森林·matlab
rit84324991 天前
基于MATLAB的环境障碍模型构建与蚁群算法路径规划实现
开发语言·算法·matlab
hoiii1871 天前
MATLAB SGM(半全局匹配)算法实现
前端·算法·matlab
yong99901 天前
MATLAB面波频散曲线反演程序
开发语言·算法·matlab
yugi9878382 天前
基于MATLAB的一键式EMD、EEMD、CEEMD和SSA信号去噪实现
开发语言·matlab·信号去噪
youcans_2 天前
【STM32-MBD】(15)Simulink 模型开发之三相互补 PWM
stm32·单片机·嵌入式硬件·matlab·foc
机器学习之心2 天前
基于CNN-GRU(卷积神经网络-门控循环单元)的多变量负荷预测模型MATLAB代码
matlab·cnn·gru
3GPP仿真实验室2 天前
【Matlab源码】6G候选波形:OFDM-IM 索引调制仿真平台
开发语言·matlab