Лекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)
Скачать 319.62 Kb.
|
Методы и инструменты отладкиОтладка — это часто тяжёлая и утомительная задача. Способности программиста к отладке — это, по-видимому, важнейший фактор в обнаружении источника проблемы, но сложность отладки сильно зависит от используемого языка программирования и инструментов, в частности, отладчиков. Так же полезными инструментами в руках программиста могут оказаться: Профилировщики. они позволят определить сколько времени выполняется тот или иной участок кода, а анализ покрытия позволит выявить неисполняемые участки кода. API логгеры позволяют программисту отследить взаимодействие программы и Windows API при помощи записи сообщений Windows в лог. Дизассемблеры позволят программисту посмотреть ассемблерный код исполняемого файла Сниферы помогут программисту проследить сетевой трафик генерируемой программой Сниферы аппаратных интерфейсов позволят увидеть данные которыми обменивается система и устройство. Логи системы. Также могут быть полезными следующие приёмы отладки: Для быстрого просмотра переменной без установки контрольной точки измените свойство Caption формы, выводя в него значение интересующей вас переменной. Другой способ — поместить на форму компонент Label, поскольку это очень просто. Измените текст метки, чтобы показать значение переменной или любую другую информацию, которую вы хотите показать. Чтобы временно замедлить выполнение своей программы (например, для просмотра эффектов программы в замедленном темпе), установите условную контрольную точку. Она замедлит выполнение программы, поскольку в ней будет проверяться условие останова. Во время выполнения программы пользуйтесь диалоговой панелью Evaluate/Modify, чтобы временно изменять значение переменной. Это позволит вам увидеть, как влияют на поведение программы различные значения без многократной перекомпиляции кода. Используйте временные переменные для разбиения длинных выражений или вложенных вызовов методов, чтобы можно было исследовать результаты по частям. Отладка в MS Visual StudioЗапуск основных инструментов отладки осуществляется из меню «Отладка». Следуеет обратить внимание на следующие инструменты: • Пошаговое исполнение/Выполнить до курсора • Переключить точку останова • Шаг/Шаг внутрь • Просмотр переменных/Локальные/Добавить в наблюдаемые Для возможности отладки следует определённым образом настроить проект (по умолчанию эти настройки обычно сделаны в проектах Visual Studio): o Сервис – параметры компилятора – настройки – компоновщик – генерировать отладочную информацию o Проект – параметры проекта – компилятор – компоновщик – генерировать отладочную информацию Знакомство со Структурированными типами языка сиМассивыМассив - это совокупность элементов данных одного и того же типа, объединенных общим именем и расположенных в непрерывной области памяти ЭВМ так, что к каждому элементу массива можно получить доступ, зная его порядковый номер или индекс. Описание массиваОписание массива производится с помощью обычного оператора описания, при этом за именем массива в квадратных скобках должна быть записана целая положительная константа или константное выражение, равное размеру этого массива, то есть максимально возможному числу элементов. Пример: int a[100], ab[2*40]; double c[200], speed[100]; char name[20]; Замечание: в стандарте Си99 (C99, 2009 г.) разрешено определение локальных массивов переменной длины. Имя массива без квадратных скобок за ним имеет значение, равное адресу первого элемента этого массива. Имя массива с квадратными скобками, в которых записано индексное выражение целого типа, обозначает значение соответствующего элемента массива. В языке Си нумерация элементов массива начинается с нуля, то есть для массива d из пяти элементов допустимы следующие обозначения: d[0], d[1], d[2], d[3], d[4]. Индексированные переменные могут использоваться в любых выражениях в тех местах, где допускается применение переменных соответствующих типов. При работе с индексированными переменными необходимо внимательно следить за тем, чтобы индексы не вышли из допустимого диапазона, определяемого описаниями массивов. Дело в том, что компилятор не проверяет факт выхода индексов за границы массива, а при ошибочном занесении данных за пределы массива может запортиться нужная информация и, скорее всего, компьютер зависнет. Ввод-вывод массиваЯзык Си не имеет встроенных средств для ввода-вывода массива целиком, поэтому массив вводят и выводят поэлементно с помощью циклов, как, например, в следующей программе: #include int main(void) { double a[100]; int n, i; prin_s("Введите количество чисел n = "); scanf_s ("%d", &n); if( n>(sizeof a)/sizeof(double) ) { printf("Слишком много элементов\n"); return 1; } for(i=0; i { printf_s("a[%d] = ", i); scanf_s("%lf", &a[i]); } /* Операторы, обрабатывающие массив */ } Инициализация массиваИнициализация - присвоение значений вместе с описанием данных. Ранее была рассмотрена инициализация простых переменных, например: int a = 5; Для инициализации массива за его именем располагают знак присваивания и список инициализации, который представляет собой заключенные в фигурные скобки и разделенные запятыми инициализирующие значения. Ниже приведен пример инициализации массива: int a[4] = { 15, 21, 1, 304 }; индексы элементов -> 0 1 2 3 Констант в списке инициализации должно быть не больше, чем объявленный размер массива. Если их меньше, то элементы для которых нет констант обнуляются. Для инициализируемого массива допускается вообще не указывать размер. В этом случае размер массива определяется по количеству констант, например по описанию int c[] = { 1, 15, 18, 11, 20 }; транслятор выделит 20 байт для хранения массива из 5 целых четырёхбайтовых чисел. Частный случай инициализации массива - инициализация строк. Массив символов может быть проинициализирован стандартным образом: char s[] = { 'A', 'B', 'C', 'D' }; Строка символов дополнительно должна завершаться нуль-символом. char s[] = { 'A', 'B', 'C', 'D', '\0' }; В связи с тем, что инициализацию строк приходится организовывать довольно часто, язык Си предусматривает для этого упрощенную форму записи: char s[] = "ABCD"; В этом случае нуль-символ автоматически дописывается в конец строки. Два последних примера инициализации строки совершенно эквивалентны. |