从用户输入字符串保存变量

92(30天)
乔阿欣Magnusson
乔阿欣Magnusson 2015年6月26日
编辑: Stephen23 2019年3月18日
我有一个让用户创建一个测试的gui。我存储用户输入作为一个新结构,因为用户应该能够保存测试参数。当用户按保存按钮我想保存新结构作为.mat文件包含这个结构。问题是命名保存的结构。我使用“保存(文件名,varname)”,让我的名字.mat文件我想做的一切。但是结构名称保存将“varname”命名的变量。但是我想要的结构命名的用户名叫什么测试。我希望我在感觉。我理解是不练习创建一个变量名称的字符串。实现这一目标的另一种方式吗?
编辑*的例子:
以测试% %返回结构参数
editedTestName editedTest = getNewTest(处理);
%保存结构
保存(文件名,“editedTest”);
这节省了我在.mat文件结构,我想要的,但结构.mat文件名为“editedTest”,我想这个变量名称字符串后(我想要保存的结构命名为用户指定测试)。
整个函数是这样的:
% - - - - - -执行在pushbutton_saveTest按钮按下。
函数pushbutton_saveTest_Callback (hObject, ~,处理)
listboxItems =得到(handles.listbox_tests,“字符串”);
editedTestName = char (get (handles.edit_testName,“字符串”));
editedTestName editedTest = getNewTest(处理);
currentFolderPath = pwd;
如果ismember ({“空- - -”},listboxItems)
listboxItems {1,} = editedTestName;
elseifismember ({editedTestName}, listboxItems)
%建立questdlg三个选项
选择= questdlg (的考试已经存在,要覆盖吗?”,
测试已经存在的,
“默认”);
%处理响应
开关选择
情况下“是的”
文件名= [currentFolderPath“\ \测试”editedTestName];
情况下“不”
回答= char (inputdlg ({“输入新的测试名称”},“保存新的测试”1,{“untitled测试”}));
文件名= [currentFolderPath“\ \测试”回答);
listboxItems(+ 1,:) ={答案};
情况下“取消”
%什么也不做
文件名= [];
结束
其他的
文件名= [currentFolderPath“\ \测试”editedTestName];
listboxItems (+ 1,:) = {editedTestName};
结束
如果~ isempty(文件名)
保存(文件名,“editedTest”);
句柄。测试= setfield(处理。测试,editedTestName editedTest);
结束
集(handles.listbox_tests,“字符串”,listboxItems);
guidata (hObject处理);

接受的答案

Stephen23
Stephen23 2015年6月26日
编辑:Stephen23 2019年3月18日
这里有两个重叠的问题:
  1. non-robustness字符串评价(这是在你的覆盖另一个问题)。原因有很多弦评价应该避免,但它可以归结为健壮性、性能、可靠性和易于调试代码。讨论,阅读任何问题在这个论坛上关于字符串评估,如这一个,或者我教程:为什么变量不应该叫动态(eval)
  2. 在变量名和字段名的元数据(如命名变量和用户的输入,或更常见的试图在变量名中包含一个索引)是更微妙的,但也是一个可怜的编程实践。迫使元数据变量名称使得访问元数据和更复杂的慢得多。相比之下,存储元数据和数据一个变量允许您编写更广义的代码,更健壮,更具有适应能力,容易写,并且更容易修复。这是为什么…
考虑一个测试集合在几个速度,伴随数据,我们包括测试元数据字段名:
X。test_5kmh = (1、2、3);
X。test_100kmh = (5、6、7);
如果这个元数据需要显示在图标题,然后它需要一些复杂的处理:字段名的,识别并提取部分,然后显示。现在会发生什么当测试条件变化和扩展,并决定还包括温度:
X。test_5kmh_20deg = (1、2、3);
X。test_5kmh_60deg =(8 9南);
X。test_100kmh_20deg = (4、5、6);
等。
但是请注意:为了允许这种变化 每一段代码,处理这些字段名必须检查,并可能改变 。这是不可能的 任何 字段名不需要零钱 所有 相关代码检查和更新。我们的代码休息,这些标题不再工作,更糟糕的是也许我们甚至没有意识到我们的代码的哪些部分被打破。我们错过了一点吗?我们忘了检查部分地方吗?很明显,这不是强大的,也不是通用的。解析这些名字可能打破,当我们把一个负号,或NaN值,或改变多少位数的值使用,或者需要包括新的突然变成相关的元数据。它可能打破,我们甚至不能很容易检查 在哪里 它可能打破(因为我们无法寻找一个简单的字段名),我们也不知道 如何 它可能打破……
现在考虑当元数据作为数据 在他们自己的权利 :
X (1)。数据= (1、2、3);
X (1)。速度= 5;
X (2)。data = [4、5、6;
X (2)。速度= 100;
应包括其他数据时,我们可以这样做 不作其他修改现有代码 :
X (1)。温度= 20;
X (2)。温度= 20;
等。
图标题一代,只是基于速度值,仍然会工作!不受添加更多的元数据(即字段),甚至任何数据 。其他字段和值可以完全改变,但所有相关的速度值 仍然工作 。和更好的:如果我们需要改变原来的速度元数据本身(不同的单位,使它成为一个范围的值,空作为一个占位符,南等)的 只有 地方需要更新那些速度值被称为,和其他地方。和现在发现这些代码也是简单的使用一个简单的搜索“X。(“速度”或“速度,在我们所有的文件。怎么可能一个搜索动态指定变量或字段名?一个人怎么能找到每一个地方,他们被称为?
现在让我们考虑你的情况: “但是我想要的结构命名用户命名为“测试” 问题是, 为什么 你想要这个吗?可能它是保持信息方便。我们保持方便:
X (1)。data =
X (1)。user_input =
这个您可以简单地保存用户给你…它甚至可以是空的,这并不重要,因为 你的代码不依赖于他们的价值 :这是健壮的!用户甚至可以决定改变输入单元阵列,而不是一个字符串,并正确代码仍将商店。当然任何 处理 这个值可能会改变,但这些加工位置现在更容易定位和更新……而且它 仍然 不影响任何 其他 字段或数据!现在是通用的!
其他有关此议题的讨论:
和其他一些语言建议“不要创建动态变量名”:
3评论
ankarao velisetty
ankarao velisetty 2016年2月20日
谢谢你的详细回答!

登录置评。

更多的答案(0)

标签

s manbetx 845

社区寻宝

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

开始狩猎!