2016-03-17 3 views
0

У меня есть проблема для определения аргументов обратных вызовов и то, что говорит matlab documentation, не помогает мне.Вызов одного метода из другого метода и аргументов обратного вызова

Мой первый класс:

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 

Мой второй класс:

classdef second < handle 
    methods 
     function obj = answerer(obj_first,obj_third) 
     addlistener(obj_first,'Contact',@obj.handleEvnt); 
     end 

     function handleEvnt(obj,obj_first,~,obj_third,~) 
     if obj_first.State 
      obj_third.tracker() 
     end 
     end 
    end 
end 

Мой третий класс:

classdef third < handle 
    methods 
     function tracker(obj) 
      %computations 
     end 
    end 
end 

Здесь ошибка я получаю:

>> o_first=first; 
o_third=third; 
o_second=second(o_first,o_third); 
>> o_first.follower 
Warning: Error occurred while executing callback: 
Undefined variable obj_third. 

Error in second/handleEvnt (line 9) 
      obj_third.tracker() 

Error in second>@(varargin)obj.handleEvnt(varargin{:}) (line 4) 
     addlistener(obj_first,'Contact',@obj.handleEvnt); 

Error in first/OnStateChange (line 12) 
      notify(obj,'Contact'); 

Error in first/follower (line 19) 
        obj.OnStateChange(true) 

> In first>first.OnStateChange at 12 
    In first>first.follower at 19 

Не могли бы Вы помочь мне?

Большое спасибо

+1

Прочтите документацию. Я рассказывал вам это несколько раз, но кажется, что вы этого не сделали. Вам особенно нужно прочитать об [анонимных функциях] (http://www.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html) – Suever

+0

Проблема в том, что ваша анонимная функция '@ obj.handleEvnt' и ваша функция definition 'handleEvnt (obj, obj_first, ~, obj_third, ~)' * не совпадают. Ваша анонимная функция только передает * три * входа в 'handleEvnt' и' handleEvnt' ожидает 5. – Suever

+0

Где определено здесь число входов, которое анонимная функция @ obj.handleEvnt проходит? –

ответ

0

Проблема заключается в том, что вы определяете anonymous function в качестве обратного вызова для addlistener. Когда событие запущено, addlistener will provide your function with two inputs. Эти входы:

  1. Объект, который обстреливал событие
  2. Некоторые event.EventData объект, который содержит информацию о самом событии.

Поэтому, когда вы указываете обратный вызов, должен соответствующим образом обрабатывать эти два входа. В вашем случае вы вызываете метод своего класса, так что вы на самом деле передаете три входа для вашего обратного вызова. Первый вход - это экземпляр класса, а два других - это то, что предоставляется addlistener.

Таким образом, в сущности, ваш обратный вызов, который вы определяете этот

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

Так что, если вы посмотрите на определение функции для метода second.handleEvnt, вы увидите, что вы написали его ожидать пять входы.

function handleEvnt(obj,obj_first,~,obj_third,~) 

Непосредственная причина, по которой вы получаете сообщение об ошибке, потому что obj_third и последний вход в не передается этой функции обратного вызова, который вы предоставили (так как мы сказали, что она проходит только три входа).

Чтобы исправить это, вы можете либо переписать свой метод handleEvnt, чтобы принять только три входа.

function handleEvnt(obj, src, evnt) 

Или вы можете переписать свою анонимную функцию для передачи дополнительных функций для обратного вызова.

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

В дополнение к методам, представленным здесь, используя анонимные функции, вы можете также использовать любой из способов, MATLAB позволяет callback functions быть определены.

Смежные вопросы