【问题标题】:Send handles to anonymous function in matlab?向matlab中的匿名函数发送句柄?
【发布时间】:2014-03-23 11:37:30
【问题描述】:

作为主题,我正在尝试发送句柄,以便匿名函数可以与 GUI 的其余部分进行交互。但是,当查看匿名函数中的输入时,它们会变成空的。

这里将功能添加到GUI:

x=5;
y=3;
z=4;
set(gca,'ButtonDownFcn', @(y,z,x)mousecontroll_callback)

Inside 函数会对您点击的内容做出反应,但它无法读取 y、z 或 x

function mousecontroll_callback(y,z,x)
...

我在运行此 GUI 时收到此错误消息,它是从另一个名为 otherGUI 的 GUI 调用的 “使用屏幕模式时出错>screenmode_OutputFcn 输入参数过多。

gui_mainfcn 中的错误(第 265 行) feval(gui_State.gui_OutputFcn, gui_hFigure, [], gui_Handles);

屏幕模式错误(第 42 行) gui_mainfcn(gui_State, varargin{:});

otherGUI 中的错误>全屏(第 1031 行) 屏幕模式(图像,范围); 评估 uimenu 回调时出错” - 但是,当不弄乱匿名函数的输入并尝试访问它们时,代码会运行。

我不想再使用全局变量了,有谁知道如何获取这个函数来获取 x,y,z,稍后将是句柄?

【问题讨论】:

    标签: matlab user-interface


    【解决方案1】:

    试试这个:

     set(gca,'ButtonDownFcn', { @mousecontroll_callback , x,y,z} );
    
     ...
    
     function mousecontroll_callback(hObj,evt,x,y,z)
    
     end
    

    {} 语法让 Matlab 知道您想要传递额外的变量。


    请注意,xyz 值将作为closure 上下文的一部分被冻结,即使您更新它们也是相同的。如果您想这样做,您将需要找到其他解决方案,例如:

    • 使用guidata 全局数据存储来传输结构(与 Guide 一样)- 最流行的解决方案。
    • 创建您自己的handle 对象,该对象将传递给所有函数
    • 使用全局变量
    • 使用嵌套函数,类似于使用全局变量

    【讨论】:

    • thx,我试过了,但一直收到这个错误信息,和以前一样; “使用屏幕模式时出错>screenmode_OutputFcn 输入参数过多。gui_mainfcn 中的错误(第 265 行) feval(gui_State.gui_OutputFcn, gui_hFigure, [], gui_Handles); 全屏模式中的错误(第 42 行)gui_mainfcn(gui_State, varargin{:}); 错误在其他GUI>全屏(第1031行)屏幕模式(图像,范围);评估uimenu回调时出错
    • 但它在某种意义上是有效的,因为变量被传递了,谢谢!
    【解决方案2】:

    您的代码中有错误,这意味着它没有按照您的想法进行操作。

    x=5;
    y=3;
    z=4;
    set(gca,'ButtonDownFcn', @(y,z,x)mousecontroll_callback)
    

    如果您有上述代码,我猜您希望在按下按钮时执行以下命令:

    mousecontroll_callback(3,4,5);
    

    实际上,通过将参数紧跟在@ 符号之后,您实际上是在创建一个包装函数,如下所示 (baz)

    x=5;
    y=3;
    z=4;
    set(gca,'ButtonDownFcn', @baz)
    
    function foo = baz(b,c,a)
      mousecontroll_callback
    end
    

    如果您改为使用以下内容,它应该可以按预期工作:

    set(gca,'ButtonDownFcn', @() mousecontroll_callback(y,z,x));
    

    我还建议看看MathWorks documentation on anonymous functions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多