0019 - Отладка в C++. Руководство для разработчиков - Загрузка вещественного числа обозначается мнемонико...

Крис Х. Паппас, Уильям Х. Мюррей III. Отладка в C++. Руководство для разработчиков. 2001

 Крис Х. Паппас, Уильям Х. Мюррей III 
.  Отладка в C++. Руководство для разработчиков 
. 2001
. 5-7989-0218-8, 0-07-212519-5
. Бином
. 
. В книге рассматриваются как общие методики и стратегии написания кода и отладки (вплоть до `проектирования, неза
Название: 
Отладка в C++. Руководство для разработчиков
Автор: 
Крис Х. Паппас, Уильям Х. Мюррей III
Год: 
2001
Издательство: 
Бином
Описание: 

В книге рассматриваются как общие методики и стратегии написания кода и отладки (вплоть до `проектирования, независимого от языка`), так и весьма специальные вопросы вроде отладки элементов ActiveX. Некоторые главы книги посвящены чрезвычайно актуальным вопросам, о которых к тому же почти нигде не пишется. Это, например, отладка кода с шаблонами STL или работа с OLE-ориентированными объектами - СОМ и ActiveX. Отдельные части (II и III) отхватывают широкий круг теоретико-практических вопросов отладки в процедурно- и объектно-ориентированных системах. Специфические аспекты C++ освещаются в части IV.

Загрузка вещественного числа обозначается мнемоникой . Если бы первое число было целым, его можно было бы загрузить инструкцией . Это различие является критическим, так как вещественные числа в действительности хранятся в памяти как закодированные целые значения. Если бы не различие между . Так что во время этой операции положение вершины стека не меняется. В этой точке к содержимому стека можно было бы прибавить и целое число, применив мнемонику . Сохраняемое значение является обычным закодированным вещественным числом. Значение можно было бы сохранить и как целое с помощью мнемоники . Управление программой находится в ведении основного микропроцессора. Однако если ему встречается инструкция сопроцессора, управление передается сопроцессору. Перед возвратом управления основному процессору нелишне позаботиться о синхронизации операций оператором . Окно регистров показывает состояние стека сопроцессора. Даже до исполнения инструкции . Под стеком показаны различные флаги, используемые сопроцессором. . Заметьте, что трассировочная стрелка указывает теперь на инструкцию . Теперь исполните две строки кода, чтобы к содержимому стека в . После того, как результат будет записан в переменную . Вы можете видеть записанное в . Правда, в окне регистров на рис. Видите ли вы ее. Остается предположить, что здесь проявляется какой. На стек сопроцессора загружено первое число . Результат сложения записан в . Это будут вещественные числа в диапазоне от О до . Тригонометрическим инструкциям сопроцессора, как и соответствующим функциям библиотеки С, требуется аргумент в радианах. Чтобы градусы перевести в радианы, нам нужно закодировать следующее преобразование. Если все это сработает, мы можем затем увеличить значение угла и сместиться в следующую ячейку таблицы. Короче, нужно организовать цикл. Посмотрим, как можно реализовать логику, которую мы только что сформулировали. Затем мы воспользуемся отладчиком, чтобы обнаружить возможные логические ошибки. Проблемный код Приведенный ниже листинг реализует сформулированный выше алгоритм. Просмотрите его, может быть, вы сразу найдете в нем какие. Первые шесть строк кода сопроцессора, начиная с . Затем результат записывается в массив . Давайте компилируем этот код, запустим его и посмотрим, что печатается в окне консоли. Результаты, как можно было ожидать, не имеют даже отдаленного сходства с правильными. Самое время запустить отладчик и пойти на приступ этих программных проблем. Что это, тангенсы для . Затем исполните еще одну строку кода. Стрелка трассировки на рис. Проверьте снова значение в . Заметьте также, что предыдущая константа опустилась в позицию . Давайте выполним деление, исполнив еще одну строку кода, как показано на рис. Как нетрудно видеть, результат деления неверен. Оба операнда берутся со стека, и вьшолняется деление . Нам нужно просто поменять порядок загрузки операндов. Рассмотрите на рис. Если вы попробуете снова запустить программу, то поймете, что в программе имеются и другие ошибки. Мы должны продолжить пошаговое выполнение кода. . Для угла в О градусов получается правильный результат, как показывает рис. Сделайте еще один шаг, чтобы получить тангенс О градусов. Вот и еще проблема. Мы ожидали, что для О градусов получится тангенс, равный нулю. Отладчик же показывает нам, что инструкция . Небольшое исследование справочной литературы сразу дает ответ. Короче говоря, чтобы получить тангенс, нужно поделить их друг на друга. Просто сразу вслед за . Теперь на вершине стека возвращается правильное значение, как можно видеть на рис. В качестве дальнейшей проверки проделайте несколько циклов, обращая внимание на результаты, появляющиеся на стеке. Вы можете пройти по оставшимся углам, чтобы окончательно убедиться в корректности программы. Как бы там ни было, помните, что . . Угол о градусов правильно переводится в радианы . неправильный результат после исполнения . Корректный результат для тангенса О градусов . . из возвращаемой ею пары . на современных сопроцессорах она может вычисляться для полного диапазона углов и дополняется такиг ми функциями, как . Корректный КОД Исправив ошибки, давайте посмотрим на всю программу в целом. Может быть, вы захотите поэкспериментировать с этой программой. Почему не попробовать, например, вычислить таблицу синусов для углов от О до . Совет разработчику Для других тригонометрических функций сопроцессора, например, . Они возвращают результат непосредственно и работают в игироком диапазоне входных углов. Правильно рассчитанная и сформатированная тригонометрическая таблица Заключение в этой главе были представлены некоторые могцные методики отладки, связанные с использованием микропроцессора и сопроцессора. Вы узнали, как наблюдать за регистрами микропроцессора и ячейками стека сопроцессора в окне . Эта информация использовалась при поиске разнообразных логических ошибок во встроенном коде ассемблера. код, который мы здесь приводим для иллюстрации различных приемов отладки, будет компилироваться и запускаться как в . подавляюгцее большинство приложений . как и программы командной строки на с. эта глава сосредоточивает внимание на довольно прямолинейном процедурно. какая среда — процедурноили объектно. в реальности ваш компилированный код может быть немного меньше, и приложение может выполняться немного быстрее, чем ее объектно. однако пусть даже вы всей душой привязаны к объектно. Отладка на двух машинах внимание. для их нужд было более чем достаточно одного запущенного приложения. пионеры мультипрограммирования, такие как . как пользователи, мы давно привыкли к работе с несколькими прцложениями одновременно. даже сейчас, когда мы пишем эту главу, на наших машинах запущены . но мы пойдем еще дальше. одна машина может показывать экран приложения, вторая . проблема коренится в природе приложения . окно которого расположено поверх других и которому направляются события от клавиатуры и мыши.