вернуть НЕ выход из функции должным образом в MATLAB - PullRequest
1 голос
/ 31 марта 2011

Я запускаю рекурсивную функцию, которая ищет объект в комнате.Этот код работает в сочетании с другим процессом, по сути выполняющим тот же код.Первое, что делает код, это проверяет, нашел ли другой объект объект и, если это так, он должен выйти из функции.Когда я делаю проверку, чтобы увидеть, нашел ли другой процесс объект, если он имеет, я использую «возврат», чтобы выйти из этой функции, в это время он должен перейти на другие строки кода ... Однако для некоторыхпричина, по которой он не срабатывает полностью, а просто запускает функцию снова и снова.

Любые идеи о том, как я могу заставить его вспыхнуть?

Я бы и мог предоставить код, ноэто довольно длинный

РЕДАКТИРОВАТЬ

Родительский скрипт

!matlab -r "zz_Mock_ROB2_Find" & distT = 0.3; 
Rob1_ObjFound = 0; 
matrix = search_TEST_cam(rob, vid, 0.3, XYpos, 'north', stack, matrix, 0); 
disp('I"M OUT')

Рекурсивный код

function matrix = search_TEST_cam(rob1, vid, distT, startingPos, currentDir, stack, matrix, bT) 
Rob1_ObjFound = 0; 
Rob2_ObjFound = 0; 
try 
    load('Rob2_ObjFound.mat', 'Rob2_ObjFound'); 
catch 
end 

if(Rob2_ObjFound == 1) 
    setDriveWheelsCreate(rob1, 0, 0); 
    disp('ROB_2 FOUND THE OBJECT') 
    pause(0.5) 
    BeepRoomba(rob1) 
    pause(0.5) 
    setDriveWheelsCreate(rob1, 0, 0); 
    return 
end 

Ответы [ 2 ]

0 голосов
/ 31 марта 2011

Трудно сказать, не видя ваш код, но я сомневаюсь, что это проблема с оператором RETURN .Скорее всего, это проблема с настройкой рекурсии.Если ваша рекурсивная функция вызывала себя несколько раз, то, когда вы, наконец, вызовете инструкцию RETURN, она вернет управление из текущей функции в стеке вызывающей функции (т. Е. Предыдущий вызов вашей рекурсивной функции).Я предполагаю, что вызывающая функция не останавливает рекурсию должным образом и заканчивает тем, что снова вызывает себя, продолжая рекурсию.

Мой совет: проверьте условия выхода для вашей рекурсивной функции, чтобы убедиться, что, когда объектнайден и самый последний звонок возвращается, каждый предыдущий звонок должным образом информируется о том, что он также должен вернуться.

0 голосов
/ 31 марта 2011

Используйте break, чтобы выйти из цикла for или while и завершить выполнение, т. Е. Операторы после этого игнорируются. Например,

for i=1:5
    if i==3
        break
    else
        fprintf('%u,',i)
    end
end

выводит 1,2, и код завершается, когда i=3. Если у вас есть вложенные циклы, break только выйдет из текущего цикла и перейдет к родительскому циклу.

Чтобы пропустить только текущую итерацию и перейти к следующей, используйте continue. Используя тот же пример,

for i=1:5
    if i==3
        continue
    else
        fprintf('%u,',i)
    end
end

выходы 1,2,4,5,.

Использование return в функции просто возвращает управление родительской функции / скрипту, который ее вызвал.

Кажется, вы используете неправильный код в своем коде. Однако трудно сказать, не зная, как вы их используете. Во всяком случае, вы можете попробовать один из этих трех и посмотреть, если это имеет значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...