0

我正在为带有几个运行回调函数的 GUI 项目的图形窗口编写代码。目前我有一个文本框和一个滑块控件,我进行了设置,以便对文本框值的更改不仅会更改显示的数据,还会更新滑块位置以匹配该值。我遇到的问题是试图让我的varargin参数(在创建图形窗口时输入到主函数中)不被包含在父cell变量中。当我的顶层varargin包含一个值参数对时,varargin是一个cell维度为 1x2 。没关系。通常,可以将所有这些参数传递给内部函数调用,如下所示:

function topfunc(varargin)
%code
do_something(varargin{:})

该函数会dosomething看到正确的参数列表。但是当我通过定义传递 varargins 时callback,如

txtui = uicontrol(hf,'Style','edit','string',fristframe,'backgroundcolor','y',...
    'position',[10 100 50 20],'Tag','Scaler','UserData',lsatframe,...
    'Callback',{@doslide,adcname,mode,goodframes,{varargin{:}} } ); 

然后该函数 doslide调用绘图更新函数dordplot

 function doslide(theui,event,fileName,mode, goodframes,varargin)
% code snipped...

dordplot(slidinfo,event,fileName,mode,goodframes,varargin{:});
end

内部doslidevarargin是一个 1x1 单元格,其中包含预期的 1x2 单元格。

我在我的最终函数中添加了一个 kludge fix,其中varargin实际使用了

varargin = varargin{:};

varargin但是,一开始就被包裹在牢房里似乎是错误的。
是否有修复,或者我是否错误地定义了我的回调函数调用?

4

2 回答 2

5

根据以下文档varargin

当函数执行时,varargin是一个1-by-N元胞数组,其中N 是函数在显式声明的输入之后接收到的输入数。

在您的回调声明中,您有:

{@doslide,adcname,mode,goodframes,{varargin{:}}}

varargin{:}大括号括起来会将其连接回一个单元格数组,因此您只会将 1 个输入传递给doslideafter goodframes

取下大括号:

{@doslide, adcname, mode, goodframes, varargin{:}} 
于 2016-08-24T20:33:16.050 回答
1

在 matlab 中,具有单元格数组的多索引单元格索引 ( c{:}, ) 的表达式是值列表。值列表只是单元格数组元素的逗号分隔列表。例如,对于元胞数组 , 的值为exatcly 。所以线的意思 。这是一个错误。c{array}c={1,2,3,4}c{:}1,2,3,4d= c{:}d=1,2,3,4

UPD:我说的不对,d=1,2,3,4不是错误,是一种表达方式d=1。无论如何,{varargin{:}}等价于varargin,因为varargin{:}表示所有元素的逗号分隔列表varargin

于 2016-08-24T20:45:08.033 回答