1 问题
在GUI的回调函数中save一系列变量为一个mat文件后,变量名称分别如下图所示。
当在另一个UI界面的回调函数中load()该文件进入工作空间时,‘bandwidth’变量无法被调用读取,命令行提示如下错误。
2 定位问题
对回调函数进行debug,发现load()语句执行后工作区中存在所有需要的变量,包括‘bandwidth’,步进(F10)执行后发现该变量再被调用前始终存在与工作区中,未被清除。当其被如下语句首次调用时才报上述错误,并且退出执行。
3 解决方法
同样在debug模式执行该语句,弹出如下警告。
此时变量空间只有‘bandwidth’一个变量,网上并未查找到matlab中的相关解决方法,只看到Go语言中提到这个问题。我对变量遮蔽的理解应该就是this.xxx与xxx的问题,但是此时变量空间并无同名变量,因此应该不是一个意思,故此路不通。
此时我发现上述save()语句中的变量均为xxx_xxx的形式,按照此思路修改后save前的变量名称并重新save与load,不再报错,问题完美解决。再次尝试更换其为其他变量名,仍然无报错,至此可确定'bandwidth'的变量名load进来后产生了冲突。
其间也尝试对load后的'bandwidth'进行重命名,错误仍然存在,可证明不能以'bandwidth'名称save,一旦存储后再次调用是会产生“变量屏蔽”。
总结:GUI的内置结构体handles里面可能有与‘bandwidth’同名的变量,导致调用时变量冲突,覆盖无法读取。在定义新变量名称时应尽量避免同名。