Уровни стека вызовов
Как и в других языках программирования, в Scilab вызовы функций могут быть вложенными, т.е. функция f может вызывать функцию g, а та, в свою очередь, обращаться к функции h и т.д.
Команды, отданные из консоли Scilab, соответствуют нулевому уровню стека вызовов. Инструкции, находящиеся в теле запущенной из консоли функции, составляют первый уровень. Каждый вложенный вызов увеличивает глубину стека на 1, так что текущая глубина равна длине цепочки вложенных вызовов. Функции, представленные в табл. 18, используются для получения информации о состоянии стека вызовов:
whereami возвращает текущее дерево вызовов
where возвращает текущее дерево вызовов в виде матрицы
Таблица 18: Команды Scilab для работы со стеком вызовов.
В следующем примере мы определим три функции f main, f levell и f level2, вызывающих друг друга, и используем функцию whereami, которая отображает текущее состояние стека вызовов:
function у = fmain ( х )
у = 2 * flevell ( х )
endfunction
function у = flevell ( x )
у = 2 * flevel2 ( x )
endfunction
function у = flevel2 ( x )
у = 2 * x
whereami() endfunction
При вызове функции fmain в консоль будет выведено:
-->fmain(1)
whereami called at line 3 of macro flevel2
flevel2 called at line 2 of macro flevell
flevell called at line 2 of macro fmain
ans =
8.
Как можно видеть, отображается три уровня стека вызовов, соответствующие вызванным функциям.
Значения уровней стека вызовов в приведенном примере таковы:
- уровень 0 - глобальный (команды, вводимые в консоли Scilab),
- уровень -1 - в теле функции fmain,
- уровень -2 - в теле функции flevell
- уровень -3 - в теле функции flevel2
Эти уровни вызова отображаются в составе приглашения Scilab при интерактивной отладке функций с использованием инструкции pause и точек останова.