2016-03-04 2 views
1

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

Когда я

function[]=foo() 
A=1; 

uicontrol('style','pushbutton','callback','A=bar(A);') 

function[OUT]=bar(IN) 
OUT=IN+1; 

Я получаю сообщение об ошибке:

Undefined function 'bar' for input arguments of type 'double'. 

Error while evaluating uicontrol Callback` 

если foo является скриптом и bar определен в файле bar.m он работает. Мне кажется, что обратные вызовы используют в переменных по умолчанию в рабочей области MATLAB и scripts/fuctions в текущем рабочем каталоге. Как я могу получить доступ к переменным, определенных в вызывающей функции (здесь переменной A) и функции, вложенные в вызывающей функции (здесь функции bar)

+0

Я прочитал ваш вопрос 5 раз, и я все еще не могу понять, что вы делаете. Можете ли вы немного расширить свою рекпланацию того, что вы делаете, что она делает и что вам не нравится? –

+1

Я пытаюсь вызвать функции и переменные, определенные внутри функции, создавшей графический интерфейс. – Crowley

ответ

2

Для определения обратных вызовов, я нашел самый надежный подход использует anonymous functions. При этом, если bar является вложенной функцией от foo, то он уже имеет доступ к A и может изменять A.

function = foo() 
    A = 1; 

    uicontrol('style', 'pushbutton', 'callback', @(s,e)bar()) 

    % This is a nested function that already has access to A 
    function bar() 
     A = A + 1; 
    end 

    % Let's call bar here to demonstrate it updates A 
    bar(); 
    disp(A); 
end 

Кроме того, ваши обратные вызовы не могут фактически передавать выходные данные в рабочее пространство элемента управления, для которого они являются обратным вызовом. Если вы хотите вернуть результат, вы либо захотите: 1) сохранить результат в UserData графического объекта, 2) использовать вложенную подфункцию, как мы показали, или 3) передать дескриптор настраиваемого объекта дескриптора в callback (classdef object < handle)

+0

Это именно то, что я искал. – Crowley

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