0

コールバック関数を実行するいくつかの GUI アイテムを含むグラフィックス ウィンドウのコードを書いています。現在、テキスト ボックスとスライダー コントロールがあり、テキスト ボックスの値を変更すると、表示されるデータが変更されるだけでなく、その値に合わせてスライダーの位置も更新されるように設定しています。私が直面している問題は、varargin引数 (グラフィックス ウィンドウを作成するときにメイン関数に入力されたもの) が親cell変数に囲まれないようにすることです。トップレベルvararginに値とパラメーターのペアが含まれている場合varargincell次元は 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予想される 1x2 セルを含む 1x1 セルです。

vararginの内容が実際に使用されている最終関数に、次の行でクラッジ修正を入れました

varargin = varargin{:};

vararginしかし、そもそもセル内にラップされるのは間違っているようです。
修正はありますか、それともコールバック関数呼び出しを間違って定義しましたか?

4

2 に答える 2

5

のドキュメントによるとvarargin

関数が実行されると、varargin1-by-Ncell 配列になります。ここN で、 は明示的に宣言された入力の後に関数が受け取る入力の数です。

コールバック宣言には次のものがあります。

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

中かっこで囲むとセル配列に連結されるため、 after にvarargin{:}は 1 つの入力しか渡されません。doslidegoodframes

ブレースを取り外します。

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

matlab では、セル配列の複数インデックス セル インデックス ( c{:}、 ) を含む式は値リストです。値リストは、セル配列要素のカンマ区切りのリストです。たとえば、セル配列 の場合、 の値は正確にです。したがって、この行は を意味し ます。エラーです。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 に答える