MathCAD — это просто! Часть 28. Отладка проектов в MathCAD — это тоже несложно
Если вы еще помните, на чем закончился наш разговор в предыдущий раз, то это очень и очень хорошо — значит, у вас, похоже, неплохая память. Впрочем, даже если и не помните, то это вовсе и не означает, что память у вас какая-нибудь не такая, как ей следовало бы быть — у каждого в жизни есть миллионы вещей, помнить которые важнее (и гораздо полезнее!), чем то, чем кончилась предшествующая данной статья в серии "MathCAD — это просто!". Да и мне, в общем-то, совсем не сложно будет вам напомнить, на чем мы с вами в прошлый раз остановились.
А остановились мы с вами на том, что отладка — это удобный способ избавить проекты в MathCAD'е, связанные с какими-нибудь более-менее серьезными вычислениями, от разнообразных ошибок, которые имеют свойство возникать в них буквально на ровном месте. Поговорив о том, как включать отладочный режим (Debug Mode, если по-английски), мы с вами, собственно говоря, и остановились. Но напоследок я успел обронить, что в MathCAD'е для отладки документа требуется некоторая его предварительная подготовка. Возможно, вы не обратили внимания на эту фразу, но она, на самом деле, имеет очень большое значение. К сожалению, это действительно так — для того, чтобы отлаживать в MathCAD'е программы или просто какие- либо занимающие существенное время вычисления, требуется вначале немного модифицировать исходный код программы или рабочую область, в которой располагаются все наши вычислительные операторы. Если вы отлаживали когда-нибудь приложения в специализированных средах разработки программного обеспечения, то можете найти, что это, мягко говоря, не слишком удобно. Ведь гораздо проще и удобнее просто перевести выполнение программы в отладочный режим и в нужный момент прервать ее выполнение, чтобы просмотреть значения переменных и выяснить, на каком именно этапе возникает ошибка. Что ж, здесь сложно спорить с тем, что быстро выставить точки останова программы в тех же Delphi или Visual Studio удобнее, чем вписывать специальные отладочные функции в сам текст программы, однако, как поется в известной песне, "этот мир придуман не нами". MathCAD, к сожалению, тоже придуман и создан не нами (хотя вряд ли здесь есть о чем действительно сожалеть), и наверняка решение разработчиков этой мощной математической среды организовать отладку именно таким довольно-таки экзотическим с точки зрения принятой практики программирования способом имеет под собой довольно веские инженерные основания, связанные с внутренней архитектурой MathCAD'а. Поэтому вместо того, чтобы предаваться мечтами о том, как было бы хорошо, если бы все в этом мире было идеально, давайте лучше пойдем по тому пути, по которому эволюция заставила идти все живое на нашей планете — то есть приспособимся к внешним условиям и будем отлаживать наши творения так, как нам позволили создатели MathCAD'а. В конце концов, это все-таки лучше, чем полное отсутствие средств отладки.
Отладочные функции: trace
Функции, которые должны включаться в программу или в документ MathCAD, чтобы их можно было отлаживать, требуются там для того, чтобы останавливать программу в нужные моменты времени и выводить в специальное отладочное окно, о котором мы говорили в предыдущий раз, значения интересующих нас переменных. В общем-то, как я уже говорил в той же самой предыдущей статье цикла, именно в этом и заключается процесс отладки, а потому, кроме знания того, как работают эти функции, от нас не требуется никаких специфических знаний для того, чтобы мы могли успешно проводить отладку программ или документов в этой мощной математической среде. Хочу хоть немного вас обрадовать, чтобы хоть как-то извиниться за запугивание неудобством отладки в MathCAD'е. Запоминать много функций для того, чтобы проводить отладку, от вас не потребуется. Отладочных функции всего две, а потому у нас будет возможность поговорить о каждой из них довольно-таки подробно.
Итак, первая из этой "сладкой парочки" функция называется trace. По принятой в MathCAD'е традиции ее название пишется со строчной буквы, и, как вы знаете, если написать ее с прописной, ничего толкового из этого не выйдет. Что же делает эта функция? Догадаться о ее функциональности несложно, если вспомнить, как по-английски называется то окно, в которое выводится отладочная информация в MathCAD'е. Оно называется Trace Window. Думаю, вы уже уловили связь и логику — действительно, функция trace используется именно для того, чтобы выводить отладочную информацию в это самое окно. У нее может быть любое количество аргументов — от одного до сотен, хотя, конечно, реально использовать большое количество аргументов вряд ли кто-то будет — это, скажем прямо, не слишком целесообразно. Если у функции один аргумент, то именно его значение она выведет в специальном отладочном окне. Если же аргументов несколько, то их используют в следующем виде: trace("x = {0}, y = {1}", x, y). Здесь номера 0, 1 и т.д. означают порядковую позицию соответствующей переменной в списке аргументов функции trace, следующих за самым первым (или, судя по нумерации, минус первым) аргументом. В результате своей работы функция trace с таким набором аргументов выведет строку вида "x = 0.2, y = 0.03" (естественно, без кавычек), где вместо 0.2 и 0.03 будут стоять соответствующие реальные значения указанных переменных, которые те принимают в ходе выполнения программы.
Что ж, давайте посмотрим на скриншот с примером конкретной программы, в которой используется отладка. Как вы можете легко увидеть, в ней в цикле вычисляется значение суммы квадратов целых (я бы даже сказал, натуральных) чисел от одного до пяти. Конечно, вы можете сказать, что здесь нечего особенно отлаживать, и, само собой, будете совершенно и безоговорочно правы. Но ведь мы с вами только учимся грамотно выполнять отладку, а учиться лучше на простых примерах — не нужно быть Макаренко, чтобы понимать эту простую истину. Поэтому давайте обратим внимание на нижнюю часть окна среды MathCAD, в которой расположилось окно с отладочной информацией — то самое Trace Window, которое я совсем недавно здесь вспоминал. В этом окне вы можете увидеть, что программа на каждой итерации исправно выдает значение переменной x, в которую и записывается сумма якобы интересующих нас с вами сейчас квадратов. Правда, здесь есть маленькая — совсем-совсем небольшая — тонкость. Дело в том, что, когда вы, набрав эту программу в MathCAD'е, переключитесь в отладочный режим (а без него отладка невозможна), то никаких значений в отладочном окне не появится. И это, заметьте, не какой-то "глюк" MathCAD'а, а вполне закономерное и нормальное поведение этой математической среды. Почему так? На самом деле, все очень просто. Дело в том, что для того, чтобы в отладочном окне появилась какая бы то ни было информация, программу требуется выполнить еще раз, но уже в отладочном режиме. Поэтому требуется убрать знак равенства после программы, а после перехода в отладочный режим установить его по-новому, чтобы программа выполнилась в отладочном режиме, и мы могли увидеть значения переменных там, где им и положено быть.
Отладочные функции: pause
Согласитесь, что, хотя просмотр значений переменных в процессе отладки программы — это и важно, но все-таки еще было бы довольно неплохо иметь возможность остановить выполнение программы тогда, когда это необходимо. Можно ли это сделать при отладке в MathCAD'е? Наверное, было бы удивительно, если бы разработчики этой мощной математической среды, реализовав в ней множество гораздо более сложных и масштабных вещей, отказали ее пользователям в такой простенькой, по своей сути, возможности. И действительно, в арсенале пользователя MathCAD имеется функция, как нельзя лучше подходящая для того, чтобы останавливать программу при отладке. О ней мы с вами сейчас, конечно же, и поговорим. Называется она весьма логично и естественно — pause. Когда выполнение программы доходит до этой функции, то оно останавливается, и вы можете спокойно просмотреть все, что вас интересует, в отладочном окне. Аналогичным образом можно остановить и процесс вычислений в рабочей области главного окна среды MathCAD. Параметров у этой функции может быть ровно столько же, сколько и у только что рассмотренной нами функции trace. Смысл их, собственно говоря, полностью идентичен смыслу параметров функции trace, а потому и разбирать отдельно мы с вами их не будем. На скриншоте вы можете увидеть пример использования этой функции.
Возникает вполне логичный и закономерный вопрос: если мы приостановили выполнение программы, можем ли мы сказать среде продолжить его с того места, на котором была сделана пауза? Вопрос, в общем-то, как вы, наверное, догадываетесь, имеет риторический характер, поскольку сказать "нет" в ответ на него было бы равносильно признанию полной бесполезности функции pause. А если функция бесполезна, зачем вообще было включать ее в MathCAD? Поэтому pause — это все-таки полезная функция, а продолжить выполнение программы с того места, на котором мы его остановили, очень и очень просто. Для этого на панели Debug, которую мы с вами уже успели немного обсудить в предыдущей статье цикла, существует специальная кнопка Resume. Она выглядит как кнопка для начала проигрывания звукозаписи или видео на предназначенных для этого устройствах, т.е. обозначена характерным треугольником. Обратите внимание на следующем скриншоте, что при каждом нажатии кнопки Resume выполнение программы продолжается ровно до тех пор, пока она вновь не натыкается на функцию pause. После этого, чтобы опять продолжить выполнение программы, нам снова придется прибегнуть к помощи этой волшебной кнопки.
Кстати, выполнение программы можно не только продолжить, но и вовсе прервать. Здесь, опять-таки, полная аналогия с проигрыванием музыки или видео, которая, как видите, заключается не только в сходстве кнопок. Функция pause устанавливает нашу программу на паузу, из которой потом можно продолжить ее выполнение. В то же время, иногда бывает нужно перейти к выполнению программы сначала или просто отменить выполнение — чтобы, например, внести изменения в исходный код. Тогда рядом с кнопкой Resume поищите кнопку Interrupt (она выполнена в виде классически обозначающего остановку проигрывания квадрата). Именно она поможет вовсе остановить выполнение программы в тех случаях, когда вам нужно именно это. После остановки MathCAD подсветит программу красным цветом и выдаст подсказку, что для того, чтобы она была выполнена, нужно нажать F9.
Выводы
Ну вот, про отладку мы, как мне кажется, в общем-то, и поговорили. Хочу еще раз обратить ваше внимание на тот факт, что, хотя в конце я говорил только об отладке программ, на самом-то деле совершенно аналогичным образом можно производить отладку и тех документов в среде MathCAD, в которых вы вовсе не прибегаете ни к какому программированию. Делать это, в общем-то, ничуть не сложнее, чем отлаживать именно программы, да и пользы, пожалуй, не меньше, так что не стоит брезговать отладкой даже в том случае, если вы предпочитаете обходиться в MathCAD'е без программирования. И, как видите, в отладке действительно нет ничего концептуально сложного. Хотя, конечно, когда на практике возникает необходимость поиска каких-либо ошибок, то здесь уже не все так просто, поскольку, даже зная значения разных переменных на различных этапах выполнения программы или просто каких-либо расчетов, не всегда можно достаточно быстро определить, что именно является причиной ошибки. Но "чувство ошибок", помогающее находить их интуитивно, приходит с опытом, а потому я в очередной раз призываю вас не жалеть времени на практические занятия с MathCAD'ом. Здесь тот самый случай, когда лучше (причем намного!) один раз попробовать самостоятельно, чем сто, а то даже и двести, триста — да что там, тысячу — раз прочитать обо всем этом в газете. Пусть чтение интересно и тоже, конечно же, не бесполезно, но, поверьте, практика полезнее стократ.
SF, spaceflyer@tut.by
А остановились мы с вами на том, что отладка — это удобный способ избавить проекты в MathCAD'е, связанные с какими-нибудь более-менее серьезными вычислениями, от разнообразных ошибок, которые имеют свойство возникать в них буквально на ровном месте. Поговорив о том, как включать отладочный режим (Debug Mode, если по-английски), мы с вами, собственно говоря, и остановились. Но напоследок я успел обронить, что в MathCAD'е для отладки документа требуется некоторая его предварительная подготовка. Возможно, вы не обратили внимания на эту фразу, но она, на самом деле, имеет очень большое значение. К сожалению, это действительно так — для того, чтобы отлаживать в MathCAD'е программы или просто какие- либо занимающие существенное время вычисления, требуется вначале немного модифицировать исходный код программы или рабочую область, в которой располагаются все наши вычислительные операторы. Если вы отлаживали когда-нибудь приложения в специализированных средах разработки программного обеспечения, то можете найти, что это, мягко говоря, не слишком удобно. Ведь гораздо проще и удобнее просто перевести выполнение программы в отладочный режим и в нужный момент прервать ее выполнение, чтобы просмотреть значения переменных и выяснить, на каком именно этапе возникает ошибка. Что ж, здесь сложно спорить с тем, что быстро выставить точки останова программы в тех же Delphi или Visual Studio удобнее, чем вписывать специальные отладочные функции в сам текст программы, однако, как поется в известной песне, "этот мир придуман не нами". MathCAD, к сожалению, тоже придуман и создан не нами (хотя вряд ли здесь есть о чем действительно сожалеть), и наверняка решение разработчиков этой мощной математической среды организовать отладку именно таким довольно-таки экзотическим с точки зрения принятой практики программирования способом имеет под собой довольно веские инженерные основания, связанные с внутренней архитектурой MathCAD'а. Поэтому вместо того, чтобы предаваться мечтами о том, как было бы хорошо, если бы все в этом мире было идеально, давайте лучше пойдем по тому пути, по которому эволюция заставила идти все живое на нашей планете — то есть приспособимся к внешним условиям и будем отлаживать наши творения так, как нам позволили создатели MathCAD'а. В конце концов, это все-таки лучше, чем полное отсутствие средств отладки.
Отладочные функции: trace
Функции, которые должны включаться в программу или в документ MathCAD, чтобы их можно было отлаживать, требуются там для того, чтобы останавливать программу в нужные моменты времени и выводить в специальное отладочное окно, о котором мы говорили в предыдущий раз, значения интересующих нас переменных. В общем-то, как я уже говорил в той же самой предыдущей статье цикла, именно в этом и заключается процесс отладки, а потому, кроме знания того, как работают эти функции, от нас не требуется никаких специфических знаний для того, чтобы мы могли успешно проводить отладку программ или документов в этой мощной математической среде. Хочу хоть немного вас обрадовать, чтобы хоть как-то извиниться за запугивание неудобством отладки в MathCAD'е. Запоминать много функций для того, чтобы проводить отладку, от вас не потребуется. Отладочных функции всего две, а потому у нас будет возможность поговорить о каждой из них довольно-таки подробно.
Итак, первая из этой "сладкой парочки" функция называется trace. По принятой в MathCAD'е традиции ее название пишется со строчной буквы, и, как вы знаете, если написать ее с прописной, ничего толкового из этого не выйдет. Что же делает эта функция? Догадаться о ее функциональности несложно, если вспомнить, как по-английски называется то окно, в которое выводится отладочная информация в MathCAD'е. Оно называется Trace Window. Думаю, вы уже уловили связь и логику — действительно, функция trace используется именно для того, чтобы выводить отладочную информацию в это самое окно. У нее может быть любое количество аргументов — от одного до сотен, хотя, конечно, реально использовать большое количество аргументов вряд ли кто-то будет — это, скажем прямо, не слишком целесообразно. Если у функции один аргумент, то именно его значение она выведет в специальном отладочном окне. Если же аргументов несколько, то их используют в следующем виде: trace("x = {0}, y = {1}", x, y). Здесь номера 0, 1 и т.д. означают порядковую позицию соответствующей переменной в списке аргументов функции trace, следующих за самым первым (или, судя по нумерации, минус первым) аргументом. В результате своей работы функция trace с таким набором аргументов выведет строку вида "x = 0.2, y = 0.03" (естественно, без кавычек), где вместо 0.2 и 0.03 будут стоять соответствующие реальные значения указанных переменных, которые те принимают в ходе выполнения программы.
Что ж, давайте посмотрим на скриншот с примером конкретной программы, в которой используется отладка. Как вы можете легко увидеть, в ней в цикле вычисляется значение суммы квадратов целых (я бы даже сказал, натуральных) чисел от одного до пяти. Конечно, вы можете сказать, что здесь нечего особенно отлаживать, и, само собой, будете совершенно и безоговорочно правы. Но ведь мы с вами только учимся грамотно выполнять отладку, а учиться лучше на простых примерах — не нужно быть Макаренко, чтобы понимать эту простую истину. Поэтому давайте обратим внимание на нижнюю часть окна среды MathCAD, в которой расположилось окно с отладочной информацией — то самое Trace Window, которое я совсем недавно здесь вспоминал. В этом окне вы можете увидеть, что программа на каждой итерации исправно выдает значение переменной x, в которую и записывается сумма якобы интересующих нас с вами сейчас квадратов. Правда, здесь есть маленькая — совсем-совсем небольшая — тонкость. Дело в том, что, когда вы, набрав эту программу в MathCAD'е, переключитесь в отладочный режим (а без него отладка невозможна), то никаких значений в отладочном окне не появится. И это, заметьте, не какой-то "глюк" MathCAD'а, а вполне закономерное и нормальное поведение этой математической среды. Почему так? На самом деле, все очень просто. Дело в том, что для того, чтобы в отладочном окне появилась какая бы то ни было информация, программу требуется выполнить еще раз, но уже в отладочном режиме. Поэтому требуется убрать знак равенства после программы, а после перехода в отладочный режим установить его по-новому, чтобы программа выполнилась в отладочном режиме, и мы могли увидеть значения переменных там, где им и положено быть.
Отладочные функции: pause
Согласитесь, что, хотя просмотр значений переменных в процессе отладки программы — это и важно, но все-таки еще было бы довольно неплохо иметь возможность остановить выполнение программы тогда, когда это необходимо. Можно ли это сделать при отладке в MathCAD'е? Наверное, было бы удивительно, если бы разработчики этой мощной математической среды, реализовав в ней множество гораздо более сложных и масштабных вещей, отказали ее пользователям в такой простенькой, по своей сути, возможности. И действительно, в арсенале пользователя MathCAD имеется функция, как нельзя лучше подходящая для того, чтобы останавливать программу при отладке. О ней мы с вами сейчас, конечно же, и поговорим. Называется она весьма логично и естественно — pause. Когда выполнение программы доходит до этой функции, то оно останавливается, и вы можете спокойно просмотреть все, что вас интересует, в отладочном окне. Аналогичным образом можно остановить и процесс вычислений в рабочей области главного окна среды MathCAD. Параметров у этой функции может быть ровно столько же, сколько и у только что рассмотренной нами функции trace. Смысл их, собственно говоря, полностью идентичен смыслу параметров функции trace, а потому и разбирать отдельно мы с вами их не будем. На скриншоте вы можете увидеть пример использования этой функции.
Возникает вполне логичный и закономерный вопрос: если мы приостановили выполнение программы, можем ли мы сказать среде продолжить его с того места, на котором была сделана пауза? Вопрос, в общем-то, как вы, наверное, догадываетесь, имеет риторический характер, поскольку сказать "нет" в ответ на него было бы равносильно признанию полной бесполезности функции pause. А если функция бесполезна, зачем вообще было включать ее в MathCAD? Поэтому pause — это все-таки полезная функция, а продолжить выполнение программы с того места, на котором мы его остановили, очень и очень просто. Для этого на панели Debug, которую мы с вами уже успели немного обсудить в предыдущей статье цикла, существует специальная кнопка Resume. Она выглядит как кнопка для начала проигрывания звукозаписи или видео на предназначенных для этого устройствах, т.е. обозначена характерным треугольником. Обратите внимание на следующем скриншоте, что при каждом нажатии кнопки Resume выполнение программы продолжается ровно до тех пор, пока она вновь не натыкается на функцию pause. После этого, чтобы опять продолжить выполнение программы, нам снова придется прибегнуть к помощи этой волшебной кнопки.
Кстати, выполнение программы можно не только продолжить, но и вовсе прервать. Здесь, опять-таки, полная аналогия с проигрыванием музыки или видео, которая, как видите, заключается не только в сходстве кнопок. Функция pause устанавливает нашу программу на паузу, из которой потом можно продолжить ее выполнение. В то же время, иногда бывает нужно перейти к выполнению программы сначала или просто отменить выполнение — чтобы, например, внести изменения в исходный код. Тогда рядом с кнопкой Resume поищите кнопку Interrupt (она выполнена в виде классически обозначающего остановку проигрывания квадрата). Именно она поможет вовсе остановить выполнение программы в тех случаях, когда вам нужно именно это. После остановки MathCAD подсветит программу красным цветом и выдаст подсказку, что для того, чтобы она была выполнена, нужно нажать F9.
Выводы
Ну вот, про отладку мы, как мне кажется, в общем-то, и поговорили. Хочу еще раз обратить ваше внимание на тот факт, что, хотя в конце я говорил только об отладке программ, на самом-то деле совершенно аналогичным образом можно производить отладку и тех документов в среде MathCAD, в которых вы вовсе не прибегаете ни к какому программированию. Делать это, в общем-то, ничуть не сложнее, чем отлаживать именно программы, да и пользы, пожалуй, не меньше, так что не стоит брезговать отладкой даже в том случае, если вы предпочитаете обходиться в MathCAD'е без программирования. И, как видите, в отладке действительно нет ничего концептуально сложного. Хотя, конечно, когда на практике возникает необходимость поиска каких-либо ошибок, то здесь уже не все так просто, поскольку, даже зная значения разных переменных на различных этапах выполнения программы или просто каких-либо расчетов, не всегда можно достаточно быстро определить, что именно является причиной ошибки. Но "чувство ошибок", помогающее находить их интуитивно, приходит с опытом, а потому я в очередной раз призываю вас не жалеть времени на практические занятия с MathCAD'ом. Здесь тот самый случай, когда лучше (причем намного!) один раз попробовать самостоятельно, чем сто, а то даже и двести, триста — да что там, тысячу — раз прочитать обо всем этом в газете. Пусть чтение интересно и тоже, конечно же, не бесполезно, но, поверьте, практика полезнее стократ.
SF, spaceflyer@tut.by
Компьютерная газета. Статья была опубликована в номере 43 за 2008 год в рубрике soft