Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 从另一个方法调用一个方法和回调参数_Matlab_Oop_Events_Callback_Listener - Fatal编程技术网

Matlab 从另一个方法调用一个方法和回调参数

Matlab 从另一个方法调用一个方法和回调参数,matlab,oop,events,callback,listener,Matlab,Oop,Events,Callback,Listener,我在定义回调参数时遇到了问题,所说的对我没有帮助 我的第一节课: classdef first < handle properties State = false end events Contact end methods function OnStateChange(obj,newState) if newState ~= obj.State obj.State = newSt

我在定义回调参数时遇到了问题,所说的对我没有帮助

我的第一节课:

classdef first < handle
   properties
       State = false
   end
   events
      Contact
   end
   methods
      function OnStateChange(obj,newState)
         if newState ~= obj.State
            obj.State = newState;
            notify(obj,'Contact');
         end
      end
      function follower(obj)
          while 1
              data=inputSingleScan(sessions_daq.NI_USB_1);
              if data>3
                  obj.OnStateChange(true)
              else
                  obj.OnStateChange(false)
              end
          end
      end
   end
end
你能帮帮我吗


非常感谢您

问题在于您如何将您的定义为对
addlistener
的回调。触发事件时。这些投入是:

  • 触发事件的对象
  • 包含事件本身信息的某个对象
  • 因此,当您指定回调时,它必须适当地处理这两个输入。在本例中,您正在调用类的一个方法,因此,您实际上向回调传递了三个输入。第一个输入是类的实例,另外两个是由
    addlistener
    提供的

    实际上,您定义的回调是

    @(src, evnt)obj.handleEvnt(src, evnt)
    
    因此,如果您查看方法
    second.handleEvnt
    的函数定义,您将看到您编写的函数需要五个输入

    出现错误的直接原因是
    obj_third
    ,最后一个输入没有通过您提供的回调传递给此函数(因为我们说过它只传递三个输入)

    要解决这个问题,您可以重新编写
    handleEvnt
    方法,只接受三个输入

    function handleEvnt(obj, src, evnt)
    
    或者,您可以重写匿名函数,将其他函数传递给回调函数

    @(src,evnt)obj.handleEvnt(src, evnt, other, arguments)
    

    除了这里介绍的使用匿名函数的方法外,您还可以使用MATLAB允许的任何定义方法。

    请阅读文档。我已经告诉过你好几次了,但你似乎还没有。您尤其需要了解的是,您的匿名函数
    @obj.handleEvnt
    和您的函数定义
    handleEvnt(obj,obj_第一,~,obj_第三,~)不匹配。您的匿名函数只向
    handleEvnt
    传递三个输入,而
    handleEvnt
    预期为5。此处定义了匿名函数@obj.handleEvnt传递的输入数?所有
    addlistener
    回调默认传递两个输入参数(源数据和事件数据),然后,由于您将其称为
    obj.handleEvnt
    ,因此添加当前对象作为第一个输入。所以本质上你的匿名函数看起来是这样的:
    @(src,evnt)obj.handleEvnt(src,evnt)
    。如果您想传递其他参数,您需要这样做:
    @(src,evnt)obj.handleEvnt(src,evnt,other,arguments)
    .PS-您是否理解为什么在addlistener中,回调函数必须定义为匿名函数(可以在下面的“程序文件”中定义)?
    @(src, evnt)obj.handleEvnt(src, evnt)
    
    function handleEvnt(obj,obj_first,~,obj_third,~)
    
    function handleEvnt(obj, src, evnt)
    
    @(src,evnt)obj.handleEvnt(src, evnt, other, arguments)