Отладка программы
Термин «отладка» означает исправление ошибок в программе и обеспечение ее правильной работы. Возникающие в процессе создания программы ошибки классифицируются следующим образом:
1. Синтаксические ошибки.
2. Ошибки периода выполнения программы.
3. Логические ошибки.
Delphi позволяет легко найти и исправить ошибки, возникающие как во время компиляции (синтаксические ошибки), так и во время выполнения. В состав интегрированной среды разработчика Delphi входит мощный и гибкий отладчик, который позволяет построчно выполнять программу, анализируя при этом выражения и модифицируя значения переменных. Этот отладчик встроен в среду Delphi, благодаря чему можно редактировать, компилировать и отлаживать программы не выходя из Delphi.
Синтаксические ошибки
Ошибки на этапе компиляции (или синтаксические ошибки) возникают в том случае, если не описана переменная, передается неправильное количество параметров подпрограмме, не совпадают типы переменной и выражения в операторе присваивания, операторы не удовлетворяют требованиям языка Object Pascal и т.п.
Правильные дроби. Неправильные дроби. 5 класс.
Object Pascal имеет строгие правила по сравнению с другими языками, поэтому, исправив синтаксические ошибки, можно считать выполненной основную часть отладки.
На рисунке 4.1 изображено окно редактора кода в тот момент, когда программа была запущена на компиляцию и компилятор обнаружил синтаксические ошибки. Напомним, что запуск на компиляцию и выполнение программы осуществляется командой Выполнить/Выполнить (функциональная клавиша F9), а запуск программы только на компиляцию можно осуществить при помощи команды Проект/Компилировать < имя файла проекта >(комбинация клавиш Ctrl+F9). В нижней части редактора кода содержатся сообщения об ошибках. Сообщение начинается словом [Ошибка], заключенным в квадратные скобки, далее идет имя файла проекта, затем в круглых скобках указывается номер строки программы, где была допущена ошибка и, в заключение, после двоеточия идет текст, поясняющий смысл допущенной ошибки.
Рисунок 4.1 — Сообщение компилятора о синтаксической ошибке
Исправление ошибок следует начинать с первой, поскольку часто одна ошибка является причиной появления других ошибок. Исправив первую ошибку, следует снова запустить программу на компиляцию. Во многих случаях исправление только одной ошибки существенно уменьшает общее количество сообщений об ошибках.
Ошибки периода выполнения программы
Другой возможный тип ошибок — это ошибки этапа выполнения (или семантические ошибки). Это происходит в том случае, если транслируется корректная программа, а затем при ее выполнении предпринимается попытка выполнить недопустимое действие, например, открыть несуществующий файл для ввода или выполнить деление на 0. В этом случае Delphi генерирует так называемое исключение (Exception) — рисунок 4.2.
❓ Обязательно к просмотру начинающему в Arduino IDE (ошибка компилятора)
Рисунок 4.2 — Сообщение о сгенерированном исключении
Сообщение, содержащееся в этом окне, информирует, что произошло деление на ноль, и выполнение программы приостановлено. Нажатие кнопки OK прерывает выполнение программы. Открывается окно редактора кода, в котором строка, содержащая ошибку, будет выделена синей полосой (рисунок 4.3).
Рисунок 4.3 — Строка кода, содержащая ошибку периода выполнения
Логические ошибки
Программа, содержит логические ошибки, если реализованный в ней алгоритм является неправильным. В этом случае программа работает, выдает результат, но этот результат неверен. Такое происходит если, например, в программе неправильно записана формула либо при поиске максимума из трех чисел сравнили между собой только два числа. Для поиска и устранения логических ошибок необходимо использовать тесты, — решенные каким-либо образом задачи, имеющие правильный ответ.
В больших и сложных программах логические ошибки и ошибки периода выполнения достаточно трудно отследить и обнаружить. В этих случаях вполне естественным является желание выполнить программу в интерактивном режиме, наблюдая за изменениями значений отдельных переменных или выражений.
При этом желательно иметь возможность останавливаться в определенном месте программы и смотреть, что там происходит. Часто бывает полезно изменять значения некоторых переменных при выполнении программы. Это позволит повлиять на ее поведение и увидеть, в какую сторону оно изменилось. Все эти возможности наряду с другими средствами предоставляет отладчик Delphi, являющийся составной частью интегрированной среды разработки.
Интегрированная среда Delphi предоставляет пользователю несколько команд пошаговой отладки доступных в меню Выполнить (рисунок 4.4).
Рисунок 4.4 — Команды отладки
В Delphi имеется два режима трассировки — без захода в подпрограмму и с заходом в неё.
Если необходимо выполнить трассировку части программы, то следует установить в редакторе кода указатель на тот оператор, с которого следует начать трассировку, и выполнить команду Выполнить/Выполнять до Курсора (функциональная клавиша F4). Затем можно продолжить трассировку, нажимая клавиши F7 или F8.
Кроме того, при отладке программы можно использовать точки останова программы. Это строки программы, помеченные особым образом. При достижении такой строки программа приостанавливает свою работу. В этот момент можно просмотреть значения наблюдаемых переменных или начать трассировку программы.
Для внесения новой точки останова выполняется команда Выполнить/Добавить Точку Останова или нажатие функциональной клавиши F5.
Источник: studbooks.net
Ошибки в программах
Ошибки в программах могут допускаться от самого начального этапа составления алгоритма решения задачи до окончательного оформления программы. Разновидностей ошибок достаточно много. Рассмотрим некоторые группы ошибок и соответствующие примеры:
Рассмотрим более подробно некоторые из вышеприведенных видов ошибок.
Синтаксические ошибки
Синтаксические ошибки зачастую выявляют уже на этапе трансляции. К сожалению, многие ошибки других видов транслятор выявить не в силах, т.к. ему не известен задуманный или требуемый результат работы программы.
Решим твою учебную задачу всего за 30 минут
Попробовать прямо сейчас
Отсутствие сообщений транслятора о наличии синтаксических ошибок является необходимым условием правильности программы, но не может свидетельствовать о том, что она даст правильный результат.
Примерами синтаксических ошибок является:
- отсутствие знака пунктуации;
- несоответствие количества открывающих и закрывающих скобок;
- неправильно сформированный оператор;
- неправильная запись имени переменной;
- ошибка в написании служебных слов;
- отсутствие условия окончания цикла;
- отсутствие описания массивов и т.п.
Синтаксическая ошибка «Не задан идентификатор»:
Ошибки, которые не обнаруживает транслятор
В случае правильного написания операторов в программе может присутствовать большое количество ошибок, которые транслятор не может обнаружить. Рассмотрим примеры таких ошибок:
«Ошибки в программах »
Готовые курсовые работы и рефераты
Консультации эксперта по предмету
Помощь в написании учебной работы
- после проверки заданного условия неправильно указана ветвь алгоритма;
- неполный перечень возможных условий при решении задачи;
- один или более блоков алгоритма в программе пропущен.
Ошибки в циклах:
- неправильно указано начало цикла;
- неправильно указаны условия окончания цикла;
- неправильно указано количество повторений цикла;
- использование бесконечного цикла.
Ошибки ввода-вывода; ошибки при работе с данными:
- неправильно задан тип данных;
- организовано считывание меньшего или большего объёма данных, чем нужно;
- неправильно отредактированы данные.
Ошибки в использовании переменных:
- используются переменных, для которых не указаны начальные значения;
- ошибочно указана одна переменная вместо другой.
Ошибки при работе с массивами:
- пропущено предварительное обнуление массивов;
- неправильное описание массивов;
- индексы массивов следуют в ошибочном порядке.
Ошибки в арифметических операциях:
- неправильное использование типа переменной (например, для сохранения результата деления используется целочисленная переменная);
- неправильно определен порядок действий;
- выполняется деление на нуль;
- при расчете выполняется попытка извлечения квадратного корня из отрицательного числа;
- не учитываются значащие разряды числа.
Ошибка в арифметических операциях «Деление на нуль»:
Все вышеописанные ошибки можно обнаружить методом тестирования.
Сопровождение программы
Сопровождением программ называются работы по обслуживанию программ в процессе их эксплуатации.
В случае многократного использования разработанной программы для решения различных задач определенного класса требуется проведение таких дополнительных работ, как:
- при обнаружении ошибок работы программы они должны исправляться;
- при изменении требований эксплуатации необходимая модификация программы;
- выполнение доработки программы с целью решения конкретных задач;
- выполнение дополнительных тестовых расчетов;
- внесение исправлений в рабочую документацию;
- улучшение программы и т.д.
Замечание 1
При проведении работ по сопровождению многих программ стоимость этого сопровождения превышает половину затрат, которые приходятся на весь период времени существования программы (от разработки начального алгоритма до морального ее устаревания).
Программа, которая предназначена для длительной эксплуатации, должна сопровождаться соответствующей документацией и инструкцией по ее использованию.
Источник: spravochnick.ru
Виды ошибок и способы их устранения
Выделяют три типа ошибок: ошибки компиляции, ошибки времени выполнения и логические ошибки.
Ошибки компиляции являются синтаксическими ошибками. Они выдаются при компиляции программы. Программа с синтаксическими ошибками не может быть выполнена.
Ошибки времени выполнения связаны с невозможностью по какой-либо причине выполнить очередное действие, что приводит к аварийному останову программы. Такие ошибки возникают, например, при делении на 0, вычислении логарифма с отрицательным аргументом, переполнении стека при выполнении рекурсивной подпрограммы и т.п.
Логические ошибки возникают при неправильном проектировании алгоритма или по невнимательности при записи или наборе программы. Программа с логическими ошибками может быть выполнена до конца, возможно даже, что при некоторых наборах исходных данных результаты будут правильными.
В процессе устранения логических ошибок можно выделить три этапа:
1. установление факта существования ошибки;
2. локализация ошибки;
3. устранение ошибки.
Существуют 2 метода обнаружения ошибок:
1. статическая (ручная) проверка, которая заключается в анализе программы без выполнения ее на ЭВМ;
2. тестирование — прогон на ЭВМ.
Оба метода требуют наборов тестовых данных, которые должны подбираться параллельно с разработкой алгоритма. В число наборов тестовых данных рекомендуется включить несколько типичных, среди них должны быть корректные и некорректные данные. Тестовые данные должны охватывать предельные случаи. Если в программе есть разветвления, то необходимы наборы тестовых данных для каждой ветви. Если в программе есть циклы, то данные нужно подобрать так, чтобы цикл выполнялся минимально и максимально возможное число раз.
При отладке программ для практического использования нужно подобрать дополнительные тестовые данные:
1. Получить реальные данные у потенциального пользователя.
2. Породить случайным образом наборы тестовых данных.
Ручная проверка
Нужно руководствоваться правилом: чем раньше обнаружена ошибка, тем легче ее исправить. Поэтому при разработке алгоритма и записи программы необходимо следить за инициализацией всех переменных в программе, необходимо устанавливать правильное завершение циклов, избегать зацикливания. Какой бы простой ни была программа, рекомендуется выполнить трассировку с записью результатов на каждом шаге.
Статистика утверждает, что 70% ошибок можно устранить на этапе ручного тестирования.
Машинное тестирование
Известный специалист в области программирования Дейкстра считает, что тестирование доказывает наличие ошибок, а не их отсутствие.
Выделяют два вида тестирования: разрушающее и диагностическое:
1. Разрушающее тестирование производится над программой, которая считается правильной, с целью заставить ее дать сбой.
2. Диагностическое тестирование выполняется с целью локализации ошибки, если известно о ее существовании.
В ТР существуют системные средства для отладки программ. Они позволяют выполнить трассировку с выводом значений интересующих переменных и выражений, устанавливать точки останова, точки прерывания (контрольные точки).
Проверка правильности данных
Правильно написанная программа должна:
1. при вводе некорректных данных выдавать сообщение, указывающее на некорректный элемент данных и сообщать о причине некорректности;
2. произвести как можно больше правильных вычислений;
3. встретив некорректный элемент данных, проверить остальные данные.
Исправление ошибок
1. Перед всяким устранением ошибки нужно подумать, к чему это приведет.
2. После того как в программу внесены изменения, нужно заново ее протестировать.
Устойчивая программа — это программа, которая порождает правильные результаты во всех случаях, когда это возможно, иначе — указывает причину, по которой программа не может быть выполнена. Всякая практически используемая программа меняется в течение своей жизни.
Изменения включают в себя исправление логических ошибок, выявленных при эксплуатации программы, и модификацию программы в соответствии с новыми требованиями. На эту деятельность, которая называется сопровождением, программисты тратят больше времени, чем на создание программы. Правильная программа, после внесения в нее изменений, может перестать быть правильной. Поэтому программа должна быть предельно ясной и понятной тому, кто занимается сопровождением, структура программы должна быть такой, чтобы ее легко было модифицировать, не лишая устойчивости.
19. РЕГУЛЯРНЫЙ ТИП (МАССИВ)
Чтобы хранить и обрабатывать сложные виды информации, нужно научиться строить нетривиальные структуры данных. Такие структуры создают путем объединения данных, в конечном итоге, простых типов. Составные части структурированных типов называются их компонентами.
В ТР существует ограничение на объем памяти, занимаемой значением любого структурированного типа. Этот объем не должен превышать 65520 байтов.
Одним из структурированных типов во многих алгоритмических языках является регулярный тип (тип массив). Массив представляет собой совокупность фиксированного числа компонентов одного типа. Тип компонентов массива называется базовым типом.
Количество типов индекса, перечисленных в квадратных скобках, определяет размерность массива. Размер массива — это общее число его компонентов.
Тип индекса должен быть упорядоченным типом. Чаще всего для типа индекса используют интервальный тип, реже — перечисляемый или стандартный. Тип индекса не может быть четырехбайтовым.
Базовый тип может быть любым.
Одномерные массивы
Если указан только один тип индекса, массив является одномерным.
Примеры описаний одномерных массивов:
type t_vect =array[1.. MAXLEN] of integer;
c, d : array[1.. MAXLEN] of integer;
flag : array[‘A’..‘Z’] of boolen;
Массивы a, b, c, d имеют одинаковые размеры (=100). Размер массива point равен 3, flag — 26.
Компоненты (элементы) массива занимают последовательные ячейки памяти. Объем памяти, выделяемой массиву, равен произведению размера массива на объем, занимаемый элементом. Переменная а занимает 100*2=200 байтов, point — 3*6=18 байтов, flag — 26*1=26 байтов.
Следует обратить внимание на то, что типы переменных aи с компилятор считает разными. Важным понятием в Паскале является понятие тождественности типов. Переменные имеют тождественные типы, если они определены в одной секции или через одно и то же имя типа.
Согласно приведенным выше описаниям, типы переменных a и b тождественны, так как переменные описаны с использованием имени типа t_vect. Переменные с и d тоже имеют тождественные типы, так как описаны в одной секции.
Над массивами любой размерности как над едиными целыми не определены никакие операции. Разрешено присваивание переменной типа массив значения переменной тождественного типа, то есть для совместимости массивов по присваиванию требуется тождественность типов.
Если массивы a и d инициализированы, то допустимы операторы b:=a и c:=d.
Имя массива является общим именем совокупности компонентов (элементов) массива. Обращение к отдельным компонентам массива осуществляется с помощью переменных с индексами:
Выражение в квадратных скобках должно иметь тип индекса. Например, a[1], d[MAXLEN div 2], point[x], point[y], flag[‘X’], flag[succ(‘G’)].
Переменные с индексами можно использовать в любом месте программы, где допустим базовый тип. Ввод и вывод массива производится покомпонентно, обычно в цикле for.
Пример.Составим программу для определения максимального члена данной целочисленной последовательности, длиной не больше 100, и номера этого элемента:
var v : array [1.. MAXLEN] of integer;
imax, i : 1.. MAXLEN;
write(‘Введите длину последовательности £ ‘, MAXLEN);
write(‘Введите члены последовательности ‘);
for i:=1 to n do read(v[i]);
max := v[1]; imax := 1;
if v[i] > max then
writeln(‘ Максим. член последовательности — v[’, imax, ‘] = ’, max)
Упакованные массивы
Если в одном машинном слове можно разместить несколько элементов массива, то для экономии памяти можно использовать упакованный массив. Для этого при описании массива перед ключевым словом array следует указать ключевое слово packed.
Например, при описании
в двухбайтовом машинном слове размещается 5 элементов, для массива потребуется 2 слова, то есть 4 байта.
При работе с упакованными массивами усложняется доступ к отдельным элементам массива. В ТР массивы упаковываются автоматически, слово packed можно не указывать.
Многомерные массивы
Если количество типов индекса в описании массива равно n, то массив называют n-мерным. Формально размерность массива не ограничена, но фактически она зависит и от размера базового типа, и от ограничения на объем памяти структурированных типов.
Для представления матриц используются двумерные массивы. Тип первого индекса определяет число строк, а тип второго индекса — число столбцов матрицы. Например,
type t_matr=array[1..ROW, 1..COL] of word;
d: array[1..2, 1..3, (x, y)] of real;
Тип t_matr — двумерный массив размером 20х10. Его можно использовать для работы с матрицами порядка не больше чем 20×10. Переменная d — трехмерный массив.
Обращение к элементам многомерных массивов:
Идентификатор — имя массива. Число выражений (индексов) в квадратных скобках должно быть равно размерности массива. Например, a[3, 4], d [2, 1, y].
В памяти двумерные массивы располагаются по строкам. В общем случае элементы многомерных массивов размещаются так, что чем правее индекс, тем быстрее он меняется. Так, элементы массива d размещаются в памяти в следующей последовательности:
Для ввода и вывода многомерных массивов используются вложенные циклы. В качестве примера приведем фрагмент программы вывода в виде таблицы описанного выше массива a ( i и j — целочисленные переменные):
Источник: infopedia.su
неправильная запись в файл + ошибки компилятора
сделал простенькую консольную игру. все работает нормально, но когда решил сделать файл с рекордами появилось 2 проблемы:
1. в файл записывается мусор вместе с рекордом
2. в компиляторе (дев) при запуске программы после компиляции выдает вариант программы, который был написан много шагов назад. запуская через файл выполняется все, кроме последних условий вывода на экран, которые выполняются при запуске через компилятор.
вот кусок кода с записью в файл и чтением из него для вывода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
void sort_of_records (records* best, int num) { for (int i = 0; i num; i++) for (int j = 0; j num — 1; j++) if (best[j].lvl best[j + 1].
lvl) swap(best[j], best[j + 1]); } void write_records(string name, int lvl) records best[11]; int k = 1; fstream file(«records.txt», ios_base::in best[0].lvl = lvl; strcpy(best[0].
username, name.c_str()); sort_of_records(best, k); file.clear(); file.
seekg(0); for (int i = 0; i k; i++) { if (k == 10) break; cout [i].username; file.write((char*) } file.close(); } void show_records() records best[10]; ifstream file(«records.txt», ios_base::out file.close(); }
сама структура
1 2 3 4
struct records { char username[64]; int lvl; };
Источник: www.cyberforum.ru