Скачиваний:
109
Добавлен:
21.01.2014
Размер:
2.38 Mб
Скачать

4. Контрольные вопросы

                  1. Назначение и синтакис операторов и функций обеспечивающих доступ к абсолютным адресам?

Вопросы по процедуре выполнения индивидуального задания.

5. Библиографический список

                  1. Бобровский С. Программирование на языке QBASIC для школьников и студентов. — М.: Десс; Инфорком-Пресс, 1999. - 208 с.

                  1. Зельднер Г.А. Программируем на языке QuickBASIC 4.5. - М: ABF, 1996. - 432 с.

                  1. Введение в программирование на языке Microsoft BASIC: Учебное пособие / Ю.Я. Максимов, С.В. Осипов, А.В. Потемкин, Щ.С. Симоненков. - М.: ”Диалог-МИФИ”,1991. - 176 с.

Министерство образования

Российской Федерации

Тульский государственный университет

Кафедра “Инструментальные и метрологические системы”

Информатика

ЛАБОРАТОРНАЯ РАБОТА 17

Организация отслеживания событий,обработки ошибок и трассировки в процессе работы программы

для студентов очного обучения

Тула 2000 г.

1. Цель и содержание работы

Целью работы является изучение принципов исключения ошибок в процессе программирования, и некорректного ввода исходной информации при эксплуатации созанной программы.

Полученные знания и навыки необходимы для выполнения других лабораторных работ, а также практической деятельности.

2. Порядок выполнения работы

                  1. Изучить теоретическую часть.

                  1. Получить задание у преподавателя.

                  1. Выполнить задание.

                  1. Оформить отчет.

                  1. Защитить работу.

3. Теоретическая часть

Операторы отслеживания событий

COM

ON COM

Операторы

COM включает, выключает или приостанавливает отслеживание событий в коммуникационном порту.

При включенном отслеживании событий ON COM обращается к подпрограмме каждый раз, как только порт получает символы.

COM(n%) ON

COM(n%) OFF

COM(n%) STOP

ON COM(n%) GOSUB строка

  • n% - номер COM (серийного) порта (1 или 2);

  • COM(n%) ON - включает отслеживание коммуникационных событий;

  • COM(n%) OFF - выключает отслеживание коммуникационных событий;

  • COM(n%) STOP - приостанавливает отслеживание коммуникационных событий.Событие обрабатывается при включении COM ON;

  • строка - метка или номер первой строки подпрограммы отслеживания событий.

  • Если разработанная программа получает данные через асинхронный коммуникационный адаптер, используйте опцию /C при запуске QuickBASIC или компиляции для установления размера буфера данных.

  1. COM(1) ON 'Включает отслеживание событий в порту 1

ON COM(1) GOSUB ComHandler

DO: LOOP WHILE INKEY$ = ""

COM(1) OFF

END

ComHandler:

PRINT "Что-то было введено с терминала, подключенного к COM1"

RETURN

KEY

Оператор

Присваивает клавише строку символов и может отображать текущий статус клавиш.

KEY LIST

KEY {ON | OFF}

KEY num%, строка

  • num% - номер функциональной клавиши из списка:

  • 1-10 - функциональные F1 - F10.

  • 11-14 - стрелка вверх, влево, вправо, или вниз соответственно.

  • 15-25 - пользовательские.

  • 30- 31 - функциональные F11 - F12;

  • строка - для всех num%, исключая 15-25, это строка, вводимая программой при нажатии данной клавиши. До 15 символов. Для num% =15 - 25, строка имеет вид:

CHR$(флаг) + CHR$(скан_код). Присвоение пустой строки клавише - выключает ее;

  • LIST - отображает установки для каждой клавиши; показывает 15 символов всех определенных оператором KEY клавиш;

  • ON - включает строку cтатуса функциональных клавиш; показывает 6 первых символов значений функциональных клавиш в нижней строке экрана;

  • OFF- выключает строку cтатуса функциональных клавиш; стирает демонстрацию (но не значения) функциональных клавиш из нижней строки делая ее свободной для использования.

  1. KEY 4, "MENU" + CHR$(13)

