Отладка функций. Инструкция 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 оказывается быстрым и эффективным способом отладки даже в гораздо более сложных ситуациях.

© vse-o-scilab

Сделать бесплатный сайт с uCoz