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

相关推荐
2zcode1 小时前
基于Matlab图像处理的静态雨滴去除与质量评估系统
开发语言·图像处理·matlab
优化控制仿真模型7 小时前
基于变频与移相混合控制(PFM+PSM)的全桥LLC谐振变换器仿真模型
matlab
梦想的初衷~17 小时前
MATLAB近红外光谱分析技术及实践技术应用
开发语言·支持向量机·matlab
2zcode21 小时前
基于Matlab图像处理的瓶子自动检测与质量评估系统
开发语言·图像处理·matlab
zzc9211 天前
多信号实采数据加噪版本
matlab·usrp·高斯·gauss·时频图·多信号·实采信号
xiao5kou4chang6kai41 天前
MATLAB近红外光谱分析技术及实践技术
支持向量机·matlab·近红外光谱·光谱分析
微光-沫年2 天前
150-SWT-MCNN-BiGRU-Attention分类预测模型等!
机器学习·matlab·分类
青春不败 177-3266-05202 天前
MATLAB近红外光谱分析技术及实践技术应用
随机森林·机器学习·支持向量机·matlab·卷积神经网络·遗传算法·近红外光谱
简简单单做算法3 天前
基于LSTM深度学习网络的视频类型分类算法matlab仿真
深度学习·matlab·分类·lstm·视频类型分类
2zcode4 天前
基于Matlab图像处理的水果分级系统
图像处理·人工智能·matlab