KEY LIST

KEY 4, ""

KEY LIST

KEY(n)

ON KEY(n)

Операторы

KEY(n%) включает, выключает или приостанавливает отслеживание событий для клавиш. При включенном отслеживании событий ON KEY(n%) обращается к подпрограмме каждый при нажатии клавиши.

KEY(n%) ON

KEY(n%) OFF

KEY(n%) STOP

ON KEY(n%) GOSUB строка

  • n% - значение, указывающее на функциональную клавишу, клавишу направления или определенную пользователем клавишу:

  • 0 - все перечисленные здесь клавиши (KEY(0) ON, KEY(0) OFF и KEY(0) STOP).

  • 1-10 - функциональные F1 - F10.

  • 11-14 - стрелка вверх, влево, вправо, или вниз соответственно.

  • 15-25 - пользовательские.

  • 30- 31 - функциональные F11 - F12;

  • KEY(n%) ON - включает отслеживание событий для указанной клавиши;

  • KEY(n%) OFF - выключает отслеживание событий для клавиш. Если клавиша была уже нажата, она не запоминается;

  • KEY(n%) STOP - приостанавливает отслеживание событий. Если клавиша была уже нажата, она запоминается, и после включения оператором KEY(n%) ON выполняется действие, связанное с данной клавишей оператором ON KEY. Событие обрабатывается при включении KEY ON;

  • строка - метка или номер первой строки подпрограммы отслеживания событий.

  • Иерархический порядок обработки клавиш следующий:

  • клавиши переключения вывода на принтер,

  • функциональные и клавиши управления курсором,

  • клавиши, определенные пользователем;

  • Описание флагов клавиатуры и скан-кодов, необходимых для отслеживания клавиш, определенных пользователем:

  • &H00 - нет флага.

  • &H01 - &H03 - Shift.

  • &H04 - Ctrl.

  • &H08 - Alt.

  • &H20 - NumLock.

  • &H40 - CapsLock.

  • &H80 - добавочные клавиши расширенной клавиатуры;

  • Можно складывать значения флагов для одновременно нажатых клавиш(например: значение флага &H12 означает, чтобудет тестироватся нажатие Ctrl+Alt.

  • В большинстве случаев применение отслеживания событий связано сконтролем нажатия клавиш упраления (функциональных, клавиш управления курсором, и пр.), что значительно проще и удобнее может быть реализовано с помощью оператора INKEY$ в режиме опроса клавиатуры.

  1. 'В этом примере необходимо, чтобы клавиши Caps Lock и Num Lockбыли выключены

CONST ESC = 27

KEY 15, CHR$(&H4) + CHR$(&H1F) 'Устанавливает Ctrl+S как KEY 15

ON KEY(15) GOSUB PauseHandler

KEY(15) ON

WHILE INKEY$ <> CHR$(ESC)

PRINT "Нажмите Esc для останова, Ctrl+S для паузы"

PRINT

WEND

END

PauseHandler:

SLEEP 1

RETURN

PEN

Функция

Возвращает статус светового пера.

PEN(n%)

  • n% - указывает информацию, которая должна быть возвращена о статусе светового пера:

  • 0 - использовалось ли световое перо после последнего вызова (-1 - да, 0 если нет);

  • 1 - координата X последнего нажатия пера;

  • 2 - координата Y последнего нажатия пера;

  • 3 - текущий статус переключателя пера (-1 если вниз, 0 есливверх);

  • 4 - координата Х места, где последний раз использовалось перо;

  • 5 - координата Y места, где последний раз использовалось перо;

  • 6 - символ строки последнего нажатия пера;

  • 7 - символ столбца последнего нажатия пера;

  • 8 - символ строки, где последний раз использовалось перо;

  • 9 - символ столбца, где последний раз использовалось перо.

  1. DO

P = PEN(3)

LOCATE 1, 1: PRINT "Перо находится "

IF P THEN PRINT "вверху" ELSE PRINT "внизу "

PRINT "X ="; PEN(4), " Y ="; PEN(5); " "

LOOP

PEN

ON PEN

Операторы

PEN включает, выключает или приостанавливает отслеживание события для светового пера. При включенном отслеживании события ON PEN обращается к подпрограмме при каждой активизации светового пера.

PEN ON

PEN OFF

PEN STOP

ON PEN GOSUB cтрока

  • PEN ON - включает отслеживание события для светового пера;

  • PEN OFF - выключает отслеживание события для светового пера;

  • PEN STOP - приостанавливает отслеживание события для светового пера. События обрабатываются при включении PEN ON отслеживания события;

  • строка - метка или номер первой строки подпрограммы отслеживания события.

  • Световое перо требует, как минимум, адаптера IBM CGA.

  • Ускорение выполнения программы происходит при выключенном оператором PEN OFF световом пере.

  • Широкое распространение манипуляторов “мышь” и трекболов (та же “мышь” с увеличенным шариком который вращают руками) привело к практической утери актуальности светового пера.

  1. 'Для выполнения этого примера нужно световое перо

ON PEN GOSUB Handler

PEN ON

PRINT "Для выхода нажмите Esc"

DO UNTIL INKEY$ = CHR$(27): LOOP

END

Handler:

PRINT "Перо - в строке"; PEN(6); ", столбце"; PEN(7)

RETURN

PLAY(n)

ON PLAY(n)

Операторы

PLAY(n) dозвращает число нот, находящихся в фоновом музыкальном буфере. PLAY{ ON | OFF | STOP } включает, выключает или приостанавливает отслеживание события при игре музыки. При включенном отслеживании события ON PLAY(n) обращается к подпрограмме каждый раз, когда в музыкальном буфере содержится число нот, меньшее указанного числа.

PLAY(num)

PLAY{ ON | OFF | STOP }

ON PLAY(лимит) GOSUB метка

  • num - любой числовой параметр. PLAY (num) возвращает 0 если музыка испоняется в основном (не фоновом) режиме;

  • PLAY ON - включает отслеживание события при игре музыки;

  • PLAY OFF - выключает отслеживание события при игре музыки. Если событие наступило, оно не запоминается;

  • PLAY STOP - приостанавливает отслеживание события при игре музыки. Если событие наступило, оно запоминается. События обрабатываются при включении PLAY ON отслеживания события;

  • лимит - целое выражение, минимальное количество нот звучащих в фоновом режиме (от 1 до 32);

  • метка - метка или номер первой строки подпрограммы отслеживания события.

  • При использовании оператора ON PLAY(n) следует учитывать что:

  • обработка ведется лишь по окончании фонового звучания мелодии.

  • значение аргумента лимит во избежании ощутимого замедления программы не должно быть большим.

  • PLAY{ ON | OFF | STOP } используются совместно с оператором ON PLAY(n).

  1. ON PLAY(3) GOSUB Background

PLAY ON

Music$ = "MBo3L8ED+ED+Eo2Bo3DCL2o2A"

PLAY Music$

LOCATE 2, 1: PRINT "Для останова нажмите любую клавишу";

DO WHILE INKEY$ = "": LOOP

END

Background:

i% = i% + 1

LOCATE 1, 1: PRINT "Фон был вызван "; i%; "раз(а)";

PLAY Music$

RETURN

STRIG(n)

ON STRIG(n)

Операторы

STRIG{ ON | OFF | STOP } включает, выключает или приостанавливает отслеживание события для джойстика. При включенном отслеживании события, ON STRIG(n) обращается к подпрограмме при каждом нажатии указанного триггера.

STRIG(n%) { ON | OFF | STOP }

ON STRIG(n%) GOSUB строка

  • n% - значение, указывающее номер тригера джойстика:

  • 0 - нижняя кнопка, 1-го джойстика.

  • 2 - нижняя кнопка, 2-го джойстика.

  • 4 - верхняя кнопка, 1-го джойстика.

  • 6 - верхняя кнопка, 2-го джойстика;

  • STRIG(n%) ON - включает отслеживание события для джойстика;

  • STRIG(n%) OFF - выключает отслеживание события для джойстика;

  • STRIG(n%) STOP - приостанавливает отслеживание события. События обрабатываются при включении STRIG ON отслеживания события;

  • строка - метка или номер первой строки подпрограммы отслеживания события.

  1. 'Для выполнения этого примера нужен джойстик

ON STRIG(0) GOSUB Handler

STRIG(0) ON

PRINT "Для выхода нажмите Esc"

DO UNTIL INKEY$ = CHR$(27): LOOP

END

Handler:

PRINT "Тригер джойстика отжат"

RETURN

TIMER

ON TIMER(n)

Операторы

TIMER{ ON | OFF | STOP } включает, выключает или приостанавливает отслеживание события для таймера. При включенном отслеживании события ON TIMER(n) обращается к подпрограмме, как только прошло указанное число секунд.

TIMER { ON | OFF | STOP }

ON TIMER(n%) GOSUB строка

  • TIMER ON - включает отслеживание события для таймера;

  • TIMER OFF - выключает отслеживание события для таймера. Если событие имело место, оно не запоминается;

  • TIMER STOP - приостанавливает отслеживание события. Если событие имело место, оно запоминается. События обрабатываются при включении TIMER ON отслеживания события;

  • n% - число секунд, которые должны пройти, прежде чем ON TIMER обратится к подпрограмме отслеживания события; значения находятся в пределах от 1 до 86400 с. (24 часа);

  • строка - метка или номер первой строки подпрограммы отслеживания события.

  1. ON TIMER(1) GOSUB TimeUpdate

TIMER ON

CLS

PRINT "Время: "; TIME$

StartTime = TIMER

WHILE TimePast < 10

TimePast = TIMER - StartTime

WEND

END

TimeUpdate:

LOCATE 1, 8: PRINT TIME$

RETURN

UEVENT

ON UEVENT

Операторы

UEVENT{ ON | OFF | STOP } включает, выключает или приостанавливает отслеживание события, определенного пользователем. При включенном отслеживании события ON UEVENT обращается к подпрограмме, как только пользовательское событие произошло.

UEVENT { ON | OFF | STOP }

ON UEVENT GOSUB строка

  • UEVENT ON - включает отслеживание пользовательского события;

  • UEVENT OFF - выключает отслеживание пользовательского события. Если событие имело место, оно не запоминается;

  • UEVENT STOP - приостанавливает отслеживание события. Если событие имело место, оно запоминается. События обрабатываются при включении UEVENT ON отслеживания события;

  • строка - метка или номер первой строки подпрограммы отслеживания события.

  • Как правило пользовательские события - это аппаратные прерывания.

  • Для установки пользовательского события необходимо в программу вставить:

  • процедуру сервиса прерывания.

  • процедуру инициализации для установки адреса сервисной процедуры в таблице векторов прерываний.

  • подпрограмму обработки данных, собранных сервисной процедурой.

  • Зачастую эти процедуры пишутся на языке ассемблера.

  • Существует 4 шага для генерации пользовательского события:

  • написать подпрограмму обработки события на ВASIC.

  • выполнить оператор ON UEVENT GOSUB для определения подпрограммы-обработчика.

  • выполнить оператор для включения отслеживания.

  • вызвать процедуру инициализации прерывания для установки адреса сервисной процедуры в таблице векторов прерываний.

  1. ON UEVENT GOSUB Event1

UEVENT ON

INPUT "Введите число"; a

IF a = 5 THEN CALL SetUevent

END

'

Event1:

PRINT "Обработка события"

RETURN

Операторы обработки ошибок и трассировки

ON ERROR

Оператор

Включает обработку ошибок при обнаружении ошибки во время выполнения программы, передавая управление на подпрограмму обработки ошибок, или возобновляет выполнение программы.

ON ERROR {GOTO строка | RESUME NEXT}

  • строка - первая строка подпрограммы обработки ошибок Для выключения обработки ошибок задайте: GOTO 0;

  • REZUME NEXT - указывает, что при возникновении ошибок управление передается на следующий оператор.

  • Используйте функцию ERR для получения кода ошибки.

  • Если оператор ON ERROR не используется, любая ошибка выполнения завершает Вашу программу.

  1. ON ERROR GOTO Handler

CHDIR "a:\" 'Обнаружение ОШ. 71 "Нет готовности диска, если нет диска в дисководе A”

y% = 0

x% = 5 / y% 'ОШ. 11 "Деление на ноль"

PRINT "x% ="; x%

ERROR 57 'ОШ. 57 "Ошибка В/ВВ на устройстве"

Handler:

PRINT

PRINT "Ошибка "; ERR; " в строке "; ERL

SELECT CASE ERR

CASE 71

PRINT "Используемое устройство "; ERDEV$;

PRINT " Код ошибки устройства = "; ERDEV

RESUME NEXT

CASE 11

INPUT "Введите новое значение для делителя: "; y%

RESUME

CASE ELSE

PRINT "Нераспознанная ошибка, завершение программы"

END

END SELECT

ERDEV

ERDEV$

Функции

ERDEV возвращает код ошибки от последнего устройства, выдавшего критическую ошибку. ERDEV$ возвращает имя устройства, выдавшего

эту ошибку

ERDEV

ERDEV$

  • ERDEV - целая функция.

  • ERDEV - символьная функция.

  • Младший байт (нижние 8 бит) значения, возвращаемого ERDEV, содержит код ошибки DOS от 0 до 12.

  • Старший байт(верхние 8 бит) содержит информацию об устройстве (биты 15, 14, 13, ХХ, 3, 2, 1 и 0). ХХ- указывает что биты всегда нулевые.

  • См. предыдущий пример.

ERR

ERL

Функции

ERR возвращает код ошибки выполнения для последней ошибки.

ERL возвращает номер строки, в которой обнаружена ошибка, или последний установленный номер строки перед строкой, где была обнаружена ошибка.

ERR

ERL

  • ERL не возвращает метку строки. Если нет номеров строк в программе, ERL возвращает 0.

  • См. предыдущий пример.

ERROR

Оператор

Эмулирует ошибку QB или ошибку, определенную пользователем.

ERROR выражение%

  • выражение% - код ошибки Basic или ошибки, определенной пользователем; значение в интервале от 1 до 255. Для определения собственного кода ошибки используйте значения, которых нет в таблице.

  • Обработчик ошибок должен находится в главном модуле программы. (В Microsoft BASIC PDS 7.1 с помощью оператора ON LOCAL ERROR GOTO ... обработчик ошибок может размещатся в процедуре или функции).

  • Для собственных кодов ошибок используйте значения большие 255.

  • См. предыдущий пример.

RESUME

Операторы

Продолжает выполнение программы после подпрограммы обработки ошибок.

RESUME [{строка | NEXT}]

  • строка - метка или номер строки для продолжения программы. Если метка равна 0 или отсутствует, выполнение продолжается с оператора, в котором была обнаружена ошибка.

  • NEXT - продолжает выполнение программы со следующего оператора за оператором, в котором была обнаружена ошибка.

  • RESUME - обязательный оператор подпрограммы обработки ошибок.

  • См. предыдущий пример.

TRON

TROFF

Операторы

TRON и TROFF включают и выключают слежение (трассировку) за операторами программы.

TRON

TROFF

  • При отладке в QBasic отпадает необходимость в этих операторах.

  • Операторы показывают номера строк, если программа скомпилирована с опцией Debug (/D).