如何通过回调函数传递 varargin

How to pass varargin through callback functions

我正在为图形 window 编写代码,其中包含几个 运行 回调函数的 GUI 项。目前我有一个文本框和一个滑块控件,我进行了一些设置,以便对文本框值的更改不仅会更改显示的数据,还会更新滑块位置以匹配该值。我 运行 遇到的问题是试图让我的 varargin 参数(在创建图形 window 时输入到主函数中)不被包含在父 [=15] 中=] 变量。当我的顶级 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 单元格。

我在我的最终函数中进行了一个错误修复,其中实际使用了 varargin 的内容,行

varargin = varargin{:};

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

根据 varargin 的文档:

When the function executes, varargin is a 1-by-N cell array, where N is the number of inputs that the function receives after the explicitly declared inputs.

在你的回调声明中你有:

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

varargin{:} 包裹在大括号中会将其连接回元胞数组,因此您只会在 goodframes.

之后将 1 个输入传递给 doslide

去掉大括号:

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

在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

的所有元素的逗号分隔列表