如何通过回调函数传递 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
的所有元素的逗号分隔列表
我正在为图形 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 a1-by-N
cell array, whereN
is the number of inputs that the function receives after the explicitly declared inputs.
在你的回调声明中你有:
{@doslide,adcname,mode,goodframes,{varargin{:}}}
将 varargin{:}
包裹在大括号中会将其连接回元胞数组,因此您只会在 goodframes
.
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