|
Отладка функций. Инструкция 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 |