储蓄没有邪恶eval函数变量

5视图(30天)
Remco1988
Remco1988 2016年11月29日
评论道: 巴米勒2021年7月22日
注意: 我知道使用eval通常不是一个好的做法。但是对我来说很难理解当可以用它,什么时候不听。
问题: 我的问题是,这是一个适当的用法吗?如果没有它我该做如何不同?
背景: 我有一个函数,偶尔崩溃(这个问题不会在细节)因为它是仿真运行30分钟后我想避免重新运行仿真。我不过一个检查站的所有变量的函数保存,以防它失败。
代码: 我开始拯救所有变量的基本工作空间(可以是.mat文件如果这者优先)
函数测试(var1、var2 var3 var4,)。
%的临时存储结果的工作区
变量=谁;
2 = 1:长度(变量);
保险。({2})变量= eval({2}变量);
结束
assignin (“基地”,“保险”、保险)
为了方便我救了所有变量在一个结构体,但即使我seperatly救了他们,我不认为在这种情况下为了避免eval。
第2部分代码: 用户现在可以通过调用函数(尝试)重新运行“测试”(保险),这将恢复保存的变量
函数测试(var1、var2 var3 var4,)。
% m文件加载临时存储结果
如果输入参数个数= = 1
保险= var1;
名称字段名=(保险);
2 = 1:长度(名称)
函数宏指令(@ ()assignin (“来电”,{2},保险。(名字{2})))
结束
结束
2的评论
巴米勒
巴米勒 2021年7月22日
应该是
保存(帧,变长度输入宗量)

登录置评。

答案(3)

dpb
dpb 2016年11月29日
只是 保存 然后 负载 将所有自动…看到了什么
医生保存%的细节
2的评论
dpb
dpb 2016年11月29日
编辑:dpb 2016年11月29日
为什么?你需要什么 eval 如果你仅仅是保存和恢复他们的变量?看不出这个问题,对不起……
函数YourRescueFunction(保险)
负载保险
结果= TheOriginalFunction (variablesFromInsuranceReloaded);
实际上,如果你是在初始和包装上面让它复苏程序内嵌套函数,然后一切都在当地也在原来的,你甚至没有一个问题的工作区看起来……

登录置评。


1月
1月 2016年11月29日
使用一个函数,而不是脚本,污染基本工作空间变量。然后您可以使用 保存 存储所有当前的变量,而不是其他任何东西的基础工作空间。但是,即使你使用 保存 在脚本中:没有必要 eval 在所有。

亚历山德拉Harkai
亚历山德拉Harkai 2016年11月29日
编辑:亚历山德拉Harkai 2016年11月29日
如何将所有这些状态变量结构呢?然后你可以将它们保存到一个垫子文件,例如:
var_struct。var1 = < some_value >;
var_struct。var2 = < some_other_value >;
帧= [datestr(现在,“yymmdd_HHMMSS”),“.mat”];
保存(帧,“结构”,“var_struct”,“-v7.3”);
1评论
Remco1988
Remco1988 2016年11月29日
编辑:Remco1988 2016年11月29日
它是可能的,但你会建议要么创建一个结构体函数内不同的输入:
测试(var1、var2 var3 var4,)。
如果输入参数个数= = 1%的用户运行结构
var_struct = var1;
var1 = var_struct.var1;
var2 = var_struct.var2;
其他的
var_struct。var1 = var1;
var_struct。var2 = var2;
var_struct保存(帧)%使检查点
结束
或者有一个函数,它只允许一个struct首先输入:
var_struct保存(帧)
测试(var_struct)%运行函数
测试(var_struct)
var1 = var_struct.var1;
var2 = var_struct.var2;
第一个是笨重的输入(这就是为什么我创建了一个for循环)。第二更优雅,但我不认为功能与结构的输入也好的做法?

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!