- •Кетков ю.Л.
- •Раздел 5. Системные данные текстового типа 33
- •Раздел 6. Основные синтаксические конструкции языка c 46
- •Раздел 7. Указатели и ссылки 59
- •Раздел 8. Функции и их аргументы 62
- •Раздел 9. Работа с массивами. 74
- •Раздел 10. Пользовательские типы данных. 95
- •Раздел 11. Работа с файлами 104
- •Раздел 12. Библиотеки стандартных и нестандартных функций 118
- •Раздел 15. Классы. Создание новых типов данных 131
- •Раздел 16. Классы как средство создания больших программных комплексов 150
- •Раздел 17. Прерывания, события, обработка исключений 167
- •Введение
- •Раздел 1. Немного истории
- •Раздел 2. Структура программы на языке c
- •Раздел 3. Среда программирования
- •Раздел 4. Системные данные числового типа
- •4.1. Типы числовых данных и их представление в памяти эвм
- •4.1.1. Внутреннее представление целочисленных данных
- •4.1.2. Однобайтовые целочисленные данные
- •4.1.3. Двухбайтовые целочисленные данные
- •4.1.4. Четырехбайтовые целочисленные данные
- •4.1.5. Восьмибайтовые целочисленные данные
- •4.2. Внутреннее представление данных вещественного типа
- •4.3. Внешнее представление числовых констант
- •4.4. Объявление и инициализация числовых переменных
- •4.5. Ввод числовых данных по запросу программы
- •4.5.1. Потоковый ввод данных числового типа
- •4.5.2. Форматный ввод
- •4.6. Вывод числовых результатов
- •4.6.1. Форматный вывод
- •4.6.2. Потоковый вывод
- •4.7. Примеры программ вывода числовых данных
- •4.8. Операции над числовыми данными целого типа
- •4.9. Операции над числовыми данными вещественного типа
- •Раздел 5. Системные данные текстового типа
- •5.1. Символьные данные и их представление в памяти эвм
- •5.2. Строковые данные и их представление в памяти эвм
- •5.3. Ввод текстовых данных во время работы программы
- •5.3.1. Форматный ввод
- •5.3.3. Потоковый ввод
- •5.3.4. Специальные функции ввода текстовых данных
- •5.4. Вывод текстовых данных
- •5.4.1. Форматный вывод
- •5.5.2. Операции над строковыми данными
- •5.6. Управление дисплеем в текстовом режиме
- •Раздел 6. Основные синтаксические конструкции языка c
- •6.1. Заголовок функции и прототип функции
- •6.2. Объявление локальных и внешних данных
- •6.3. Оператор присваивания
- •6.4. Специальные формы оператора присваивания
- •6.5. Условный оператор
- •6.6. Оператор безусловного перехода
- •6.7. Операторы цикла
- •6.8. Дополнительные операторы управления циклом
- •6.9. Оператор выбора (переключатель)
- •6.10. Обращения к функциям
- •6.11. Комментарии в программах
- •Раздел 7. Указатели и ссылки
- •7.1. Объявление указателей
- •7.2. Операции над указателями
- •7.3. Ссылки
- •Раздел 8. Функции и их аргументы
- •8.1. Параметры-значения
- •8.2. Параметры-указатели
- •8.3. Параметры-ссылки
- •8.4. Параметры-константы
- •8.5. Параметры по умолчанию
- •8.6. Функции с переменным количеством аргументов
- •8.7. Локальные, глобальные и статические переменные
- •8.8. Возврат значения функции
- •8.9. Рекурсивные функции
- •8.10. Указатели на функцию и передача их в качестве параметров
- •8.11. "Левые" функции
- •Раздел 9. Работа с массивами.
- •9.1. Объявление и инициализация массивов.
- •9.2. Некоторые приемы обработки числовых массивов
- •9.2. Программирование задач линейной алгебры
- •9.2.1. Работа с векторами
- •9.2.2.Работа с матрицами
- •9.3. Поиск
- •9.3.1. Последовательный поиск
- •9.3.2. Двоичный поиск
- •9.4. Сортировка массивов.
- •9.4.1. Сортировка методом пузырька
- •9.4.2. Сортировка методом отбора
- •9.4.3. Сортировка методом вставки
- •9.4.4. Сортировка методом Шелла
- •9.4.5.Быстрая сортировка
- •9.5. Слияние отсортированных массивов
- •9.6. Динамические массивы.
- •Раздел 10. Пользовательские типы данных.
- •10.1. Структуры
- •10.1.1. Объявление и инициализация структур
- •10.1.2. Структуры – параметры функций
- •10.1.3.Функции, возвращающие структуры
- •10.2. Перечисления
- •10.3. Объединения
- •Раздел 11. Работа с файлами
- •11.1.Файлы в операционной системе
- •11.1. Текстовые (строковые) файлы
- •11.2. Двоичные файлы
- •11.3. Структурированные файлы
- •11.4. Форматные преобразования в оперативной памяти
- •11.5. Файловые процедуры в системе bcb
- •11.5.1. Проверка существования файла
- •11.5.2. Создание нового файла
- •11.5.3. Открытие существующего файла
- •11.5.4. Чтение из открытого файла
- •11.5.5. Запись в открытый файл
- •11.5.6. Перемещение указателя файла
- •11.5.7. Закрытие файла
- •11.5.8. Расчленение полной спецификации файла
- •11.5.9. Удаление файлов и пустых каталогов
- •11.5.10. Создание каталога
- •11.5.11. Переименование файла
- •11.5.12. Изменение расширения
- •11.5.13. Опрос атрибутов файла
- •11.5.14. Установка атрибутов файла
- •11.5.15. Опрос и изменение текущего каталога
- •11.6. Поиск файлов в каталогах
- •Раздел 12. Библиотеки стандартных и нестандартных функций
- •12.2. Организация пользовательских библиотек
- •12.3. Динамически загружаемые библиотеки
- •13.1. Препроцессор и условная компиляция
- •13.2. Компилятор bcc.Exe
- •13.3. Утилита grep.Com поиска в текстовых файлах
- •14.1. Переопределение (перегрузка) функций
- •14.2. Шаблоны функций
- •Раздел 15. Классы. Создание новых типов данных
- •15.1. Школьные дроби на базе структур
- •15.2. Школьные дроби на базе классов
- •15.3. Класс на базе объединения
- •15.4. Новые типы данных на базе перечисления
- •15.5. Встраиваемые функции
- •15.6. Переопределение операций (резюме)
- •15.8. Конструкторы и деструкторы (резюме)
- •Раздел 16. Классы как средство создания больших программных комплексов
- •16.1. Базовый и производный классы
- •16.1.1.Простое наследование
- •16.1.2. Вызов конструкторов и деструкторов при наследовании
- •16.1.3. Динамическое создание и удаление объектов
- •16.1.4. Виртуальные функции
- •16.1.5. Виртуальные деструкторы
- •16.1.6. Чистые виртуальные функции и абстрактные классы
- •16.2. Множественное наследование и виртуальные классы
- •16.3. Объектно-ориентированный подход к созданию графической системы
- •Раздел 17. Прерывания, события, обработка исключений
- •17.1. Аппаратные и программные прерывания
- •17.2. Исключения
Раздел 17. Прерывания, события, обработка исключений
17.1. Аппаратные и программные прерывания
Процесс выполнения любого приложения находится под постоянным контролем операционной системы. Система выделяет приложению ресурсы, необходимые для решения задачи, защищает эти ресурсы от несанкционированного доступа со стороны других приложений, выполняющихся в это же время. Для продвижения параллельно работающих приложений операционная система выделяет каждому из них определенный квант времени, в течение которого процессор занимается обслуживанием очередного задания. Одновременно система должна не забывать и о собственных нуждах – ей приходится следить за функционированием драйверов, выполняющих заказы приложений по общению с периферийным оборудованием, вовремя реагировать на различные события (сигналы таймера, вмешательство пользователя и т.п.).
Основным механизмом, помогающим операционной системе в этой работе, является аппарат прерываний (в англоязычной технической литературе для его обозначения используется термин interrupt). Не вдаваясь в тонкости технической реализации, действие этого механизма можно представить себе следующим образом. Для фиксации возникающих событий используется специальный регистр прерываний, в котором каждый разряд связан с определенным событием (англ. event – событие). При возникновении этого события разряд регистра прерываний взводится в "1", после чего должна сработать специальная системная функция, реагирующая на это событие. В операционной системе MS-DOS для реализации подобного механизма был предусмотрен участок в начале оперативной памяти под названием "вектор прерываний". Каждая компонента этого вектора представляла собой команду передачи управления на функцию обработки соответствующего события. При возникновении того или иного события аппаратно останавливалось выполнение текущей программы, автоматически запоминалось состояние центрального процессора (содержимое регистров, установка различных флажков) и управление передавалось вектору, индекс которого соответствовал номеру события. Разряд в регистре прерываний при этом сбрасывался в "0". После обработки события состояние прерванного процесса восстанавливалось, и работа продолжалась. Некоторые события требовали безотлагательного вмешательства операционной системы, другие могли "подождать". Для предотвращения зацикливания имелась возможность заблокировать прием других сигналов прерывания на время обработки срочного события.
Причины, по которым возникали те или иные события, можно разделить на две категории. К первой относились события, связанные с нормальным функционированием тех или иных устройств компьютера – сигналы датчиков времени, сигналы, поступающие при нажатии клавиш клавиатуры или других устройств управления (мышь, джойстик), сигналы драйверов, завершивших выполнение порученных им операций, критическое изменение уровня питающего напряжения. Эту группу можно отнести к аппаратным прерываниям. Причина других событий кроется в ненормальном функционировании приложения, которое предпринимает попытку разделить на нуль, извлечь квадратный корень из отрицательного аргумента, выйти за пределы отведенной ему памяти, передать управление по несуществующему адресу, нарушить границы того или иного массива. Одним словом, речь идет об ошибках, которые могут возникнуть во время исполнения программы. Такого рода прерывания называют программными. Для их обработки существуют две возможности. Если приложение не позаботилось об индивидуальной реакции на программные ошибки, то операционная система сообщит о возникшей ситуации и прервет работу приложения. Вторая возможность, которая может продолжить работу приложения, связана с запрограммированной реакцией самого приложения на те или иные нештатные ситуации.
Одним из первых алгоритмических языков, в которых появилась возможность организовать индивидуальную реакцию на ошибки периода выполнения программы, был Бейсик. И хотя на первых порах профессионалы его просто проигнорировали, уже в ранних версиях Бейсика были предусмотрены операторы типа ON ERROR GOTO ... и ON ERROR GOSUB... . Они позволяли включить в программу пользователя те фрагменты, которые могли реагировать на динамически возникающие ошибки. Для анализа возникшей ситуации приложение могло использовать системные переменные типа ERR (код программной ошибки), ERL (номер строки исходной программы, при выполнении которой была обнаружена ошибка) и др. С тех пор прошел не один десяток лет, пока создатели языка C++ не удосужились включить в состав языковых средств аналогичные конструкции для обработки особых ситуаций (англ. Exception – исключение).
В средах визуального программирования механизм событий является основным инструментом управления приложения со стороны пользователя и взаимодействия компонент друг с другом.