【问题标题】:For Loop within Matlab GUIDEMatlab 指南中的 For 循环
【发布时间】:2015-06-15 05:49:06
【问题描述】:

我有 Matlab GUI,它使用执行某些代码的按钮。 所有这些都有效,除了当代码到达 for 循环时,执行似乎没有进入。

1) 知道如何在 Matlab GUIDE 代码框架内实现 for 循环吗?
2) 有没有办法使用断点来调试 GUI 代码(我唯一能做的就是通过 'disp' 语句),因为当我运行 GUI 时,断点会被删除。

在阅读了解决方案后,我发现
(1) 发生是因为 for 循环索引没有随着数组长度而改变 我索引的那个,没有改变。我在代码中解释了这一点。
(2) 我的错,我在运行 GUI 之前设置了断点,当我反其道而行之时,它就断了。

% Opening func
function Regression_OpeningFcn(hObject, ~, handles, varargin)
NoiseMin = -12;
NoiseMax = 10;
NoiseRes = 2;
handles.noiseMin = NoiseMin;
handles.noiseMax = NoiseMax;
handles.noiseRes = NoiseRes;

%**this executed when value changed in edit text box***

function noiseMinDbEditText_Callback(~, ~, handles)
handles.noiseMin = str2num(get(handles.noiseMinDbEditText,'String'));

% When GUI is running, following shows change from -12 sucessfully 
disp(strcat('Noise Min = ',num2str(handles.noiseMin)));

function noiseMinDbEditText_CreateFcn(hObject, ~, ~) 
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 
set(hObject,'BackgroundColor','white');
end

 %Similar code for noiseMax and noiseRes(not shown here)  

`% Here, code enters the Pushbutton callback

function StartRegressionPushButton_Callback(~, ~, handles)
snr_res = handles.noiseRes;
% here, snr_vecs still shows [-12 2 10]
snr_vecs = [handles.noiseMin:handles.noiseRes:handles.noiseMax];

因此,基本上,当 GUI 运行时,在文本框中输入和更改与 min、max 和 res snr 变量相对应的值会显示更改,但是一旦我进入按钮对话框,更改的值(即在全局变量“句柄”中捕获)没有显示,因为我在那里中断了代码。
有什么帮助吗? [for 循环问题出现在我基于 snr_vecs 数组进行索引时,该数组没有改变,因此 for 循环正在执行,但不是应该的]
赛迪

【问题讨论】:

  • 请提供代码的详细描述。从上面的描述我无法清楚地识别问题。
  • 我不确定,但我认为这是由 matlab 主函数处理的。或者,matlab gui 可能有一个单独的主循环。无论如何,在 gui 主函数中看起来好像该函数主要设置图形和回调。当我运行 gui 时断点消失的问题是我无法重现的。你试过重启matlab吗?您使用的是什么操作系统?此外,您知道 gui 从您设置它开始一直运行到您关闭它,对吗?这意味着在此期间不能设置断点。
  • @patrik 是的,我什至在按下“运行”按钮之前就设置了断点,这太愚蠢了。一旦我运行并出现 GUI,我就可以破解代码。这样做我注意到以下几点:

标签: matlab


【解决方案1】:

使用 Matlab 指南

指南基本上只是一个创建图的工具。文件。使用指南可以做的所有事情都可以通过编程方式自己完成。手动创建 ui 元素与使用指南一样容易(我实际上更喜欢以编程方式创建 gui 元素,因为我认为指南的编码非常糟糕)...

每个指南元素都有其必须在某处编码的回调,通常(我认为 100% 的时间)fig 文件与 .m 文件具有相同的名称。找到对应的.m-file 并转到您感兴趣的回调。在那里您可以像在任何其他代码中一样简单地放置断点。

注意:您甚至可以更改代码而无需重新打开 fig 文件!

For 循环或任何在常规代码中工作的东西都适用于 ui 元素代码。

【讨论】:

    【解决方案2】:

    句柄未更新的原因是函数回调末尾缺少以下语句,其变量需要在其他回调中使用。

    guidata(hObject,handles);
    

    我解决了这个问题,效果很好。

    塞迪

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 2015-04-15
      相关资源
      最近更新 更多