Отладка функций. Инструкция pause
В данном разделе мы рассмотрим основной метод отладки, позволяющий устранить большую часть простых ошибок. Этот метод основан на использовании инструкций pause, resume и abort, смысл которых раскрывает табл. 19.
Работа с пакетом Scilab обычно состоит в определении функций, содержащих алгоритмы для решения поставленной задачи. Однако работоспособность той или иной функции нередко оказывается под вопросом ввиду наличия синтаксических ошибок в ее коде.
Пусть требуется вычислить сумму целых чисел от istart до iend. Для этого определим функцию mysum, текст которой (приведен ниже) содержит ошибки, В частности, второй аргумент, "foo", в данном контексте не имеет смысла.
function у = mysum ( istart , iend )
у = sum ( iend : istart , "foo")
endfunction
Следующий фрагмент отражает результат выполнения функции mysum:
-->mysum ( 1 ,10 )
!-- error 44
Wrong argument 2.
at line 2 of function mysum called by :
mysum (1 ,10 )
Для того чтобы обнаружить проблему, поместим инструкцию pause в тело функции mysum:
function у = mysum ( istart , iend ) pause
у = sum ( iend : istart , "foo" ) endfunction
Снова обратимся к функции mysum, передав ей те же самые аргументы:
-->mysum ( 1 , 10 )
Type 'resume' or 'abort' to return to standard level prompt.
-1->
В данный момент мы находимся внутри тела функции mysum. Приглашение "-1->" указывает, что текущему положению соответствует уровень -1 стека вызовов. Теперь мы можем проверить значения переменных istart и iend, введя их имена в консоли:
-l->istart istart =
1.
-1->iend iend =
10.
Чтобы увидеть, к какому результату приведет выполнения той или иной инструкции при текущем значении переменных, скопируем эти инструкцию в консоль:
-1->у = sum ( iend : istart , "foo" )
у = sum ( iend : istart , "foo" )
!-- error 44
Wrong argument 2.
Теперь легко видеть, что источником проблемы является именно введенная строка. Наличие второго аргумента функции sum является в данном случае ошибкой, поэтому удалим его:
-1->у = sum ( iend : istart )
y =
0.
После этой модификации, выполнение функции mysum больше не приводит к ошибкам, однако результат по-прежнему неверен. Можно заметить, что переменные istart и iend перепутаны местами. Проверим результат выполнения более корректного, на наш взгляд, вызова и убедимся, что он совпадает с ожидаемым:
-1->у = sum ( istart : iend )
У =
55.
Для выхода из режима отладки служит инструкция abort, которая прерывает всю цепочку вызовов и возвращает управление командной консоли Scilab.
-l->abort
-->
Вид приглашения "-->" указывает, что теперь мы находимся на нулевом (глобальном) уровне стека вызовов.
Исправим определение функции в соответствии с выводами, сделанными в ходе отладки:
function у = mysum ( istart , iend )
pause
у = sum ( istart : iend ) endfunction
Вызовем функцию снова:
-->mysum ( 1 , 10 )
Type 'resume' or 'abort' to return to standard level prompt.
-l->
Поскольку теперь мы уверены в корректности кода, введем команду resume, которая указывает Scilab продолжить исполнение кода:
-->mysum ( 1 , 10 )
-1-> resume
ans =
55.
Теперь, когда ошибки устранены, можно удалить инструкцию pause из тела функции:
function у = mysum ( istart , iend )
у = sum ( istart : iend ) endfunction
В данном разделе мы могли убедиться в эффективности интерактивной отладки функций с помощью команд pause, resume и abort. Приведенный пример, конечно, существенно упрощен и вряд ли требует отладки для обнаружения вполне очевидных ошибок. Тем не менее, в большинстве случаев использование pause оказывается быстрым и эффективным способом отладки даже в гораздо более сложных ситуациях.