如何通过回调函数传递varargin

时间:2016-08-24 19:54:00

标签: matlab callback variadic-functions cell-array matlab-gui

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

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

函数dosomething可以看到正确的参数列表。但是当我通过callback定义传递varargins时,就像在

中一样
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

doslide内,varargin是包含预期的1x2单元格的1x1单元格。

我在最后一个函数中添加了一个kludge修复程序,其中实际使用了varargin的内容,其中包含

varargin = varargin{:};

但是varargin首先被包裹在一个单元格中似乎是错误的 有没有修复,或者我是否错误地定义了我的回调函数调用?

2 个答案:

答案 0 :(得分:5)

根据varargin的文档:

  

当函数执行时,varargin1-by-N单元格数组,其中N   是函数接收后的输入数量   明确声明的输入。

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

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

将大括号中的varargin{:}连接回一个单元格数组,因此您只需在doslide之后将1个输入传递给goodframes

删除大括号:

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

答案 1 :(得分:1)

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

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