Turbo Basic 1.1. Руководство пользователя
Введение
Турбо-Бейсик представляет собой независимую среду программирования
для персональных компьютеров IBM и совместимых с ними.Следуя по следам сво-
его знаменитого родственника Турбо-Паскаля,Турбо-Бейсик сочетает в себе:
редактор, быстрый компилятор типа память-память, библиотеку режима исполни-
тельного времени и внутренний связник. Всего современном пользовательском
интерфейсе применяются окна и последовательно детализированное меню. С
целью достижения максимального быстродействия и эффективного использования
памяти Турбо-Бейсик целиком написан на ассемблерном языке.
В число других отличительных характеристик входит следущие:
-поддержание арифметики с плавающей точкой(полная интеграция 8087 и
полная программная эмуляция )
-среда профессиональной разработки
-новые операторы блочно-структурного программирования
-полная поддержка EGA.
Будучи языком как начинающего ,так и для опытного программиста,
интегрированная конструкция Турбо-Бейсика дает возможность быстрого
программного оборота без принесения в жертву мощных возможностей
профессионального программирования. Он совместим с версией 3.00
Интепретатора передового БЕЙСИКА системы IBM (обычно именуемого BASKA) или
GWBASIC микропрограммного обеспечения (с незначительными исключениями), а
также имеется много расширений. (Далее мы будем ссылаться на передовой
Бейсик или GWBASIC ,называя их вместе "Интерпретаторный Бейсик").
Программы, создаваемые с помощью Турбо-Бейсика, имеют доступ ко
всей памяти, которой располагает целевая машина-64К для скаларов, 64К для
строк, имеющаяся в распоряжении память для массивов и более 64К для прог-
рамм. Компилятор генерирует истинные .EXE -файлы, которые работают в 4-100
раз быстрее их интерпретаторных двойников, а в сочетании с поддержкой 8087
способствует охвату областей применения с интенсивной числовой обработкой
данных. Турбо-Бейсик поддерживает также все графические возможности и
расширения усиленного графического адаптера(EGA).
- 9 -
Благодаря его передовым конструкциям управления потоком команд
(блоки IF/THEN/ELSEIF/ENDIF, DO/LOOP, CASE/SELECT, CALL/SUB), программы
Турбо-Бейсика более просты в написании, отладке и поддержании, чем
программы Интерпретаторного Бейсика. Номера строк могут использоваться
опционально; в качестве цели операторов GOTO и GOSUB могут служить
алфавитно-числовые метки. Определяемые пользователем функции и
процедуры дают возможность заявления локальных, статических и
разделяемых переменных, а также допускают рекурсивность.
Турбо- Бейсик поддерживает значительно расширенный строчный диапазон
( до 32 767 литер на строку ) и обеспечивает уничтожение данных задержек
периодических строчных промежитков "подчистка". Имеется BINARY (двоичный)
файловый режим для обработки фаилов низкого уровня и режим с числами типа
данных целых для быстрой и гибкой числовой обработки. Операторами
CALL и REG предоставляется возможность прямой связи с языком ассемблера, а
также имеется множество компиляторных директив для условной компиляции,
отслеживания ошибок, буферного управления и т.д.
Турбо-Бейсик является мощным совместимым с интерпретаторным
Бейсиком, языком, с помощью которого быстро получается быстродействующие
программы.
Об этом руководстве
Прежде всего о том, чем данное руководство не является. Оно не
является исчерпывающим введением в Бейсик-программирование. По последним
подсчетам существует более 15000 книг, посвященных этому предмету, и,
в частности, более 1000 относится к Интерпретаторному Бейсику (который , в
сущности, имеет тот же синтаксис, что и Турбо-Бейсик). Данное руководство
не подменяет также источники информации, как руководство по DOS и
технического руководства для вашей машины.
Вместо всего этого, настоящее руководство представляет собой
своего рода справочник по системе разработки программ, известной как
Турбо-Бейсик. Мы начинаем с краткой консультации по установке
в систему рабочего гибкого или жесткого диска, а затем переходим к
обсуждению того как использовать Турбо-Бейсик для простой программы
редактирования и компиляции. Дальнейшая консультация относится к
основополагающим материалам, распределенным по главе 3 "Турбо-Бейсик:
Программа" и главе 4 "Турбо-Бейсик:язык". Глава 5 "Словарь -справочник
по Турбо-Бейсику" представляет собой алфавитно упорядоченный обзорный
раздел по командам, системным переменным, функциям, операторам и
использованиям Т.Б.(Турбо-Бейсика).
Приложения содержат таблицу ASCII и клавиатурные коды, а также
дополнительную информацию относительно числовых соображений, отслеживания
событий интерфейса с подпрограммами на языке ассемблера, ошибок
периода компиляции и прогона, различий между Т.Б. и Интерпретаторным
Бейсиком
Типографские особенности
Основная часть данного руководства напечатана обычным шрифтом; дру-
гие типы шрифта имеют специальное смысловое значение.
Печать в разрядку используется для представления программ примеров
и вывода на экран; например:
DIR MASK:
курсивом выделяются важные понятия и слова. В частности курсив при-
меняется в синтаксических описаниях для указания зон в пределах команд,
подлежащих заполнению специальной информацией области применения; например:
REG REGISTE,VALUE
Текст в буквах верхнего регистра обозначает часть Бейсик-коман-
ды,которая должна быть обеспечена дословно; например:
- 10 -
RESUME NEXT
Определенные литеры имеют специальное смысловое значение, когда они
появляются в синтаксических описаниях.
Прямоугольные скобки ([]) означают, что заключенная в них
информация является описательной.
Например:
OPEN FILESPAC AS [#] FILENUM
означает ,что вы можете указывать знак номера (#) перед номером
файла или опускать его по вашему выбору. Поэтому законны обе следущие
строки:
OPEN "CUST.DTA" AS 1
OPEN "CUST.DTA" AS #1
фигурные скобки () указывают выбор одной или более опций, одна
из которых должна использоваться обязательно. Опции разделяются
вертикальной чертой (!)
например:
KEY ON!OFF
означает, что законныим являются оба оператора KEY ON и KEY OFF и
просто KEY невозможно.
Многоточия (...) указывают, что часть команды может повторяться
столько раз, сколько необходимо.
READ VARIABLE [,VARIABLE]...
означает, что одним оператором READ может обрабатываться множество
переменных,разделяемых запятыми:
READ AS
READ AS BS,A,B,C
три разнесенные по вертикали точки указывают на пропуск одной или
более строк программного текста; например
FOR N=1 TO 10
.
.
.
NEXT N
Системные требования
Собственно для Т.Б. требуются MS-DOS или PC-DOS 2.0, либо выше,
кроме того для исполнения любой создаваемой вами программы требуется
DOS 2.0 или выше.
Т.Б. и программы, которые вы создаете с его использованием,
конструируются для работы на моделях IBM PC, XT или АТ, либо какой-то
полностью совместимой с ними машине. Графические возможности аппаратного
обеспечения, такого как цветной/графический адаптер, усиленный графический
адаптер, либо эквивалентного им, а также соответствующего дисплея.
Выражение благодарности
Вданном руководстве мы ссылаемся на несколько различных видов про-
дукций; также перечислен каждый из них и соответствующая компания:
Турбо-Паскаль и САЙДКИК есть зарегистрированные торговые
марки а
Турбо-Бейсик есть новая торговая марка Borland INTERNATIONAL, INC.
GWBACIC,MS-DOS есть зарегистрированные торговые марки Mikrosoft
Corporation
WORDSTAR есть зарегистрированная торговая марка MikroPRO
INTERNATIONAL, INC
IBM-XT и AT есть зарегистрированные торговые марки Intel
Corporation
MultiMate есть торговая марка MultiMate INTERNATIONAL Corporation
- 11 -
DBASE eсть зарегистрированная торговая марка ASTON-TALE
LOTUS 1-2-3 есть зарегистрированная торговая марка LOTUS
DIWELOPMENT Korporation
ГЛАВА 1
О Бейсике
Подобно омару штата мэн, кремовому сиропу и баскетболу, Бейсик
является продуктом новой Англии. Созданный в 1964г. в Дортсмутском
колледже в Гановере, Нью Хемишир, как язык для обучения програм-
мированию, Бейсик обычно ассоциируется как акроним "BEGINNERS
ALL-PURPOSE SYMBOLIC INSTRUCTION CODE" (Общецелевой код символьных
инструкций для начинающих). Однако циники считают, что изобретатели Джон
Кемени и Томас Куртц сперва придумали заковыристое имя для своего
нового, простого в использовании языка, и только по том подвели под
него базу, состряпав что-то такое, на чем это имя могло бы утвердится.
Вскоре и студенты, и программисты обнаружили, что с использованием
Бейсика можно делать практически все то же самое, что возможно с помощью с
помощью скучного и трудно преодолимого фортрана. А поскольку Бейсик
оказался прост как в изучении, так и в работе, программы на нем писались в
течении более короткого времени, чем их фортранные эквиваленты. Бейсик
оказался также приемлемым для большинства персональных компьютеров.
Это открыло Бейсику широкую дорогу.
Примечательно, что при наличии множества общецелевых языков
программирования, доступных программирующим фанатикам, Бейсик остается
простейшим для изучения и по истечении 20 лет после его введения. Но еще
лучше оказывается выполненная на Бейсике работа. Вопреки притязаниям снобов
Си и Паскаля, Бейсик является вовсе не пустяковым языком, наделенным
мощными инструментами пригодными для того, чтобы браться за специфическое
дело, которое люди в большинстве случаев делают с помощью малых
компьютеров, а именно, за работу с файлами и вывод текстов и графики на
дисплей.
Хотя их язык имеет своих клеветников, ни один из них не может отри-
цать, что Кемени и Куртц достигли цели своего Бейсика: сделать програм-
мирование более доступным для болшего числа людей. Это привело нас
к Турбо-Бейсику.
Турбо-Бейсик является компиляторным Бейсиком. Возможно вы знакомы
с передовым Бейсиком IBM (называемым GWBASIC на многих совместимых машинах,
но который мы назваем теперь "Интерпретаторный Бейсик"). Одной из
популярных Интерпретирующих версий компании MikroSoft. Интерпретирование и
компилирование это два базисных метода реализации языков высокого уровня.
Для понимания важных различий между этими двумя подходами, а
следовательно между Турбо-Бейсиком и Интерпретаторным Бейсиком, нам
- 12 -
необходимо кратко остановиться на основах программирования.
Бейсики и машинный язык
Как это ни удивительно, но любой данный компьютер способен
исполнять программы, написанные только на его родном машинном языке.
Существует почти столько же машинных языков, сколько есть типов
компьютеров, но все они представляют собой некоторые вариации на одну
и ту же тему-простые операции, выполняемые молниеностно быстро над
двоичными числами. На персональных компьютерах IBM используется семейство
машинного языка 8086, поскольку их аппа ратная конструкция базируется на
этом конкретном семействе микропроцессоров.
Возможно, хотя и трудно, писать программы непосредственно на
машинном языке. В ранние годы компьютеризации (на заре 1950-х годов)
машинный язык был тем единственным, что сделали люди, чтобы спасти
программистов от цепенящего озноба программирования в машинных кодах, как
некий мост между человеческими существами и миром машинных языков
компьютеров, были созданы высокоуровневые (т.е. не машинные) языки.
Высокоуровневые языки работают через трансляторные программы,
которые переводят "исходный код" (машинно-читабельный гибрид английского
языка и математических выражений) и в конце концов вынуждают компьютер
исполнять подходящие инструкции на машинном языке для выполнения
заданной работы. Двумя базисными типами трансляторов являются
интерпретаторы, которые сканируют и исполняют исходный код в режиме
единичного шага, и компиляторы, которые сканируют исходный код,
переводя его на машинный язык, а результат этого сканирования используется
затем отдельно.
Интерпретаторы
Исторически Бейсик обычно реализовался как интерпретатор (знакомым
изомером является сам интерпретаторный Бейсик). Одно, часто упоминаемое
преимущество интерпретаторной реализации состоит в том, что она допускает
"непосредственный режим". Непосредственный режим позволяет вам задавать
компьютеру задачу вроде PRINT 3.14159*3/2.1 и возвращает вам ответ, как
тольковы нажмете клавишу ENTER (это позволяет использовать компьютер
стоимостью 3000 долларов в качестве калькулятора стоимотью 10 долларов).
Кроме того, интерпретаторы имеют специальные атрибуты, которые
упрощают отладку. Можно, например, прервать обработку интерпретаторной
программы, отобразить содержимое определенных переменных, бегло просмотреть
программу, а затем продолжить исполнение.
Болше всего программистам нравится в интерпретаторах возможность
получения быстрого ответа. Здесь нет необходимости в компилировании, так
как интерпретатор всегда готов для вмешательства в вашу программу. Введите
RUN и результат вашего самого последнего изменения оказывается на экране.
Однако интерпретаторные языки не без недостатков. Необходимо
например иметь копию интерпретатора в памяти все время, тогда как многие
возможности интерпретатора а следовательно и его возможности могут не быть
необ ходимыми для исполнения конкретной программы.
Слабо различимым недостатком интерпретаторов является то, что они
имеют тенденцию отбивать охоту к хорошему стилю программирования. Поскольку
комментарии и другие формализуемые детали занимают значительное место прог-
раммной памяти, люди стремяться ими не пользоваться. Дьявол менее яростен,
чем программист ,работающий на интерпретаторном Бейсике, пытающийся
получить программу в 120К в памяти емкостью 60К. Но хуже всего то, что
интерпретаторы тихоходны. Ими затрачивается слишком много времени на
разгодывание того, что делать, вместо того чтобы заниматься действительно
делом.
При исполнении программных операторов, интерпретатор должен сначала
сканировать каждый оператор с целью прочтения его содержимого (что этот че-
- 13 -
ловек просит меня сделать?), а затем выполнить запрошенную операцию.
Операторы в циклах сканируются излишне много.
Рассмотрим программу:
10 FOR N=1 TO 1000
20 PRINT N,SQR(N)
30 NEXT N
При первом переходе по этой программе Бейсик-Интерпретатор должен
разгадать что означает строка 20:
1.преобразовать числовую переменную N в строку
2.послать строку на экран
3.переместить в следущую зону печпти
4.вычислить квадратный корень из N
5.преобразовать результат в строку
6.послать строку на экран
При втором проходе цикла все это разгадывание повторяется снова,
так как абсолютно забыты все результаты изучения этой строки какую-то
милисекунду тому назад. И так во всех следущих 998 проходах.
Совершенно очевидно, что если вам удалось каким-то образом
отделить фазу сканирования/понимания от фазы исполнения вы имели бы
более быструю программу. И это как раз то,для чего существуют компиляторы.
Компиляторы
Компилятор - это транслятор текста на машинный язык, который
считывает исходный текст, оценивает его в соответствии с синтаксической
конструкцией языка и переводит на машинный язык. Затем вывод на машинной
языке (машинный код), прогоняется как независимый шаг трансляции.Другими
словами, компилятор не исполняет программы, он их строит.Интерпретаторы
невозможно отделить от программ, которые ими прогоняются, компиляторы
делают свое дело и уходят со сцены.
При работе с компилирующим языком, таким как Турбо-Бейсик, вы
придете к необходимости мыслить о ваших программах в признаках двух
главных фаз их жизни: периода компилирования и периода прогона.
Улучшение показателей быстродействия, которое вы заметите при
использовании Т.Б., зависит от программы. Большинство программ будут
прогоняться в четыре-десять раз быстрее их интерпретаторных эквивалентов.
Если вы поработаете над улучшением то сможете достичь 100-кратного
повышения быстродействия. Оборотная сторона монеты состоит в том, что
программы, расходующие большую часть времени на возню с файлами на дисках
или ожидание ввода, не смогут продемонстрировать какое-то впечатляющее
увеличение скорости.
Номера строк и Турбо-Бейсик
Интерпретаторный Бейсик нуждается в такой нумерации строк,с помощью
которой он мог бы находить свой путь при исполнении посылок GOTO, GOSUB в
программной последовательности. Кроме того номера строк являются
сердцевиной его редактирования.
Допуская их, Т.Б. не нуждается в номерах строк. Вместо GOTO 5000,
в Т.Б. вы можете сказать что-то типа GOTO ERROR EXIT, где выход по ошибке
есть "метка" в начале подпрограммы выхода по ошибке.
Т.Б. с самого начала конструировался так, чтобы быть быстрым.
Эта цель была достигнута благодаря интегрированной конструкции, которая
одновременно удерживает в памяти компилятор, редактор и программу,
исключая бесконечные экскурсы к дисковводам, которые приводят к тому, что
обычные компиляторы осуществляют текстовую трансляцию в 10 или 20 раз
медленнее.
Выходящая за нормальные представления скорость компиляции Бейсика
- 14 -
такова (тысячи строк в минуту), что сохраняется интерактивность, присущая
Интерпретаторному Бейсику. Просто нажимантся R-клавиша и осуществляется
прогон программы Т.Б.
Примечание: Если для вас БЕЙСИК внове, продолжайте чтение и/или
практическое применение данного руководства. Однако бывалым Бейсик-
программистам, которые имеют намерение преобразовывать код
Интерпретаторного Б. в Т.Б., целесообразно заглянуть в Приложение D
"Сравнение Т.Б. с Интерпретаторным Б."
ГЛАВА 2
Турне по Турбо-Бейсику
В этой главе вы познакомитесь с азами использования Т.Б. Мы начнем
с некоторых базисных операций в Т.Б., включая установку Т.Б.,
использования системы меню, а также создание, прогон и редактирование
программы. Однако прежде чем вы начнете, необходимо внимательно
ознакомится с лицензионным соглашением, приведенным на передней странице
данного руководства. Это соглашение позволяет вам делать столько копий
программного диска, сколько вам необходимо только для вашего личного
пользования и целей резервирования.
Резервирование ваших дисков
Для того,чтобы обеспечить собственную безопасность,сделайте резерв-
ную копию диска распределения с помощью вашей программы копирования файлов
или дисков перед началом использования Т.Б. Обеспечив уверенность в том
,что все файлы переданы успешно,и после этого отправте оригинальный диск на
хранение в безопасное место.
Файлы на диске распределения
Ниже описываются файлы, которые вы только что скопировали с вашего
диска распределения.
TB.EXE полностью единая библиотека операционной среды /редактирова-
ния/ периода прогона Т.Б. настраивается и прогоняется, когда вы набираете
- 15 -
на клавиатуре TB и нажимаете ENTER. *.BAS образцовые прграммы Т.Б.
TBHELP.TBH содержит экраны помощи для использования Т.Б.
README.COM эту программу используют для чтения файла README.
README этот текстовый файл может быть просмотрен, если он есть,
на нем содержится современная информация, чем представленная в данном
руководстве. Используйте для набора или копирования текста на печатающем
устройстве README.COM
Установка
В системах с гибкими дисками копируйте TB.EXE на диск первичной
загрузки вместе с множеством утилитных программ DOS (например
CHRDSK, FORMAT), которые вы считаете необходимыми. Для хранения исходных и
исполнительных программ, которые вы будете создавать, используйте дисковвод
"В".
В системах с жесткими дисками создавайте новый справочник вне
корневой системы, назаваемый "TB", или что-то подходящее. Копируйте в ТВ
все файлы диска распределения. Если вы скупитесь на дисковое пространство,
копируйте только TB.EXE. Регистрируйте этот справочник, и вы готовы
приступить к работе, стандартная конфигурация с жестким диском адресуется
как дисковвод "С", а первый гибкий диск - как "A"; требуется команда
C>MD TB
C>COPY A:"*".TB
C>CD TB
C>TB
Чтобы пользоваться Т.Б. из других мест вашего жесткого диска,
настраивайте оператор прохода или копируйте файл TB.EXE в справочник, в
котором вы содержите системные программы, такие как CHDSK, FORMAT и
передовой Бейсик. Этот справочник часто называется BIN(более подрабно о
настройке проходов см. приложение 1 "Приспособление Т.Б."). За
детальной информацией по поводу создания и управления субсправочниками
обращайтесь к вашему руководству по DOS.
Настройка операционной среды
Если вам необходима какая-то специальная аппаратура, либо вы являе-
тесь разработчиком в деле обеспечения потребностей в динамической среде,
возможность устанавливать переменные среды предоставит вам определенный
выбор. Переменные среды фактически перекрывают компилятор и/или программные
опции и определяются использованием команды SET в DOS.
Переменные среды оказывают воздействие на среду в целом, в которой
исполняется какая-то программа. Следовательно после установки переменной
она остается действующей до тех пор, пока вы вновь не установите ее на
другое значение или не включите вашу машину. Если вы сочтете необходимым
устанавливать эти значения постоянно одинаковым образом, то можете
пожелать вводить команду SET в какой-то пакетный файл или в ваш
AUTOEXEC.BAT -файл (См. Приложение G "Основы DOS").
Переменные среды Т.Б. позволяют перекрывать вам опции периодов
компиляции и прогона для содержания 8087 и проверки "Показа" цветного
графического адаптера (CGA). Так в следущем примере вы устанавливаете вашу
среду для использования 8087, набирая в DOS-подсказке SET 87=YES (да),
где YES означает, что у вас есть 8087,что эта аппаратура не используется.
По умолчанию устанавливается YES.
В случае проверки показа CGA,вы должны набрать:
SET CGANOWCHK=NO
- 16 -
где NO приводит к отсутствию показа - проверки, а YES - к ее
выполнению. По умолчанию устанавливается YES.
Кoгда ваш компилятор начинает исполнение, осуществляется
фактический поиск по пространству переменных сред с целью получения
значения этих переменных.
Хотя в установке этих переменных нет необходимости, они доступны,
если у вас в них есть нужда. Если вы предпочитаете не выбирать их,
просматриваются файлы текущего справочника и создаются временные файлы для
хранения значений переменных по умолчанию.
Запуск Турбо-Бейсика
Когда у вас есть копия системы на вашем рабочем диске, а вы
находитесь в подходящем справочнике (или диске, если ваша система
базируется на гибких дисках), вводите TB при DOS-подсказке и нажимайте
Enter:
c>TB
и появляется первый экран Т.Б.:
рисунок 2-1. Главный экран Т.Б.
на полоске в верхней части экрана главного меню отображаются опции
ваших команд и четыре окна, редактирования, сообщение, отслеживание и
прогон. Вы можете выбирать любую статью из меню, нажимая соответствующую
заглавную букву (например, Е для редактирования), либо перемещая светящуюся
полоску с помощью клавиш стрелка вправо стрелка влево до желаемой опции, а
на экране выделяются в тексте жирным шрифтом.
Минутный эксперимент.
Выберите команду файла. Вытягивается ряд
опций, относящихся к файлам. Чтобы выбрать одну из этих опций снова
нажимайте первую букву опции или используйте стрелками вверх и вниз для
установки светящейся полоски и нажимайте Enter. Чтобы возвратиться к опциям
доступным из главного меню, нажимайте ESCAPE, в результате чего вы
вернетесь в главное меню независимо от того где вы находились в
Турбо-Бейсике нажатие несколько раз ESCAPE позволит вам вернуться в
главное меню (более детальную информацию смотрите в разделе ГЛАВЫ 3,
озаглавленой "Главное меню").
Следует заметить, что строка помощи в нижней части экрана
изменяется соответственно вашему нахождению в системе меню; если вы
чем-то озадачены прежде всего взгляните ее-там может быть та помощь,
в которой вы нуждаетесь. Если вам необходима дополнительная помощь,
нажимайте F1.
Некоторые статьи главного меню не имеют опций, кроме отображаемой.
Например, COMPILE(компилировать) просто обеспечивает компилирование вашего
загруженного файла; у этой статьи нет ни вытягиваемого меню, ни меню,
развертываемого вверх. Сдругой стороны статья FILE имеет вытягиваемое вниз
меню с несколькими опциями.
Практически, большую часть времени вы будете заниматься выбором из
трех одних и тех же меню:
.EDIT (редактирование) для создания и изменения исходных программ
.COMPILE (компилирование) для компилирования исходных программ в
исполнительную форму
.RUN (прогон) для исполнения программ или их компилирования,
если в этом есть необходимость
Более исчерпывающие пояснения системы меню и ее вытягиваемых меню
содержится в разделе "Главное меню" ГЛАВЫ 3 .
Естественный набор редактора
Прежде чем вы преступите к написанию программ, вы предпочтете
узнать кое-что о редакторе, которам вам предстоит пользоваться. Если вы не
знакомы ни с редактором Турбо-Паскаля ни с WORDSTAR или MultiMate, вам
достаточно прочесть этот раздел. Если вы уже знакомы с редактором этого
- 17 -
типа, переходите к разделу, озаглавленного "Первая программа" (если
захотите получить более подробные сведения, обращайтесь к разделу "Турбо-
редактор" ГЛАВЫ 3. Для тех из вас, кому необходимо изучить редактор,
целесообразно потратить время и немного попрактиковаться с его базисными
возможностями. (В таблице 2-1 просуммированы базисные команды). После
этого вы будете в состоянии сконцентрировать свое внимание на написании
программы в Т.Б., а не тратить свое время на изучение редактора. Имейте
ввиду, что помощь получиться в результате единственного удара по клавише
F1, будет выдавать вам контексно необходимую помощь, где бы в Т.Б. вы ни
находились.
Базисные операции
Выбирайте EDIT из главного меню,нажимая Е из любого места полоски
главного меню, либо нажимайте Enter при позиционировании на команде
редактирования. Прежде всего взгляните на состояние строки с целью
определить нахо дитесь вы в режиме INSERT (вставка) или
OVERWRITE (переписывание). Режим означает, что все вводимые с
клавиатуры литеры вставляются на курсорной позиции; существующий текст
перемещается вправо от курсора помере вашего набора литер. Когда
используется режим переписывания, каждая набираемая литера замещает ту,
которая в этот момент находится под курсором. Вы можете тумблерно включать
и выключать эти режимы с помощью клавиши INS (вставка) или клавиш Ctrl-V
(управление -V). Выбирайте такой режим который вы находите самым удобным
для пользования.
Теперь набирайте ваше имя и адрес, как вы делали это на конверте;
например
SAN SPADE
1264 CLINTON ST.
NEW YORK NY 12345
и нажимайте ESCAPE для завершения редактирования. Затем отправте
содержимое рабочего файла на хранение, выбирая FILE (нажимайте F при
каком угодно позиционировании в главном меню или Enter когда
позиционировано на FILE), а затем SAVE (хранение). Поскольку вы файл не
именовали, файлу по умолчанию будет присвоено имя NONAME.BAS.
Теперь вы можете перенаименовать файл, сохраняя то что находится в
редакторе под именем ADDRESA (если вы не специфицируете какое-то
удлинение, Т.Б. будет давать вашему файлу удлинение BAS).
Теперь используйте опцию NEW для стирания того, что вы набрали в
редакторе. Сперва нажмите F для вызова файла, а затем N для вызова новой.
Далее набирайте список из 5 ваших любимых блюд, каждое блюдо в отдельной
строке.
CHICKEN CURRY
SUSHI
BLECKENED SISH
CHIMICHANDAS
LUMPIA
Вновь заканчивайте сеанс редактирования (нажмите ESC) и выберите
FILE из главного меню, а затем LOAD (загрузка). При запросе имени файла
набирайте ADDRESS и вслед за этим Enter. Система запросит не хотите ли
вы сохранить текст в текущем рабочем файле. Вы не хотите, поэтому нажмите
No и заметьте, что происходит в окне редактора - предпочитаемые вами блюда
заменятся файлом ADDRESS.
Блоковые операции
- 18 -
Находясь в окне редактора, вы также можете пометить блок текста,
подлежащего стиранию, перемещению или копированию. Однажды помеченный блок
вы можете копировать в другое место текста, стирать его из текущего
местоположения или перемещать в другое место текста.
Пометка блока осуществляется просто, попытайтесь выполнить
пометку, сначала вновь выбрав команду редактирования. При нахождении в окне
редактора вашего имени или адреса, воспользуйтесь клавишами стрелками для
позиционировании курсора в верхнем верхнем углу. Пометьте начало блока
нажатием Ctrl-КВ (управление КВ). Теперь переместите курсор на последнюю
литеру последней строки вашего адреса и пометьте конец блока, нажимая
Ctrl-KK (управление КК).
Далее сделайте несколько копий данного блока так, чтобы у вас
получилось больше текста для манипулирования. Чтобы это осуществить,
переместите курсор в конец вашего адреса и копируйте блок, нажимая
Ctrl-КС (управление КС).
Перемещая курсор в конец вновь создаваемого текста, делайте другую
копию блока. Повторяйте этот процесс, пока не будете иметь целых десять
копий вашего адреса в окне редактора. Для перемещения по тексту внутри
окна редактора ползуйтесь клавишами стрелками PgUp (страница вверх) и
PgDn (страница вниз).
Теперь отметим новый блок. Воспользуйтесь строкой состояния в
верхней части окна редактирования для определения номера строки
на которой вы находитесь, вставте в файл новую строку 4, состоящую
из 20 литер Х. Далее сделайте строку 11 из 20 литер У.
Ваш новый блок будет занимать строки с 5 по 10. Отметьте его, как
и ранее, с помощью Ctrl-KW и Ctrl-KK. Чтобы создать блок,нажимайте Ctrl-KY
(управление KY), и вы теперь получите строку из X, за которой следует
строка из литер Y. Далее пометьте новый блок, который состоит из этих двух
рядов X,Y. Переместите курсор в конец текста, затем переместите сюда
новый блок, нажимая Ctrl-KV (проверяйте чтобы он перемещался, а не
копировался, используя PgUp и PgDn).
Блоковае операции можно выполнать с помощью нажатия меньшего числа
клавиш, пользуясь клавишей функций. Клавиши и их использование
отображаются в нижней части экрана. Заметьте, что клавишами F7 и F8
помечаются начало и конец блока, соответственно, чтобы пометить блок
переместите курсор в начало блока и нажмите F7. Затем переместите
курсор в конец блока и нажмите F8 для пометки конца блока.
Поиск и замена
Команда поиска и замены становится удобной, если вы решаете
изменить чего в вашей программе, после того как вы ее уже написали.
Например, чтобы показать вам как использовать эту команду, сотрем все, что
в данный мемент имеется в редакторе используя DEL (стереть), опцию NEW
(новый) или помечая блок), и наберем эту хорошо известную фразу:
TO BE OR NOT TO BE
THAT IS QUESTION
Теперь заменим каждые TO BE на TB. Сначала нажмите Ctrl-Q, a, затем
набирайте TO BE, когда вам подсказывается строка поиска. Нажмите Enter, а
затем, когда появится подсказка строки замены, набирайте TB. Далее вы
можете набирать определенные опции, подлежащие вашему выполнению во
время поиска. Для гловального поиска выбирайте G, выбирая N, тогда строка
замещается всюду без обращения к вам с вопросом о подтверждении при
каждой встрече с искомым, выбирая U для игнорирования различия между
верхним и нижним регистрами. После того как вы выберете все ваши опции,
нажимайте Enter. Выполняется поиск и замена и текст преобразуется в
следующий:
TB OR NOT TB
- 19 -
THAT IS QUESTION
Если просто желает е строку в тексте, вы можете воспользоваться
командой поиска (в противоположность поиску-QF) и вы получите подсказку на
строку поиска. Воспользуйтесь функцией поиска для нахождения первого
появления TB в предыдущем тексте. Затем воспользуйтесь Ctrl-L для
нахождения последующих по явлений.
Таблица 2-1 СВОДКА КЛАВИШНЫХ НАБОРОВ РЕДАКТОРА
----------------------------------------------
клавиши функции
----------------------------------------------
ESC выход из редактора
----------------------------------------------
клавиши-стрелки
- 30 -
PgUp
PgDn перемещение курсора
HOME,END
-----------------------------------------------
DEL стирание литеры под курсором
-----------------------------------------------
INS,Ctrl-V вкл./выкл. режима
вставка/переписывание
-----------------------------------------------
Ctrl-KB пометка начала блока
-----------------------------------------------
Ctrl-KK пометка конца блока
-----------------------------------------------
Ctrl-KH непомеченный блок
-----------------------------------------------
Ctrl-KC копирывание намеченного блока в
позицию намеченную курсором
-----------------------------------------------
Ctrl-KY стирание намеченного блока
-----------------------------------------------
Ctrl-KV перемещение намеченного блока
позицию ,указываемую текущим курсором
-----------------------------------------------
F1 помощь-информация
-----------------------------------------------
F2 хранить файл
-----------------------------------------------
F3 новый файл
-----------------------------------------------
F5 фокусировка
-----------------------------------------------
F6 переключать окна
-----------------------------------------------
F7 качать блок
-----------------------------------------------
F8 закончить блок
-----------------------------------------------
Первая программа
Теперь создадим с помощью редактора короткую программу. Выйдите
в главное меню и выберете файл, затем загрузите. При подсказке имени файла
введите MYFIRST и нажмите Enter. Далее для ввода редактора наберите Е. Вы
будете знать, что окно редактора задействовалось, поскольку его окно
- 20 -
получило двойную ограничительную рамку.
Для тех из вас кто имеет опыт работы с WORDSTAR или какими-то
другими программами, в которой используется эта управляющая
последовательность, такими как SAYDKIK KUTPAD, редактирование в Т.Б.
покажется приятным и легким.
Теперь набирайте в программу MYFERST то, что приводится ниже
в этом параграфе. Набирайте как можно точнее, поскольку Т.Б. не может
делать ничего другого кроме того, что вы ему сообщаете. Некоторые из вас
могут заметить изьян в этой программе-оставте это; позднее мы поясним
почему.
WHILE -1
FOR N=1 TO 8
READ AS
PRINT AS " ";
NEXT N
RESTORE
WEND
DATA PRESENTING,TURWE BASIC--,THE,FASTEST,BASIC,ON,EARTH
То что делает эту программу выглядящей иначе, чем программа на
бейсике, которые вы видели ранее, есть отутствие номеров строк.
Номера строк - это интегральная часть и редактирующих и
исполнительных программ Интерпретаторного Бейсика. Однако, поскольку Т.Б.
имеет встроенный экранный редактор, и поскольку он является компилятором,
номера строк являются слишком громоздким багажом, Т.Б. в некотором смысле
откровеннен по отношению к субьекту. Если вам нравится вы можете нумеровать
каждую строку или каждую третью строку, в прямом или обратном порядке, либо
вы можете выбрать для нумерации только те строки, которые являются
целевыми для GOTO или GOSUB, еще лучше, если вы можете воспользоваться
именуемыми метками.
На первых порах работа без номеров строк может показаться
странной, но по прошествии нескольких дней вы будете удивляться как это
вы так долго не могли без них обходиться.
Когда у вас уже будет введена MYFERST, откинтесь на спину стула и
на минутку полюбуйтесь на нее.
Вы только что создали исходную программу - на Т.Б. В памяти
вашего компьютера в этот момент находится сотня ASCII-кодов, которые
образуют MYFERST.BAS. Далее с этим текстом работает только редактор.
Однако эта программа есть только средство достижения конеуной
цели. Прежде чем ваш микропроцессорный чип семейства 8086 сможет
исполнить MYFERST, исходный текст должен быть оттранслирован или
компилирован в понятную для него форму; а именно, на машинный язык 8086.
Редакторская часть работы теперь заканчивается ,поэтому нажмите
ESC, чтобы покинуть редактор,и возвращайтесь в главное меню. В главном
меню становится видимой полоска выбора, указувающая, что вы уже можете
выбирать другую опцию.
В то время, как редактор временно находится вне выбора, работать с
ним вы не можете; однако текст вашей программы уже в памяти, готов для
добавления или изменения в любой момент. (Это демонстрируется быстрым
нажатием Е; нажатие ESC возвращает нас в главное меню).
Опции
Вы приблизились к тому, чтобы сделать второй большой шаг в
процессе создания программы: к компилированию вашей исходной программы в
исполнительную форму. Но прежде чем вы сделаете, необходимо установить
опцию компилятора. Для выбора меню опций нажмите О.
Соответственно смыслу их имен, различные варианты выбора меню
опций обеспечивает управление определенными аспектами доведения компиляции
до за вершения. С этой точки зрения, особенно если Т.Б. является вашей
- 21 -
первой встречей с кмпилирующим языком, некоторые из этих выборов
могут показаться чем-то фантастическим (Опции компилятора подробно
обсуждаются в ГЛАВЕ 3, в разделе, озаглавленном "Команда опций").
По правде говоря, сейчас ваш интерес ограничивается тоько опцией
разрыва клавиатуры, которая в данный момент выключена. При включенном
состоянии этой опции, однако, вы можете прервать большинство
программ (остановить ввод/вывод), генерируемых компилятором. При
отключенном состоянии этой опции, вы будете не в состоянии прервать
(через Ctrl-Break ) какую-то ни было из генерируемых компилятором программ.
Таким образом,чтобы предотвратить прогон MYFERST, нажимайте К (тумблерный
переключатель) для включения опции разрыва клавиатуры, а затем ESC для
возврата в главное меню.
Компилирование
Для завершения MYFERST нажмите С ( подобно редактору, компилятор
обрабатывает текущий рабочий файл). Компилятор быстро проверяет литеры
вашей программы и строит ее эквивалент на машинном языке. Эта фаза, даже
для простой программы вроде MYFERST, может занимать некоторыми Бейсик-
компиляторами время близкое к минуте.
Если в вашей исходной программе компилятором обнаруживается что-то
такое, что неприемлемо для программы для Т.Б. ,это найдет отражение в
строке состояния редактора, а вы автоматически будете введены в редактор
в точке ошибки. Если это с вами произойдет, нажимайте ESC редактируйте
вашу программу. Затем выходите из редактора и компилируйте повторно:
нажмите ESC затем С.
После компилирования
После успешного компилирования в памяти имеется две версии
MYFERST: (1)-исходная программа, которую вы создали с помощью редакто-
ра, (2)-результирующая, исполнительная программа на машинном языке 8086,
созданная компилятором. В окне сообщений Т.Б. дает некоторую статистику по
компилированию.
Статистика указывает в 16- ричных байтах размер сегмента в кодах
компилированной программы, размер стека и размер зоны данных. Отмечаются
также число заявлений и компилированных строк плюс величина свободного
пространства, оставшегося в памяти для компилирования. (Будьте уверены,
вам нет необходимости знать о 16-ричной системе, стеках и буферах для
написания программ на Т.Б. больше, чем необходимо знать об этих вещах,
работая с Интерпретаторным Бейсиком. Здесь есть необходимая информация, но
обычно вы в ней не нуждаетесь).
Прогон программы
Теперь, поскольку вы уже оттрансировали вашу исходную программу на
машинный язык, вы можете прогнать ее, нажимая R проверяйте вывод вашей
программы в окне прогона.
MYFERST прогоняется долю секунды, а затем все прекращается.
Это происходит по той причине, что мы умышненно включили в MYFERST
ошибку, чтобы сделать остановку: анализ, выполненный компилятором, не
обнаружил ничего, что могло бы привести к чему-то плохому при прогоне
программе. Компилятором главным образом проверяются синтаксические ошибки,
такие как неправильное написание команд, ненужные или пропущенные запятые
и несоответствующие друг другу скобки. Имеется целый класс ошибок, которые
могут случитться во время прогона от сбоя диска, математические
- 22 -
неточности, такие как квадратный корень из отрицательного числа.
Имейте ввиду, что некоторые ваши ошибки будут отлавливаться во
время компилирования, а другие не всплывут на поверхность до периода
прогона программ.
Об ошибке
В дополнение к сообщению о возникновении ошибки вне данных, Т.Б.
так- же показывает, где именно это случилось, помещая вас в точку ошибки
в редакторе. Поскольку MYFERST.BAS еще находится в памяти, это происходит
быстро.
Компилятор автоматически сооющает где произошла ошыбка в соответ-
ствующем месте исходного файла.
То плохое, что есть в этой строке, состоит в том что вы
считывали только семь констант, а не восемь. Измените цикл FOR /NEXT на
останов на 7, и будете иметь рабочую программу.
Нажмите ESC затем R сначала для компилирования, а затем для
прогона исправленной версии. Т.Б. распознает, что вы изменили исходную
программу после последней компиляции и автоматически перекомпилирует
MYFERST перед ее прогоном. Когда вы свыкнитесь с клавишныим наборами, то
найдете, что для перехода от редактирования к исполнению и наоборот
достаточно каких-то секунд.
Теперь MYFERST проходит во всей ее красе. Вновь проверьте вывод в
ок не прогона и нажмите ALT-F5 (изменить F5) для фокусировки окна
в перемежающихся режимах.
Когда вы получите удовлетворение от своей программы, прервите ее
нажатием Ctrl-Break, затем ESC для возврата в главное меню.
Хранение на диске
Итак все что вы сделали находится только в памяти, если бы имел
место сбой питания, или ваша программа зависла, потерялись бы и исходная и
исполнительная программы MYFERST. Поэтому программисты отправляют свои
исходные программы для хранения на диске, используя команду SAVE. Также
поступите и вы. Можно заметить взрыв активности на дисковводе,
используемому по умолчанию в процессе перезаписи MYFERST.BAS (вы можете
также воспользоваться опцией автоматического хранения, доступной в меню
настройки,для автоматического хранения вашего файла, реализуемого перед
прогоном программы).
Для проверки того, что файл MYFERST.BAS,существует теперь в вашей
файловой системе, используйте опцию DIRECTIRY(справочник) из файлового
меню. Нажатие D вызывает ответ:
Enter mask (введите маску)
Т.Б. требует определенного сорта файловый дескриптор, который вы
должны включить в DOS-команду DIR; например *.BAS или MYFERST.BAS.
Нажатие Enter вызывает появление каждого файла, как будто вы уже набрали
*.*.
Хранение исполнительной программы
Хранение исполнительной (на машинном языке) формы MYFERST на диске
представляет собой совершенно иной предмет. Действительно, вы не увидите
ничего ни в одном меню, касающееся хранения исполнительной программы. Если
вы создаете программу для собственного пользования, то у вас может не быть
необходимости хранить ее вообще. К чему хлопоты, если ее можно создавать
заново каждый раз? Однако придет время, когда вам захочется иметь
какую-то постоянную форму компилированной программы.
Т.Б. дает вам возможность генерировать самостоятельную программу
- 23 -
(файл с удлинением .EXE), которую можно исполнять непосредственно при
DOS-подсказке. Так вы можете поступить и с MYFERST, установив
компилирование включения в меню опций. Прежде всего, для получения входа в
меню опций нажмите О, а затем С для компилирования. Выбирайте установку
исполнительного файла, нажатием Е. При этом на диске еще ничего не
изменяется - выполненное вами изменение состоит в том, что компилятор
будет делать следующиц раз при вовлечении его в работу. Режим умолчания,
который вы используете далее, состоит в компилировании в память.
Для выхода из меню опций нажмите ESC затем С для перекомпилирования
MYFERST. В это время компилирование идет медленее, поскольку Т.Б. физически
осуществляет запись на дисковводе. Чтобы посмотреть результирующий файл, уй-
дите вовсе из Т.Б., сначала перейдя к файловому меню, а затем нажав Q.
Сразу
же возвращайтесь на DOS-уровень,ввода С>DIR MYFERST
Вы увидите обе формы вашей программы, исходную и исполнительную.
Исполнение MYFERST из DOS
Вероятно вы уже знаете, что файлы с удлинением .EXE используются
операционной системой непосредственно. Если при DOS-подсказке вы вводите
имя файла
C>MYFERST
Это приводит к прогону MYFERST с выдачей той же программы, которую
вы видели раньше. Если в это время вы прервали программу с помощью
Ctrl-Break, то возвратитесь в DOS.
Трассировка вашей программы
Вернемся теперь в среду Т.Б. и вашего файла MYFERST, набирая в
подстроке DOS строку TB MYFERST. Чтобы попробовать все, что есть в
главном меню, попытаемся трассировать вашу программу.
В окне TRASE (трассировка) будут перечисляться любые номера
строк, либо имена процедур или функций, имеющихся в вашей прорамме, поэтому
добавляйте к MYFERST номера строк, чтобы иметь возможность осуществить ее
трассировку.
Чтобы трассировать или проследить в шаге вашу программу по мере
ее прогона, нажмите D для перехода в меню DEBUG(отладка). Для получения
опции TRACE (трассировка) используйте клавиши-стрелки или нажмите I, а
затем тумблерно включите ЕЕ, нажав Enter для выхода из меню отладки
нажимайте ESC, а затем R для прогона. Поскольку вы перемодифицировали
вашу программу, перед прогоном она будет автоматически перекомпилироваться.
Для контроля следите за окном трассировки.
Заметьте, что вы также можете трассировать вашу программу помещая
в нее, при ее написании, компилярную директиву TRASE.
Для среды программирования Т.Б. обеспечивает четыре окна:
.окно редактирования позволяет создавать/редактировать любые ваши
программы.
.окно трассировки (когда оно тумблерно включается) обеспечивает пе-
речисление каждого номера программной строки, метки и имени процедуры и
функции по мере прогона вашей программы.
.в окне сообщений отображаются статистики компилирования и другие
сообщения.
.в окне прогона отображается вывод вашей программы.
Эти окна можно использовать в любой конфигурации, но
фокусироваться (один из способов состоит в нажатии FS) могут только окна
редактирования и прогона.
В любое время нахождения в системе меню вы можете переключать вашу
точку обзора и реконфигурировать размер и положение окон.
Вы также можете непреравно изменять окно таким образом, что при
каждом начальном возбуждении системы будет использоваться предпочитаемая
- 24 -
вами планировка окна. (Обращайтесь к процедуре SAVE OPTIONS/WINDOW/SETUP в
разделе "Настройка меню"ГЛАВЫ 3) .
Чтобы открыть окно выбирайте из меню WINDOW OPEN, затем
осуществляйте выбор того окна, которое вы предпочитаете задействовать.
Нажимая STROLL LOCK вместе с Shift и клавишами стрелками.
Вы можете перемещать выбранное вами окно в любое положение на экра-
не. Опция TILE (израсцы) автоматически делает все открытые окна видимыми
в одинаковом размере (другими словами они занимают равные части экрана).
Опция STACK позволяет располагать все открытые окна столбиком, или слоем
при максимально возможном размере. Задействованное окно находится на
верху; видима только часть других открытых окон. Опция ZOOM (фокусировка)
дает возможность вам фокусировать окна редактирования и прогона на весь
экран. С помощью опции CLOSE, выбранное окно делается невидимым. За более
детальной информацией об изменении размеров "перемещениях" окон обращайтесь
к разделу "Команды окон" ГЛАВЫ 3".
Конец турне
Это и все ваше вводное турне по Т.Б. Кратко напомним шаги
предпринимаемые при создании и тестировании программ:
-вызывается TB.EXE и специфицируется исходная программа, с которой
вы будете работать. Если необходимо устанавливаются любые требуемые опции
компилятора. Затем редактируется рабочий файл. После подготовки к
тестированию с целью компилирования программы нажимаются R и C. Если
компилятор обнаруживает какие-то синтаксические ошибки, вы выпадаете в
редактор в точке возникновения ошибки.
-если исходный файл свободен от синтаксических ошибок (т.е. он
прокомпилирован успешно), осуществляется прогон. Если вы ожидаете
результат, сохраните исходную программу и повторяйте весь цикл. Вы также
можете выбрать компилирование рабочей программы в форму .EXE - файла.
На диске распределения вы найдете несколько простых программ.
Возможно вы найдете целесообразным изучить эти программы, т.к. они
отображают несколько демонстрационных аспектов Т.Б., отличающихся от
присущих интерпретаторному Бейсику либо в нем не представляемых.
Функция STICK
--------------
функция STICK возвращает информацию о положении ручек управления
-------
синтаксис y=STICK(опция)
---------
замечание Опция-это целое выражение в диапазоне от 0 до 3,которое
--------- оказывает следущее действие:
----------------------------------------------------------------
Опция Действие
----------------------------------------------------------------
0 возврашается X-координата для ручки управления А
1 возвращается Y-координата для ручки управления А
2 возвращается X-координата для ручки управления В
3 возвращается Y-координата для ручки управления В
-----------------------------------------------------------------
Примечание:исходя из особенностей конструкции интерфейса ручек уп-
равления,вы должны вначале исполнить STICK(0)для триггерного переключения
процесса считывания прежде чем сможете считывать один из размеров одной из
ручек.
СМ. также STRIG
Пример:'опросить ручки управления с целью определить
'их текущее положение
while not instat
locate 15,15
print stick(0),stick(1),stick(2),stick(3);
wend
end
Оператор STOP
-------------
функция STOP останавливает программу
-------
синтаксис STOP
----------
замечания STOP прекращает работу программы и возвращает управление к
---------- операционной системе (или Т.Б.,в зависимости от того,откуда
она запускалась).То же самое делается с помощью оператора END и оно пред-
почтительнее.
различия В отличие от И.Б. ,однажды остановленные программы Т.Б.
-------- продолжены быть не могут
См. также END
Пример :
'настроить бесконечный цикл
DO
'ОСТАНОВИТЬ если нажимается клавиша
IF INSTAT THEN STOP
LOOP
END
Функция STR$
-------------
функция STR$ возвращает строчный эквивалент числа.
-------
синтаксис s$=STR$(числовое выражение)
-186 -
----------
замечания STR$ возвращает строчную форму числовой переменной или
выражения;т.е.,возвращает тот,что вы могли бы видеть на экране при обра-
ботке оператором PRINT.Если числовое выражение больше нуля ,STR$ добавляет
передний пробел ;например STR$(14) возвращает трехмерную строку,в которой
первая литера есть пробел.Дополнительной функцией является VAL,которая
принимает строчный аргумент и возвращает число.
См.также VAL
Пример :'установить а% для числа
a%=56.789
' использовать STR$ для возврата числового значения a$
a$=str$(a%)
print a%,a$
'тестировать,с целью увидеть ,что а% имеет то же значение,что и а$
if a%=val(a$) then
print "str$ и val работают"
end if
end
Функция STRIG
----------------
функция STRIG возвращает состояние кнопок ручек управления.
-------
синтаксис y=STRIG(опция)
---------
замечания Функция STRIG возвращает информацию триггера ручек управ-
--------- ления в соответствии со значением опции.Опция-это целое
выражение,которое управляет действием,выполняемым функцией STRIG согласно
следущей таблице:
------------------------------------------------------------------
Опция Действие
------------------------------------------------------------------
0 если кнопка 1 ручки управления А была нажата с момента пос
ледного вызова STRIG(1),то STRIG возвращает -1;иначе возвращается 0.
1 STRIG возвращает -1 ,еслив данный момент кнопка 1 ручки управле-
ния А находиться в нижнем положении;если нет,возвращается 0.
2 Если кнопка 1 ручки управления В нажималась с момента последнего
вызова STRIG(2) ,STRIG возвращает -1;иначе 0.
3 STRIG возвр.-1,если кнопка 1 ручки управления В находиться в ниж-
нем положении ;иначе возвращается 0.
4 Если кнопка 2 ручки упр.А нажималась с момента последнего вызова
STRIG(4),STRIG возвращает -1;иначе 0.
5 STRIG возвращает -1,если в данный момент кнопка 2 ручки управл.А
находиться в нижнем положении;иначе возвращается 0.
6 Если кнопка 2 руч.упр. В нажималась с момента последнего вызова
STRIG(6),то STRIG возвращает -1,иначе 0.
7 STRIG возвращает -1,если в данный момент нажата кнопка 2 ручки
управления В;иначе возвращается 0
-------------------------------------------------------------------
Перед осуществлением любого вызова функции STRIG ,вы должны обеспечить
доступ для проверки ручек управления с помощью оператора STRIG ON.
Для считывания положения самой ручки управления используйте функцию
STICK.
См.также STICK
Оператор STRIG
----------------
функция STRIG управляет проверкой событий на кнопка ручек управления.
-------
-187 -
синтаксис
STRIG {ON!OF!STOP}
----------
замечания STRIG включает проверку событий на триггере таким обра-
----------- зом,что могут осуществляться запросы по функцииSTRIG и
отслеживание ,выполняемое подпрограммой,которая специфицируется в опе-
раторе ON STRING.
STRIG OFF выключает проверку событий на триггере.STRIG STOP удержи-
вает программу от ответов на событие на триггере,но обеспечивает сохране-
ние памяти о таком событии,так что если позднее используется STRIG ON
,захват этого события осуществляется немедленно.
См.также ON STRIG
Пример:
'включить проверку событий
STRIG (0) ON
STRIG (2) ON
STRIG (4) ON
STRIG (6) ON
WHILE NOT INSTAT
LOCATE 1,1
PRINT STRIG (0),STRIG (1),STRIG (2),STRIG (3)
PRINT STRIG (4),STRIG (5),STRIG (6),STRIG (7)
WEND
END
Функция STRING$
-------------------
функция STRING$ возвращает строку ,состоящую из множества копий
------- указанной литеры.
синтаксис s$=STRING$(счетчик,{значение!строчное выражение})
----------
замечания Счетчик и значения -это целые выражения.Счетчик может
--------- быть в диапазоне от 1 до 32767;значение-от 0 до
255.STRING$ с числовым аргументом возвращает строку литеры с кодом по
ASCII,количество копий которой равно счетчику.
STRING$(n,32),STRING$(n," ") и SPACE$(n) делают одну и ту же
вещь-выдают строку,состоящую из n пробелов.
Пример 'рамка строится с помощью STRING$ и TAB
верх$=string$(40,61)
print верх$
delay 1
for i=1 to 5
print tab(1) "=" tab(40) "="
delay 1
next i
delay 1
print верх $
delay 1
locate 4,15
print "середина"
delay 1
locate 20,1
end
Операторы SUB/END SUB,SUB INLINE
----------------------------------
функция SUB/END SUB и SUB LINE определяют процедуру
--------
синтаксис SUB идентификатор [(список параметров)]
--------- [locate список переменных]
[static список переменных]
-188 -
[shared список переменных]
.
. операторы
.
[exit sub]
end sub
Для оператора SUB INLINE:
SUB процимя INLINE
замечания Идентификатор -это уникальное имя,подлежащее ассоциирован
--------- ию с процедурой,которое должно соответствовать соглашени-
ям об именовании меток и переменных.Список параметров-это опциональ-
ная,разделяемая запятыми последовательность формальных параметров.Парамет-
ры,используемые в списке аргументов,служат только для опоеделения процеду-
ры; они не имеют никакой взаимосвязи с другими переменными программы,имею-
щими то же имя.
SUB и END SUB ограничивают и именуют похожую на подпрограмму группу
операторов,называемую процедурой (или подпрограммой),которая возбуждается
оператором CALL и опционально обеспечивается подачей в нее параметров по
значению или посредством ссылки.
При внутристрочном программировании с использованием языка ассемб-
лера применяется та же последовательность вызова,что и применяемая для
обычных процедур.Например:
CALL процимя [(список параметров)]
SUB процимя INLINE
$INLINE список_байтов
$INLINE "ком-файла_имя"
END SUB
Можно специфицировать любое число операторов $INLINE в любом поряд-
ке.Единственным ограничением является максимум в 16 Ком-файлов в любой од-
ной процедуре.
Заметьте 6что вы не специфицируете список параметров в SUB-опреде-
лении.
Список байтов образуется из констант и выражений,равных целому в
диапазоне от 0 до 255,которые разделяются запятыми.(Обычно для байтов вы
будете пользоваться шестнадцатиричными константами).
Нет необходимости в возврате ни в ваш код на языке ассемблера,ни в
конец SUB.За этим следит компилятор.(За более подробной информацией обра-
щайтесь к приложению С "Интерфейс языка ассемблера".
Определения процедур и программный поток
----------------------------------------
Местоположение определения процедур несущественно.Процедура может
определяться в строке 1 или строке 1000 программы вне зависимости от то-
го,где она используется.И вам нет необходимости направлять программный по-
ток через процедуру в качестве какого-то шага возбуждения-компилятор разг-
лядит ваши определения,где бы они ни были.
Также ,в отличие от подпрограмм,исполнение не может случайно по-
пасть в процедуру.Для всего,что касается исполнительного прохода програм-
мы,определения функций и процедур являются невидимыми.Например:
CALL вывод материалов
SUB вывод материалов
PRINT "выведено"
END SUB
Когда исполниться эта программа 6сообщение появляется только однаж-
ды,поскольку Вывод_материала вызывается в первой строке.
Определения процедур должны трактоваться как изолированные островки
кода в которые не осуществляется переход и из которых нет перехода,реали-
зуемого с помощью операторов GOTO,GOSUB или RETURN.Однако внутри определе-
ний такие операторы законны.Следует отметить ,Что определения функций и
процедур нельзя гнездовать;т.е. вы не можете определить процедуру или фун-
кцию внутри другой процедуры или функции (хотя определение процедуры и
функции может содержать вызовы других процедур и функций).
Параметры массивов
------------------
Параметры массивов заявляются заключением в скобки числа размернос-
-189 -
ти параметра массива.Например,SUB расчмассив (а(2),размер1,размер2)- заяв-
ляет ,что расчмассив ожидает три аргумента:двумерный массив единичной точ-
ности и две скалярные переменные единичной точности.Обычно эти скалярные
аргументы используются для подачи размера по двум измерениям массива а.
Заявление локальных переменных
------------------------------
Чтобы заявить локальные переменные в пределах процедуры,использует-
ся оператор LOCAL ,который должен находиться впереди исполнительных заяв-
лений определения.Например:
LOCAL a%,b#,БОЛЬШОЙМАССИВ%()
создает три локальные переменные:скалярные переменные a% и a#,а
также целый массив большоймассив%.Далее массив должен быть надлежащим об-
разом образмерен:
DIM DYNAMIC большоймассив% (1000)
Локальные массивные переменные должны быть динамическими.Они авто-
матически снимаются с размещения когда процедура завершается.
Статические и разделяемые переменные
------------------------------------
По умолчанию,переменные ,которые появляются в определениях проце-
дур,имеют атрибут локальности.Однако ,поскольку это умолчание является из-
меняемым обьектом,вы должны предпринимать усилия для заявления каждой пе-
ременной,используемой в процедуре.
Для заявления переменных ,которые являются глобальными для осталь-
ной программы,используется оператор SHARED.
Если важно,чтобы переменная не теряла своего значения при каждом
возбуждении ,она заявляется с использованием оператора STATIC.
Лпределение процедуры должно завершаться END SUB,которое возвращает
управление оператору ,стоящему после возбуждающего оператора CALL.Для воз-
врата из определения процедуры в каком-либо ином месте,чем ее конец,ис-
пользуется оператор EXIT SUB.
см.также $INLINE
CALL
EXIT SUB
LOCAL
SHARED
STATIC
Пример
DIM массив(1)
SUB тестпроцедура(I%,L&,S!,D#,E,A(1))
PRINT I%,L&,S!,D#,E,A(0)
END SUB
целое%=1
длинноецелое&=2
единичнойточности!=3
двойнойточности #=4
массив(0)=5
CALL тестпроцедура (целое%,длинноецелое&,единичнойточности!,двой-
нойточности#,целое%,массив())
END
Оператор SWAP
-------------
функция SWAP обменивает значения двух переменных
-------
синтаксис SWAP пер1,пер2
-----------
замечания пер1 и пер2 -это две переменные одного и того же типа.Если вы по-
пытаетесь обменять переменные разных типов(например,строчную и целую или
единичной точности и двойной точности),то возникает ошибка 475,"Несовпаде-
ние типов".
SWAP удобно роскольку простой обмен переменных в двух последова-
-190 -
тельных операторах назначения не обеспечивает выполнения этой работы:
а=в:в=а
В то время,когда вы делаете второй оператор,переменная а не содер-
жит значения,для которого она используется.Чтобы выполнить эту работу без
SWAP,требуется временная переменная и третий оператор:
врем=а:а=в:в=врем
Пример:
а%=15:b%=17
print tab(6) "значение 'а%' есть :";a%_
tab(42) "значение 'b%' есть :"b%
swap a%,b%
print "значение а% теперь :";a%_
tab(38) "значение b% теперь:";b%
end
Оператор SYSTEM
---------------
функция SYSTEN завершает работу программы
-------
синтаксис SYSTEM
---------
замечания SYSTEM прекращает работу программы и возвращает управле-
ние операционной системе(или Т.Б.,в зависимости от того,откуда она возвра-
щается).Оператором END достигается то же самое и оно предпочтительнее.
См.также END
STOP
Пример
FOR I=1 TO 10
INPUT "Пожалуйста введите число между 1-10";X%
IF X%=отв% THEN GOTO награда
INPUT "Не желаете ли попробовать другое число Д/Н)";X$
IF UCASE$(X$)<>CHR$(89) THEN SYSTEM
NEXT I
награда:
PRINT "Вы добились этого !"
END
Функция TAB
------------
функция TAB табулирует до специфицированной позиции вывода n (ТОЛЬ-
------- КО В ОПЕРАТОРЕ print).
синтаксис PRINT TAB(n)
---------
замечания n-это целое выражение в диапазоне от 1 до 80.
Подобно SPC,функция TAB может использоваться только в списке выра-
жений операторов PRINT,LPRINT или PRINT#.Используйте TAB для выстраивания
в линию колонок информации.TAB вызывает подпрограммы выдачи на экран Т.Б.
с целью вывода n-ой позиции текущей строки.Если текущая позиция курсора
уже находиться за n-ой колонкой(например,PRINT TAB(20)при курсоре в колон-
ке 30),то Т.Б. обеспечивает переход вниз к n-й позиции следующей строки.
Если TAB паявляется в конце списка выражений оператора PRINT с пос-
ледующей точкой с запятой или без нее,Т.Б. не выводит возврат каретки;т.е.
после TAB подразумевается точка с запятой.
См.также LPRINT
PRINT#
SPC
пример:
-------
-191 -
DIM друг$(1),телефон$(1)
PRINT TAB(5) "имя" TAB(40) "телефон"
FOR I=1 TO 5
READ друг$
READ телефон$
PRINT TAB(5) друг$ TAB(40) телефон$
NEXT I
END
DATA "Джон","423-45698"
DATA "Энн","333-55566"
DATA "Марк","222-33355"
DATA "Ник","111-57575"
DATA "дфк","555-77777"
Функция TAN
-----------
функция TAN возвращает тригонометрический тангенс
--------
синтаксис Y=TAN(числовое выражение)
---------
замечания Числовое выражение -это угол ,специфицируемый в радиа-
--------- нах.TAN возвращает значение двойной точности .
См.также ATN
COS
SIN
пример
------
DEFDBL а-z
nи=atn(1)*4
PRINT nи
PRINT TAN(nи/4)
END
Cистемная переменная TIME$
--------------------------
функция TIME$ считывает и устанавливает системное время
--------
синтаксис Для считывания времени:
--------- S$=TIME$
для установки времени :
TIME$=строчное выражение
замечания Системная переменная TIME$ содержит восьмилитерную строку
,которая представляет время по системным часам в форме ЧЧММСС,где ЧЧ-часы
ММ-минуты и СС-секунды.TIME$ не может быть точным,если во время последнего
первичного возбуждения компьютера не были правильно установлены DOS-часы.
Системные часы устанавливаются назначением TIME$.Вводится строчное
выражение содержащее информацию о времени в военном формате (24 часа) ,ко-
торое затем назначается в TIME$.Информацию о минутах может опускаться.Нап-
ример:
TIME$="12" 'установка часов на 12 дня"
TIME$="13:01" 'устан-ка часов на 1:01 пополудни"
TIME$="13:01:30" 'установка часов на 30 сек позднее 1:01
TIME$="0:01 'установка часов на одну минуту после полуночи
Если размер часа 6минут или секунд находиться вне диапазона(напри-
мер,значение минут равно 61),возникает ошибка периода прогона,Вызов неза-
конной функции.
-192 -
Используйте функцию TIMER$для возврата числа секунд,истекших с мо-
мента первичного возбуждения системы.
Пример:
-------
TIMER ON
PRINT "Сейчас время ";TIME$
INPUT "Пожалуйста ,установите новое время(от 0 до 23)";ANS$
TIME$=ANS$
PRINT "Новое время ";TIME$
END
Функция TIMER
-------------
функция TIMER возвращает число секунд от полуночи
--------
синтаксис y=TIMER
---------
замечания TIMER не имеет аргументов и возвращает количествосе-
кунд,истекших от полуночи как значение единичной точности с плавающей точ-
кой,разрешающая способность которого дает примерно одну десятую секун-
ды.Если системное время после последнего первичного возбуждения не уста-
навливалось(с помощью DOS-команды TIME или системной переменной Т.Б.
TIME$),TIMER возвращает число секунд с того момента,когда система получила
первичное возбуждение.
См.также MTIMER
Пример TIME$="12"
PRINT USING "Сейчас ##### секунд после полуночи";TIMER
END
Оператор TIMER
--------------
функция TIMER управляет проверкой таймерных событий.
-------
синтаксис
TIMER {ON!OFF!STOP}
---------
замечания TIMER управляет проверкой таймерных событий;т.е. обеспе-
чивает принятие решений о том,будет ли передаваться управление подпрограм-
ме,определенной в операторе ON TIMER ,по истечении назначенного числа се-
кунд.
TIMER ON включает проверку таймерных событий,но обеспечевает запо-
минание событий на таймере таким образом,что если позднее выдается TIMER
ON ,захват в ловушку происходит немедленно .
См.также ON TIMER
Пример
-------
ON TIMER (2) GOSUB обновитьчасы
TIMER ON
WHILE NOT INSTAT:WEND
END
обновитьчасы:
хранитьХ%=CSRLIN 'хранить положение курсора
хранитьY%=POS(0)
LOCATE 24,36
PRINT TIME$
LOCATE хранитьХ%,хранитьY% 'восстановить курсор
RETURN
Команды TRON и TROFF
-193 -
--------------------
функция TRON и TROFF включают и выключают трассировку исполнения
------- программы .
синтаксис TRON (трассировку включить)
--------- TROFF (трассировку выключить)
замечания TRON помещает вашу программу в режим отладки,в котором
номера строк,метки операторов,имена процедур и функций в исходной програм-
ме посылаются в окно трассировки по мере исполнения каждого операто-
ра;TROFF выключает отладочный режим.
При прогоне в Т.Б. в текстовом режиме трассируемые номера строк
,метки имена процедур ит.д.
посылаются в окно трассировки.
Для изменения между трассированием и исполнением во время трасси-
ровки нажимайте ALT-F10.
Различия В отличии от И.Б. ,в Т.Б. физическое положение TRON и
TROFF в вашей исходной программе управляет их действием,а не их положением
в исполнительном проходе периода прогона.Рассмотрим,например,эту программу:
10 GOTO 30
20 TRON
30 X=Y+X
40 TROFF
50 END
При исполнении этой программы И.Б. никогда не включает трассиров-
ку,поскольку для него все,что касается оператора TRONв строке 20 6не су-
ществует.С другой стороны,Т.Б. принимает решения о включении/невключении
трассировки во время компилирования и рассматривает все операторы,идущие
после подавления TRON,как подлежащие включению на трассировку.Поэтому
программа,созданная на Т.Б.,будет выводить:
[30] [40]
при прогоне представленной выше программы.
Пример
------
10 X=0:Y=1:Z=2
20 GOTO 40
30 TRON
40 X=Y+Z
50 PRINT
60 TROFF
70 END
Функция UBOUND
--------------
функция UBOUND возвращает наивысшую границу ,возможную для специфи-
------- цированного размера массива(наибольший подстрочный индекс)
синтаксис UBOUND(массив[,размер])
----------
замечания массив-это массив,который образмеривается;размер-это
--------- целое от 1 до числа размерностей в массиве.
Чтобы найти нижнюю границу массива,используйте функцию LBOUND.
См.также LBOUND
OPTION BASE
пример
------
DIM массив%(1900:2000)
FOR индекс%=LBOUND(массив%) TO
UBOUND(массив%)
PRINT "массива элемент (":индекс%;")есть";
массив%(индекс%)
NEXT индекс%
-194 -
END
Функция UCASE$
--------------
функция UCASE$ возвращает всю строку в верхнем регистре.
--------
синтаксис S$=UCASE$(строчное выражение)
---------
замечания UCASE$ возвращает строку равную строчному выражению за
исключением того,что все алфавитные литеры нижнего регистра строчного вы-
ражения преобразуются в верхний регистр.
См.также LCASE$
Пример PRINT UCASE$ ("Быть или не быть...")
Функция VAL
-----------
функция VAL возвращает числовой эквивалент строки.
-------
синтаксис Y=VAL(строчное выражение)
----------
замечания Функция VAL обращает ее строчный аргумент в число.Если
строчное выражение начинается с числовых литер (0-9,+,-,.,E,D)6но содержит
также нечисловые литеры,VAL возвращает число вплодь до нечисловой лите-
ры.Если строчное выражение не начинается с числовой литеры,VAL возвращает
0.(Пробел и табуляция игнорируются).
VAL часто является частью подпрограмм ввода,поскольку она позволяет
программе осуществлять подсказку пользователю на строчные данные.Затем она
обращает данные в числовую информацию по мере необходимости без риска вво-
да вами нечисловых данных в числовые переменные и появления беспорядочных
ошибок ?REDO FROM START(переделать с начала)
См.также STR$
пример
------
A$="34 N главная улица"
B$="правильно,тридцать четыре"
C$="+3.4e1
D$=" 123 до"
PRINT VAL(A$),VAL(B$),VAL(C$),VAL(D$)
END
Функция VARPRT
--------------
функция VARPRT возврашает адрес переменной.
-------
синтаксис Y=VARPRT(переменная)
---------
замечания Переменная- это любая числовая или строчная переменная,ли-
--------- бо элемент массива.
Такая адресная информация иногда называется "указателем";напри-
мер,VARPRT(X) означает,что требуется возвратить "указатель x".
Поскольку программами Т.Б. используется модель расширенной памя-
ти,для полного определения адреса переменной требуется еще и
VARSEG.(VARSEG возвращает сегментную часть адреса).
VARPRT большей частью используется для обеспечения подпрограммы на
языке ассемблера информацией о положении переменной в памяти.
-195 -
См.также VARSEG
Пример
B%=55
DEF SEG =VARSEG(B%)
адрес%=VARPRT(B%)
PRINT PEEK(адрес%)
END
Функция VARPRT$
---------------
функция VARPRT$ возвращает указатель переменной в строчной форме.
---------
синтаксис s$=VARPRT$(переменная)
---------
замечания Переменная-это любая числовая или строчная переменная,ли-
--------- бо элемент массива.VARPRT$ возвращает указатель
переменной в строчной форме и используется в операторах PLAY и DRAW для
указания имен переменных в командных строках.
См.также DRAW
PLAY
VARSEG
Пример
'включить графический режим средней разрешающей способности
SCREEN 1
домик$="U20 G5 E20 F20 H5 D20 L30"
DRAW домик$
DRAW "BE3"
DRAW P1,3"
FOR I%=1 TO 280 STEP 40
DRAW "M="+VARPRT$(I%)+".40"
DRAW домик$
NEXT I%
END
Функция
VARSEG
--------------
функция VARSEG DJPDHFOFTN CTUVTYNYSQ FLHTC GTHTVTYYJQ
--------
синтаксис
Y=VARSEG(переменная)
---------
замечания Переменная- это любая числовая или строчная переменная,ли-
бо элемент массива.В силу расширенной модели памяти Т.Б.,для полного опре-
деления адреса переменной VARSEG требуется вместе с VARPRT.
VARSEG возвращает числовое значение в диапазоне от 0 до 65535.Для
получения адреса переменной таким образом,чтобы с помощью CALL подпрограм-
ме на языке ассемблера можно было сообщить где подлежащий его обработке
аргумент располагается в памяти,используйте VARSEG в сочетании с VARPRT.
Программы Т.Б. помещают все немассивные переменные в единственный
сегмент,который может иметь длинну до 64К.Следовательно,посредством приме-
нения VARSEG на всех немассивных переменных данной программы всегда дает в
ответ одно и то же значение.Фактически это сегментное значение является
умолчанием для операторов,которые доверены DEF SEG (например, PEEK,POKE).
См.также VARPRT
Пример
B%=55
DEF SEG=VARSEG(B%)
адрес%=VARPRT(B%)
PRINT PEEK(адрес%)
END
-196 -
Оператор VIEW
-------------
функция VIEW определяет активную зону(обзорные границы) графическо-
------- го экрана.
синтаксис VIEW [[SCREEN][(X1,Y1)-(X2-Y2)[,[цвет[граница]]]]]
---------
замечания (X1,Y1)и (X2,Y2) -это верхний левый и нижний правый уг-
лы,соответственно,определяемого обзорного выхода.Цвет-опциональный число-
вой аргумент;если он включается,новый обзорный выход заполняется данным
цветом.Граница-опциональный числовой аргумент ,который ,когда он включает-
ся,вызывает вычерчивание Т.Б. бордюра вокруг нового обзорного входа в спе-
цифицируемом цвете.Если опускается,бордюр не вычерчивается.
VIEW определяет зону графического экрана, в которую можно осуществ-
лять запись,либо наоборот,зону в которую записывать нельзя.Попытки устано-
вить пикселы вне обзорного выхода заканчиваются неудачей;это называется
отсечением.
Опция SCREEN
------------
Если ключевое слово SCREEN опускается,дальнейшие ссылки на точки
беруться относительно верхнего левого угла обзорного выхода,а не от левого
угла экрана.Например,после
VIEW (100,50)-(300,180)
и затем PSET (0,0)
включается пиксел с координатами (100,50).
Если SCREEN включается ,то точки специфицируются обычным обра-
зом;т.е. относительно верхнего левого угла дисплея.Например,PSET (0,0) от-
носиться к пикселу в крайнем левом углу дисплея.Однако видимыми являются
только точки,попадающие в специфицированный обзорный выход(вне обзорного
выхода точки отскаются).
VIEW без аргументов определяет весь экран,как обзорный выход.При
использовании оператора SCREEN для изменения экранного режима (напри-
мер,чтобы перейти от средней к высокой разрешающей способности) ликвидиру-
ется любая установка,которая могла до этого момента существовать.
Когда обзорный выход уже определен,CLS очищает только обзорный выход.
пример
-------
SCREEN 1
FOR I=0 TO 6
VIEW (10*(I+1),10*(I+1))-_
(25*(I+1),25*(I+1)),I,3-I
CIRCLE (10,10),I+1,3-I
NEXT I
END
Оператор WAIT
-------------
функция WAIT обеспечивает ожидание указанного условия состояния ап-
------- паратуры .
синтаксис WAIT внешнее устройство,n[,m]
---------
замечания Внешнее устройство-это целое выражение (в диапазоне от 0
--------- до 65535),определяющее внешнее аппаратное устройтво вво-
да.n и m -целые выражения в диапазоне от 0 до 255.
WAIT останавливает исполнение программы до тех пор,пока специфици-
рованное внешнее устройство не представляет определенный битовый образ-
чик.Байт,считываемый с внешнего устройства,обрабатывается логическим ИСК-
ЛЮЧИТЕЛЬНЫМ ИЛИ с m и ЛОГИЧЕСКИМ И с n.Если результирующее значение есть
ноль,обработка повторяется.Если не ноль,Т.Б. продолжает исполнение прог-
раммы со следущего оператора.
Если m опускается , в операторе WAIT вместо него используется 0.
Пример
-197 -
-------
WAIT &H60,1
PRINT "BBB"
END
Операторы WHILE/WEND
--------------------
функция WHILE и WEND выстраивают цикл с тестированием его верхней
------- части .
синтаксис WHILE целое выражение
--------- .
. операторы
.
WEND
замечания Если целое выражение истинно (оценивается как ненулевое
--------- значение) ,все операторы между WHILE о WEND исполняются
Затем Т.Б. осуществляет переход к оператору WHILE и повторяет
текст,причем если все еще не ноль,заключенные в цикле операторы исполняют-
ся вновь.Этот процесс повторяется до тех пор пока,наконец,тестовое выраже-
ние не оценивается как нулевое,при котором исполнение переходит к операто-
ру6следующему после WEND.
Если целое выражение оценивается как ЛОЖНОЕ (нулевое) при первом
проходе,то не исполняется ни один оператор цикла.
Циклы,выстраиваемые с помощью WHILE /WEND могут гнездоваться .Каж-
дому WEND соответствует ближайшее WHILE .Если Т.Б. обнаруживает оператор
WEND без решения WHILE ,возникает ошибка 30 периода прогона,WEND без
WHILE.При наличии WHILE без соответствующего ему WEND генерируется ошибка
29 периода прогона,WHILE без WEND.
Хотя компилятор это мало заботит,для достижения четкости конструи-
руемого вами цикла делайте отступ операторов,располагаемых между WHILE и
WEND,с помощью пары пробелов.
Примечание:WHILE -1_WEND обеспечивает создание бесконечного цикла.
Чтобы преждевременно выйти из цикла WHILE/WEND,используйте оператор
EXIT WHILE.
См.также
DO/LOOP
EXIT
пример
-------
I=0
X=10
WHILE I<X
I=I+1
PRINT "I=";I
DELAY 1
WEND
PRINT "оба значения I и X равны 10"
PRINT I
PRINT X
END
Оператор WIDTH
--------------
функция WIDTH устанавливает логический размер строки
-------
синтаксис WIDTH [{имя устройства!файлнам},]размер
---------
замечания размер-это целое выражение от 0 до 255,которым специфици-
--------- руется новый логический размер строки.
Имя устройства-это строчное выражение,опционально описывающее уст-
ройство,ШИРИНА которого подлежит установке.Опциями устройства являются
SCRN:(экран),LPT1:(устройство строчной печати 1),LPT2:(устройство строчной
-198 -
печати 2),LPT3:(устройство строчной печати 3),COM1:(коммуникационное уст-
ройство 1) и COM2:(коммуникационное устройство 2).Если этот аргумент опус-
кается,WIDTH относиться к дисплею (SCRN:).Файлнам-это целое выраже-
ние,представляющее файл,открытый для вывода.В общем случае WIDTH определя-
ет сколько литер может "выдаваться на печать" на данное устройство до того
,как выводиться возврат каретки,хотя точное определение действия зтого
оператора изменяется соответственно тому устройству,к которому применяется.
В случае WIDTH размер или WIDTH "SCRN:",размер устанавливается ши-
рина экрана.Законными значениями размера являются 40 и 80,причем 40 неза-
конно для монохромного дисплея.
Если экран находиться в графическом режиме,изменение ширины воздей-
ствует на изменение режима графики.Например,если текущим режимом является
высокая разрешающая способность, то WIDTH 40 включает графику средней раз-
решающей способности.
WIDTH устройство ,размер определяет размер логической строки опре-
деленного устройства,когда оно открывается в следующий раз.Если устройство
уже открыто,установка его ширины не изменяется.
Примечание:
LPRINT явно открывает печатающее устройство;следовательно,действие
WIDTH "LPT1:",размер сказывается немедленно.
WIDTH #файлном,размер изменяет ширину устройства,представляемого
файлнам,немедленно.Устройствами,для которых этот оператор что-то означает
,являются LPT1:,LPT2:,LPT3:,COM1:,COM2:.
WIDTH каждого печатающего устройства по умолчанию определяется как
80.Спецификацией WIDTH размером 255 эффективно запрещается логическая ши-
рина строки,отсчитывающаяся таким образом,что не вставляется ни одного
возврата каретки.
Пример
------
SCREEN 1,0
PRINT "Это образец графического режима среднего разрешения"
DELAY 3
WIDTH 80
PRINT "Это образец графического режима высокого разрешения"
DELAY 3
WIDTH 40
PRINT "Заметьте ,что буквы в графическом режиме среднего разрешения
большие"
DELAY 3
SCREEN 0,1
WIDTH 80
PRINT "Это 80-литерный текстовый режим
DELAY 3
WIDTH 40
PRINT "Это 40-литерный текстовый режим
WIDTH 80
INPUT "Поддерживаются ли коды EPSON-печатающего устройст-
ва?(Y/N)";отв$
IF UCASE$(отв$)<>CHR$(80) THEN END
LPRINT CHR$(15)
WIDTH "LPT1:",130
LPRINT "Тестирование в сжатом режиме установить на 130 колонок";
LPRINT "Та же строка продолженная до конца страницы"
LPRINT CHR$(18)
WIDTH "LPT1:",80
END
Оператор WINDOW
---------------
функция WINDOW определяет систему графических координат.
-------
синтаксис WINDOW [[SCREEN](X1,Y1)-(X2,Y2)]
----------
замечания (X1,Y1) и (X2,Y2)-это две координатные пары единичной
-199 -
--------- точности.(X1,Y1) представляет нижнюю левую часть зкрана,а
(X2,Y2)-верхнюю правую.
Если вам не нравиться стандарт Т.Б. от 0 до 319 (или от 0 до
639),от 0 до 199 с начала координат в верхнем левом углу,оператор WINDOW
позволяет осуществлять адресацию вашим методом.Оператор WINDOW транслирует
произвольные "мировые" координаты в "физические" координаты (адреса дисп-
лейных пиксел).
Одной из областей применения WINDOW является перестроение карты
отображения в соответствии с экранными координатами,используемыми другой
компьютерной системой.Например,графическое отображение APPLE II состоит из
280 пиксел по горизонтали и 192 по вертикали.Этот оператор WINDOW вызывает
использование РС-дисплеем той же адресной схемы:
WINDOW SCREEN (0,0)-(279,191)
После использования этого оператора программа,переносимая с экрана
APPLE II,осуществляет попытку графически изобразить нижний самый правый
пиксел на экране APPLE II,для которого она была написана.Например,PSET
(279,191) превращается в физический пиксел 319,199 (нижний правый угол РС).
В качестве другого примера,предположите,что,вы работаете с областью
применения ,в которой принято описывать линии и другие обьекты в координа-
тах много более крупных,чем от 0 до 199 и от 0 до 639,разрешаемых стандар-
тной экранной адресацией.В такой области применения возможно также полезно
иметь начало координат в центре дисплея,а увеличение положительных значе-
ний Y вверх от начала координат ,как это делается в аналитической геометрии.
Оператор WINDOW позволяет вам трактовать графический экран средней
или высокой разрешающей способности как если бы он действительно был орга-
низован именно таким образом. WINDOW дает вам возможность маппировать вам
на дисплее полный диапазон чисел единичной точности;например:
WINDOW (-1E6,1E6)-(1E6,-1E6)
создает координатную систему с 4 трилионами точек (2х2 миллио-
на).(-10000000,1000000)маппируется на верхнем левом пикселе,(0,0)- в цент-
ре экрана и (1000000,-1000000)- на нижнем правом пикселе.в результате апп-
роксимируется стандартная декартова плоскость эвклидовой геометрии.Начало
координат находиться в середине,положительные значения X-вправо от нача-
ла,положительные значения Y-вверх от начала.
После испольнения этого оператора в любой операции записи на экран
(CIRCLE,LINE ...)будет использоваться эта новая координатная система.
PSET (0,0)
включает пиксел в центре экрана.
PSET (2500,2500)
вкл. пиксел ,находящийся немного выше и правее центра экрана.Аргу-
менты оператора WINDOW являются числами с плавающей точкой единичной точ-
ности,позволяющими на экранной карте создавать огромную площадь(миллионы
пиксел в обоих размерах),либо крошечную площадь дробных чисел с координа-
тами между 0 и 1.
Если включается опциональное ключевое слово SCREEN,это будет приво-
дить к тому,что новая координатная система остается качественной на уровне
умолчания,т.е. координаты Y увеличиваются по мере движения вниз.Например:
WINDOW SCREEN (1,-1)-(-1,1)
создает координатную систему ,в которой верх экрана представляется
координатой Y=-1,а низ экрана -координатой y=1.
Любое задействованное маппирование WINDOW выключается исполнением
RUN,SCREEN или WINDOW без аргументов.Функция PMAP выполняет масштабирова-
ние в соответствии с текущей установкой WINDOW,но без выдачи чего бы то ни
было на экран.
См.также COS
PMAP
Пример
------
SCREEN 1
nи=ATN(1)*4
знач1=5:знач2=6:шаг=400
WINDOW (-1,1)-(1,-1)
FOR T=0 TO 2*nи STEP 2*nи/шаг
радиус=COS(2*T)
X=радиус*SIN(знач1*T)
-200 -
Y=радиус*SIN(знач2*T)
PSET (X,Y)
NEXT T
WHILE NOT INSTAT:WEND
END
Оператор WRITE
--------------
функция WRITE посылает на экран разделяемые запятыми данные.
-------
синтаксис WRITE [список выражений]
---------
замечания список выражений -это последовательность числовых и/или
--------- строчных выражений , разделяемых запятыми или точкой с
запятой.Если список выражений опускается,выводиться пустая строка.WRITE
подобно PRINT,за исключением того,что WRITE вставляет между элементами
списка выражений запятые,заключает строчные данные в двойные кавычки и не
выводит пробел перед положительными числами.
См.также PRINT
Пример FOR I=1 TO 3
READ слова$,число%
PRINT слова$
PRINT число%
WRITE слова$,число%
NEXT I
DATA "алло ",10,"как",20,"вы",30
END
Оператор WRITE#
---------------
функция WRITE# выводит данные в последовательный файл.
-------
синтаксис WRITE#файлнам,список выражений
---------
замечания Файлнам-это число,ассоциируемое с устройством или файлом
--------- в момент открывания файла.
Список выражений-это последовательность числовых и/или строчных вы-
ражений 6разделяемых запятыми или точками с запятой.WRITE# подобно PRINT#
,за исключением того ,что WRITE# вставляет запятые между элементами списка
выражений,выдает строчные данные внутри двойных кавычек и не выводит про-
бел перед положительным числом.
WRITE# является предпочтительным способом записи полей данных в
последовательный файл,поскольку этот оператор обеспечивает автоматическое
разделение переменных запятыми и простановкой кавычек с обеих стлорон
строк. Это упрощает использование оператора INPUT# ,когда вы осуществляете
выписки из файла.
См.также PRINT#
Пример
------
OPEN "FILE.PRN" FOR OUTPUT AS #1
FOR I=1 TO 6
READ INF$
WRITE#1,INF$
NEXT I
CLOSE 1
END
DATA "майк","Смит","12 главная ул.","Париж","п/о","95066"
ГЛАВА 3. Турбо-Бейсик : программа
Турбо-Редактор
Встроенный редактор Т.Б. специально сконструирован для создания ис-
ходного текста программы.
Когда вы выбираете EDIT (редактировать) из главного меню Т.Б., в
верхнюю часть экрана выносится и высвечивается окно редактирования, а вы
оказыветесь в редакторе. Чтобы оставить редактор и возвратиться в
главное меню, нажимаете ESC (данные в окне редактирования остаются на
экране).
Вы можете вводить текст столь же изящно, как если бы вы пользовались
пишущей машинкой. Для завершения строки нажимайте клавишу Enter. Когда вы
введете достаточно строк для заполнения экрана, верхняя строка скручивается
с экрана. Не огорчайтесь, она не теряется и вы можете перемещаться туда и
обратно по вашему тексту с помощью команд скрутки, которые описываются
ниже. Редактор Т.Б. обладает возможностью "уничтожать сделанное", которая
позволяет вам как бы брать обратно изменения, если вы еще не оставили
строку. Это команда Ctrl-Ql описывается в разделе "Разные команды
редактирования".
Теперь бросим взгляд на состояние окна редактора,которая показывает :
X:FILENAME.TYP LINE COL INSERT INDENT TAB
(имя файла,тип) (строка) (колонка) (вставка) (отступ) (табулятор)
X:Имя файла.тип
---------------
указывает дисковвод, имя и расширение файла, подлежащего редактированию.
Если имя файла и расширение есть: NONAME.BAS - это имя файла в Т.Б. по
умолчанию.
Строка
------
Указывает номер строки в которой находится курсор (по отношению верха фай-
ла, а не экрана).
Колонка
-------
Показывает номер колонки содержащей курсор.
Вставка
-------
Указывает, что в данный момент вы находитесь в "режиме вставки". В режиме
вставки литеры вводятся с клавиатуры и вставляются на курсорной пози-
ции. Текст перед курсором перемещается вправо по мере ввода вами новых
литер. Для тумблерного переключения редактор между режимами вставки и
переписывания используется клавиша INS или Ctrl-V; в режиме переписывания
текст вводимый с клавиатуры записывается поверх литер, находящихся под
курсором. Примечание:Когда вы находитесь в режиме переписывания, новые
- 26 -
строки текста вводится не могут.
Отступ
------
Отступ указывает на то, что включена возможность авто-отступа. Она
включается с помощью команды включения/выключения авто-отступа, Ctrl-OI.
Табулятор
---------
Указывает на то, можете ли вы вставлять или нет ярлыки табуляции.Для
тумблерного включения/выключения используется Ctrl-OI
Работа редактора
Наиболее важным при изучении редактора является то, как перемещается
курсор. Его вы можете перемещать по экрану используя группу управляющих
литер: нажав Ctrl и одновременно любую из клавиш: A,S,D,F,E,R,X,C,W,Z.
Эти литеры располагаются на клавиатуре таким образом, что логичеки
указывается их использование. Например: E
S D
X
нажатие на Ctrl-E перемещает курсор вверх, Ctrl-X вниз, Ctrl-S влево,
Ctrl-D вправо.
редактором используется примерно 50 команд для перемещения курсо-
ра, страницы по тексту, нахождения и замены строк и т.д. эти команды
можно сгруппировать в четыре главные категории:
-команды перемещения курсора
-команды вставки
-блоковые команды
-разные команды
Каждая группа содержит логически родственные команды, которые
описываются в следущих ниже разделах ( сводка команд представляется в
таблице 3-1). Каждый ввод состоит из определенной команды, за которым
следуют клавишные наборы по умолчанию, используемые для задействования
команды.
Таблица 3-1 .Сводка команд редактора.
----------------------------------------------------------------
Команды перемещения курсора
----------------------------
литера влево Ctrl-S или стрелка влево
литера вправо Ctrl-D или стрелка вправо
слово влево Ctrl-A
слово вправо Ctrl-F
строка вверх Ctrl-E или стрелка вверх
строка вниз Ctrl-X или стрелка вниз
скрутка вверх Ctrl-W
скрутка вниз Ctrl-Z
страница вверх Ctrl-R или PgUp(страница вверх)
страница вниз Ctrl-С или PgDn(страница вниз)
-----------------------------------------------------------------
Расширение команд перемещения
-----------------------------
Начало строки
конец строки Ctrl-QS или HOME(исходное)
верх окна Ctrl-Qd или END(конец)
низ окна Ctrl-QE
верх файла Ctrl-QX
конец файла Ctrl-QR
начало блока Ctrl-QC
конец блока Ctrl-QB
последняя курсорная Ctrl-QK
- 27 -
позиция Ctrl-QP
-----------------------------------------------------------------
Команды вставки и стирания
--------------------------
Включено/выключено Ctrl-V или INS(вставка)
режим вставки
Вставка строки Ctrl-N
Стирание строки Ctrl-Y
Стирание до конца строки Ctrl-QV
Стирание литеры
Влево от курсора Ctrl-H(или возврат на пробел)
Cтирание литеры под курсором Ctrl-G(или DEL стирание)
Стирание слова вправо Ctrl-T
-----------------------------------------------------------------
Блоковые команды
----------------
Пометка начала блока Ctrl-KB или F7
Пометка конца блока Ctrl-KK или F8
Пометка одного слова Ctrl-KT
Кодирование блока Ctrl-KC
Перемещение блока Ctrl-KV
Стирание блока Ctrl-KY
Считывание блока с диска Ctrl-KR
Запись блока на диск Ctrl-KW
Спрятать/отобразить блок Ctrl-KH
Печать блока Ctrl-KP
-----------------------------------------------------------------
Разные команды
--------------
Прекратить редактирование
Не хранить Ctrl-KD,Ctrl-KQ или ESC
Хранить и редактировать Ctrl-KS или F2
Новый файл F3
Табуляция Ctrl-I или ТАВ(табуляция)
Режим табуляции Ctrl-OT
Включить /выключить авто-отступ Ctrl-OI
Восстановить строку Ctrl-QL
Установить маркер места Ctrl-KN
Найти маркер места Ctrl-QN
Найти Ctrl-QF
Найти и заменить Ctrl-QA
Повторить найденное
последним Ctrl-L
Префикс литеры управления Ctrl-P
Отбросить операцию Ctrl-U
Восстановить сообщение
об ошибке Ctrl-QW
------------------------------------------------------------------
Базисные команды перемещения
Для начала правильного редактирования вашего файла существует нес-
колько базисных команд.
Литера влево Ctrl-S или стрелка влево
------------
курсор перемещается на одну литеру влево
Литера вправо Ctrl-D или стрелка вправо
-------------
курсор перемещается на одну литеру вправо
Слово влево Ctrl-A
-----------
- 28 -
курсор перемещается в начало слова, находящегося
слева. Слово определяется как последовательность литер, отделяемая одним из
следующих символов:
пробел<>,():.[]"*_/$
эта команда работает по разбивкам строки
Слово вправо Ctrl-F
------------
курсор перемещается в начало слова находящегося справа
Строка вверх Ctrl-E или стрелка вверх
-------------
курсор перемещается на одну строку вверх
Строка вниз Ctrl-X или стрелка вниз
--------------
курсор перемещается на одну строку вниз
Скрутка вверх Ctrl-W
-------------
обеспечивается скручивание по одной строке в направле-
нии начала файла (экран в целом скручивается вниз).
Скрутка вниз Ctrl-Z
-------------
обеспечивается скручивание по одной строке в направле-
нии конца файла (Экран в целом скручивается вверх).
Страница вверх Ctrl-R или PgUp
--------------
курсор перемещается на одну страницу вверх, без одной
строки
Страница вниз Ctrl-C или PgDn
----------------
курсор перемещается на одну страницу вниз, без одной
строки.
Расширение команды перемещения
Иногда вы можете пожелать быстрее перемещаться в ваших документах,
чем позволяют базисные команды перемещения. Редактор обеспечивает шесть
команд для мгновенного перемещения к крайним концам строк, в начало и конец
файла, а также к последней курсорной позиции.
Начало строки Ctrl-QS или HOME
---------------
курсор перемещается в начало текущей строки(колонку
номер один)
Конец строки Ctrl-QD или END
-----------------
курсор перемещается в конец текущей строки
Верх экрана Ctrl-QE
------------------------
курсор перемещается в верхнюю часть экрана
Низ экрана Ctrl-QX
----------------------
курсор перемещается в нижнюю часть экрана
Верх файла Ctrl-QR
----------------------
курсор перемещается на первую литеру в файле
Конец файла Ctrl-QC
-----------------------
курсор перемещается на последнюю литеру в файле.
Конец Ctrl-Q
----------------------
позволяет осуществить переход к особым точкам в доку-
менте .
Начало блока Ctrl-QB
----------------------
курсор перемещается к маркеру начала блока устанавли-
- 29 -
ваемому с помощью Ctrl-KB. Команда работает, даже если блок не отображается
(СМ."скрыть/отобразить блок" в разделе "Блоковые операции") или если не
установлен маркер конца блока.
Конец блока Ctrl-QK
-------------
курсор перемещается к маркеру конца блока, устанавливаемому с помощью
Ctrl-KK. Команда работает, даже если блок не отображается, или если не
установлен маркер начала блока
Последняя курсорная позиция Ctrl-QP
-----------------------------------
происходит перемещение к последней позиции курсора
перед последней командой. Эта команда полезна, в частности, после
исполнения операции найти/заменить, когда вы желаете вернуться к
последней позиции, имевшей место до ее исполнения.
Команды вставки и стирания
Вы не можете написать программу толькоперемещая курсор один раз.
Вы должны быть в состоянии вставлять и стирать текст. С помощью следующих
команд выполняется вставка и стирание литер, слов и строк.
Включение/выключение режима вставки Ctrl-V или INS
----------------------------------------
При вводе текста вы можете выбирать между двумя базисными
режимами: вставкой и переписыванием. Переключаться между этими режимами
вы можете тумблерно переключая режим вставки. Текущий режим отображается в
верхней части экрана.
Режим вставки есть режим редактора по умолчанию, позволяющий
вам вставлять новые литеры в старый текст. Текст справа от курсора просто
перемещается вправо по мере ввода нового текста. Для замены старого текста
новым используется режим переписывагия; любая вводимая литера заменяет
находящуюся под курсором. В режиме переписывания вы не вставите в текст
новые строки.
Стирание литеры справа от курсора Ctrl-H или возврат на пробел
------------------------------------
осуществляется перемещение на одну литеру влево и стирается находящяяся
там литера. Любые литеры справаот курсора перемещаются на одну
позицию влево. Эту команду можно также использовать для перемещения
строчных разрывов.
Стирание литеры под курсором Ctrl-G или DEL
-------------------------------
стирается литера, находящаяся под курсором и перемещаются влево любые
литеры находящиеся справа от курсора. Эта команда не работает по строчным
разрывам.
Стирание слова справа от курсора Ctrl-E
---------------------------------
стирается слово находящееся справа от курсора. Эта команда работает по
строчным разрывам и может использоваться для их перемещения.
Вставка строки Ctrl-N
------------------
на курсорной позиции вставляется разрыв строки
Стирание строки Ctrl-Y
------------------
стирается строка, содержащая курсор, а все строки, лежащие ниже ее пе-
ремещаются на одну строку вверх. Нет возможности восстановить стертую
строку, поэтому пользуйтесь данной командой с осторожностью.
Стирание до конца строки Ctrl-QY
------------------------
- 30 -
стирается весь текст откурсорной позиции до конца строки.
Блоковые команды
Для блоковых команд также требуются командные последовательности уп-
равляющих литер. Если вы чувствуете, что пресытились, возвратитесь к
этому разделу, когда ощутите необходимость перемещать, стирать или
копировать целые пласты текста. В одно и то же время в документе может
быть один блок. Блок маркируется посредством размещения маркера начала
блока перед первой литерой и маркера конца блока после последней литеры
желаемой части текста. Однажды маркированный блок может копироваться,
перемещаться, стираться или записываться в файл.
Пометка начала блока Ctrl-KB или F7
---------------------
маркируется начало блока. Сам маркер невидим, а блок становиться види-
мым, только когда устанавливается маркер конца блока. Маркированный
текст (блок) изображается в другой интенсивности цвета.
Пометка конца блока Ctrl-KK или F8
----------------------
маркируется конец блока. Сам маркер невидим, а блок становиться видим,
только когда устанавливается маркер начала блока.
Пометка одного слова Ctrl-KT
--------------------
одно слово маркируется как блок, для которого последовательность
начала/конца блока несколько грубовата и поэтому замещается одной командой.
Если курсор помещается в пределах слова, то будет маркировано именно это
слово. Если он за пределами этого слова, то будет маркироваться слово,
находящееся слева от курсора.
Скрывание/отображение блока Ctrl-KH
---------------------------
вызывает видимое маркирование блока, подлежащего переменному выключе-
нию и вкючению. Команды маниауляции над блоком (копирование, перемещение,
стирание и запись в файл) работают только когда блок отображается.
Относящиеся к блоку перемещения курсора (переход в начала/конец блока )
работают независимо от того скрыт блок или нет.
Копирование блока Ctrl-KC
------------------
ранее маркированный блок копируется в текущую маркерную позицию. Пер-
воначальный блок не изменяется, а маркеры помещаются вокруг новой копии
блока. Если ни один блок не маркирован или курсор находится в пределах
маркированного блока, ничего не происходит.
Перемещение блока Ctrl-KV
-----------------
ранее маркированный блок перемещается из его первоначального положе-
ния в курсорную позицию. Блок исчезает из своего первоначального положения,
а маркеры остаются вокруг блока в его новом положении. Если ни один блок не
маркирован, ничего не происходит.
Стирание блока Ctrl-KY
--------------
Стирается ранее маркированный блок. Ничего не предусмотрено для
восстановления старого блока, поэтому будьте с этой командой осторожны.
Запись блока на диск Ctrl-KW
--------------------
ранее маркированный блок записывается в файл. Блок остается неизмен-
ным, маркеры тоже остаются на месте. Когда выдается эта команда, вы
получаете подсказку для установления имени файла, в который пойдет запись.
Файл может быть задан любым законным именем. (Удлинение по умолчанию
- 31 -
есть .BAS).
Чтобы выбрать файл для перезаписи, вы можете использовать свободно
определяемые литеры; справочник отображается. Если специфицированный файл
уже существует, перед записью в существующий файл дается предостережение.
Если нет маркированного блока, ничего не происходит.
Считывание блока с диска Ctrl-KR
------------------------
в текущий текст на курсорной позиции считывается файл точно так, если
бы это был блок. Затем считанный текст маркируется как блок. Когда выдается
эта команда, вы получаете подсказку для задания имени файла, подлежащего
считыванию. Специфицированный файл имеет любое законное имя файла.
Печать блока Ctrl-KP
--------------
маркированный блок посылается на распечатку. Если блок не маркировался
или маркированный блок скрыт, распечатывается весь файл.
Разные команды редактирования
В этом разделе описываются команды, которые не попадают ни под одну
из ранее упомянутых категорий.
Прекратить редактирование, не хранить Ctrl-KD, Ctrl-KQ или ESC
-------------------------
отменяется редактор и вы возвращаетесь в главное меню. Хранение отре-
дактированного файла на диске осуществляется явно с помощью опции SAVE
главного меню под управлением команды FILES, автоматически через опцию AUTO
SAVE в разном меню настройки или пока не отменен редактор.
Хранить и редактировать Ctrl-K9 или F2
-----------------------
Файл сохраняется и остается в редакторе.
Новый файл F3
----------
Позволяет стирать текст из текущего файла редактирования и создавать
новый файл; иниче просто создается новый файл. Когда вы нажимаете F3, вам
задается вопрос "Желаете ли вы сохранить текущий текстовый файл?".
Табулятор Ctrl-I или Тав.
------------
Ярлыки табуляции в редакторе Т.Б фиксируются через 8 колонок друг от
друга.
Режим табуляции Ctrl-OT
---------------
тумблерно подключается опция табуляции. Когда на экране видим
"Тав.", можете вставлять ярлыки табуляции; когда включено, ярлык табуляции
автоматически устанавливается в начале первого слова предыдущей стро-
ки. (Когда режим табудяции включен, не доступен режим Авто-отступ).
Включить /выключить авто-отступ Ctrl-OI
-------------------------------
обеспечивается автоматический отступ для следующих друг за другом
строк. Когда включен, отступ текущей строки повторяется для каждой следую-
щей; т.е. когда вы нажимаете Enter, курсор возвращается не в колонку номер
1, а в начальную колонку только что завершенной выми строки. Когда вы
желаете изменить отступ, пользуйтесь пробелом и клавишей стрелка влево для
выбора новой колонки. Когда авто-отступ включен, в строке состояния
отображается сообщение INDENT (отступ); когда выключен, это сообщение
снимается. Авто-отступ по умолчанию включен. (Когда включена табуляция,
авто-отступ не возможен).
Восстановить строку Ctrl-QL
- 32 -
-------------------
позволяет уничтожить сделанные изменения в строке до тех пор, пока вы
эту строку не покидаете. Строка восстанавливается в ее первоначальном
состоянии, независимо от выполненых вами изменений.
Установить маркер места Ctrl-KN
-----------------------
Маркируется до четырех мест в тексте,посредством нажатия Ctrl-К с пос-
ледующим добавлением одной цифры (0-3).После маркирования вашего местополо-
жения вы можете работать где угодно в файле,а затем легко возвращаться к
маркированному месту,используя команду Ctrl-QN(Необходима уверенность ис-
пользования одного и того же номера маркера).
Найти маркер места Ctrl-Qn
------------------
Отыскивается до четырех маркеров места(0-3).Обеспечивается перемещение
курсора к любому ранее установленному маркеру посредством нажатия Ctrl-Q и
номера маркера.
Найти Ctrl-QF
------
Позволяет вам осуществить поиск строк длинной до 30 литер,когда вы
введете эту команду,строка состояния очищается и вы получаете подсказку на
задание искомой строки.Вводя строку вы следите за ее правильностью ,а затем
нажимаете Enter.
Искомая строка может содержать любые литеры,включая литеры управле-
ния.Например ,вводите Т,удерживая клавишу Ctrl при нажатии Р,а затем вы мо-
жете включать в поисковую строку строчный разрыв,специфицируя МJ(возврат ка-
ретки.Поисковые строки можно редактировать с помощью команд литера влево,ли-
тера вправо,слово влево и слово вправо.Командой слово вправо повторно вызы-
вается предыдущая поисковая строка,которая может затем редактироваться.Опе-
рация поиска может быть отброшена с помощью команды ABORT(Ctrl-U).
Когда специфицируется поисковая строка вы получаете вопрос об опциях
поиска.Имеются следущие опции:
B-поиск в обратном направлении от курсорной позиции к началу текста
G-глобальный поиск по всему тексту относительно положения курсора.
N-где N есть число.Находится N-ый случай при начале отсчета от
текущей курсорной позиции
U-игнорирование различий между верхним и нижним регистрами.
W-поиск только целого слова не замечая совпадающих образцов заключен-
ных в других словах
Пример:
W-поиск только целого слова.Поисковая строка "TERM" будет совпадать со
словом "TERM",но не со словом "TERMINAL"
U поиск в обратном направлении и игнорируются различия между верхним
и нижним регистрами."BLOCK" совпадает с "BLOCKHEAD" и с "BLOCKADE",и т.д.
125 нахождение 125-го случая поисковой строки.Вы можете оканчивать пе-
речень опций поиска(если они есть) нажатием Enter,после чего начинается по-
иск.Если текст содержит какую-то цель совпадающую с поисковой строкой,курсор
позиционируется в конце ее строки или в начале ,если имел место обратный по-
иск.Операцию поиска можно повторить с помощью команды ПОВТОРИТЬ НАЙДЕННОЕ ко
мандой Ctrl-L.
Найти и заменить Ctrl-QA
-----------------
Эта позиция работает идентично команде НАЙТИ за исключением того,что
вы можете заменять"найденную строку" любой другой длинной до 30 литер.Ваш
выбор опций тот же ,что и в команде НАЙТИ с добавлением следущего:
N заменять без вопросов:не запрашивается подтверждение при каждой вст-
рече поисковой строки.
Примеры:
N10 найти следущие десять случаев поисковой строки и заменить без воп-
росов.
GW найти и заменить целые слова во всем тексте,игнорируя различия вер-
хнего и нижнего регистров.Идет подсказка на замену строки.
GNU искать всюду по файлу не обращая внимания на регистр,заменять без
вопроса
Когда находится элемент курсор позиционируется в конце элемента,а вы
- 33 -
получаете вопрос ЗАМЕНИТЬ?(Y/N) в строке подсказок в верхней части экрана.Вы
можете отбрасывать операцию НАЙТИ И ЗАМЕНИТЬ с помощью команды ABORT.Опера-
цию НАЙТИ И ПОВТОРИТЬ можно повторить с помощью команды повторить найденное
последним (Ctrl-L)
Повторить найденное последним Ctrl-L
------------------------------
повторяется самая последняя операция НАЙТИ или НАЙТИ И ЗАМЕНИТЬ ,как
если бы вся информация была введена вновь.
Префикс литеры управления Ctrl-P
-------------------------
Дает возможность вводить литеры управления в файл посредством установ-
ления префикса перед желаемой литерой управления с помощью Ctrl-P.(Сначала
нажимается Ctrl-P потом желаемая литера управления.Литеры управления будут
появляться на экране в виде заглавных букв слабой интенсивности света(или
наоборот ,в зависимости от настройки экрана).
Отбросить операцию Ctrl-U
-------------------
Позволяет отбросить любую команду независимо ,имеет в ней место пауза
для ввода ,такая как вопрос "Заменить (Y/N)?" в команде НАЙТИ И ЗАМЕНИТЬ,или
осуществляется ввод поисковой строки либо имени файла (считывание и запись
блока).
Восстановить сообщение об ошибке Ctrl-QW
--------------------------------
Нажимайте эти клавиши для восстановления сообщения об ошибке,уже од-
нажды появившегося в строке состояния окна редактора.
Редактор против ВОРДСТАР
Несколько команд редактора Т.Б. немного отличаются от аналогичных в
ВОРДСТАР.Следует также отметить ,что хотя редактор содержит только некоторый
субнабор команд ВОРДСТАР, рядом его особенностей ВОРДСТАР не обладает. Эти
особенности были добавлены для повышения качества редактирования.Здесь об-
суждаются имеющиеся различия.
Элементы управления Турбо-курсором,Ctrl-S,Ctrl-D,Ctrl-E,Ctrl-X,обеспе-
чивают свободное перемещение по экрану без перескока в колонку номер один
пустых строк.Это не значит ,что экран заполняется пустотами наоборот,все
концевые пустоты автоматически перемещаются.Такой способ перемещения курсора
особенно полезен при редактировании программ;например ,когда обеспечивается
согласование отступов для FOR/NEXT.
Команды Ctrl-S и Ctrl-D не работают по строчным разрывам.Для перемеще-
ния с одной строки на другую вы можете использовать Ctrl-E,Ctrl-X,Ctrl-A, и
Ctrl-F.В Т.Б. невозможно вводить возврат каретки в конце файла в режиме пе-
реписывания;т.е.,если режим вставки выключен,нажатие Enter в конце файла не
будет обеспечивать вставку литеры .Однако вы можете либо переключиться в ре-
жим вставки либо использовать Ctrl-N в режиме переписывания для ввода возв-
рата каретки.
Последовательность ВОРДСТАР Ctrl-Q DEL ,обеспечивает стирание от кур-
сорной позиции до начала строки,в редакторе не поддеоживается.Т.Б. позволяет
маркировать вам как одно слово так и блок с использованием Ctrl-KT.Это более
удобно чем двухшаговый процесс ВОРДСТАР маркирования начала и конца слова
отдельно.
Поскольку редактирование в Т.Б. целиком осуществляется в памяти,коман-
дой Ctrl-KD не вызываются изменения файла на диске,как это имеет место в
ВОРДСТАР.Обновление дискового файла должно выполняться явно с использованием
опции хранения в файловом меню,либо автоматически через опцию авто-хранения
редактирования в разделе разное меню настройки.Вы можете также воспользо-
ваться F2 или Ctrl-KG.
Турбо-команда Ctrl-KQ не похожа на команду Ctrl-KQ (отказ от редакти-
рования )ВОРДСТАР.Измененый текст не бросается -он остается в памяти и готов
для компилирования и хранения.
Турбо-командой Ctrl- QL строка восстанавливается до ее содержимого пе-
ред редактированием в течении всего времени нахождения курсора этой на строке.
Команда Ctrl-QI обеспечивает тумблерное включение и выключение возмож-
ности авто-отступа.
И последнее,хотя и неменее важное,клавиша пробела назад в Т.Б. работа-
- 34 -
ет подобно клавише DEL в ВОРДСТАР.Она обеспечивает стирание литера слева от
курсора.Клавишей DEL в Т.Б. обеспечивается стирание литеры под курсором.
Компилятор
Компилятор Т.Б. является полностью ассемблерным языком,представляющим
собой высокопроизводительный компилятор.Чтобы вызвать компилятор ,нажимайте
С(компилирование) в главном меню.Если гланый файл уже установлен,то, при не-
обходимости,вы получеете подсказку о вашем желании сохранить текущий рабочий
файл.Если это так ,текущий файл сохраняется.Вводится главный файл и начина-
ется компилирование.
Компилятор записывает компилирующую программу либо в память(по умолча-
нию),либо на диск,в зависимости от установки текущей позиции комптляции в
меню опций компилятора.В процессе этой работы компилятор отличает с прираще-
нием 20 число строк и операторов,обработанных к этому моменту.Состояние ком-
пилятора отображается в окне сообщений.Если обнаруживается ошибка автомати-
чески вызывается редактор,а курсор позиционируется в ошибочном операторе.Со-
общение об ошибке отображается в верхней строке редактора.Когда вы перемеща-
етесь с ошибки ,строка состояния исчезает.Чтобы восстановить сообщение об
ошибке,нажимайте Ctrl-QW.
После успешного компилирования в окне сообщений отображается общее
число строк и операторов программы ,плюс величина оставшегося в памяти сво-
бодного пространства для компилирования.Следует заметить,что величина остав-
шегося пространства будет больше,когда вы компилируете в файл .EXE или
.TBC,чем при компилировании в память.
В трехстрочном обзоре обьектных кодов в шестнадцатиричной системе пе-
речисляются размер кодовых сегментов,стека и зоны данных генерируемой прог-
раммы.
Т.Б. работает с привлечением серий команд,вытягиваемых вверх и вниз
меню,а также предоставляет четыре окна в среде программирования.В этом раз-
деле описывается функция каждой команды главного меню и соответствующие опции.
Чтобы осуществить выбор и вызвать какую-то функцию в главном меню,наж-
мите клавишу,соответствующей высвечиваемой букве верхнего регистра желаемой
опции,а затем нажмите Enter.Чтобы выйти из любого меню нажимайте ESC.
Если вы находитесь в окне редактирования,либо в любом из меню,нажатие
ALT и первой буквы статьи меню будут давать вам доступ к этой статье ме-
ню.Установка цветов,справочников и других возможностей может выполняться че-
рез вытягивание вниз меню настройки.Любые сделанные изменения можно хранить
в ТВ-файле или непосредственно в файле TB.EXE в том же справочнике,что и
система Т.Б..По умолчанию TB-файл есть TBCONFIG.TB,но через команду SETUP
можно поддерживать несколько TB-файлов.
Чтобы изменить размер и/или переместить задействованное окно (отмечен-
ное по контуру двойными полосками),нажимайте STROLL LOCK .Затем,удерживая в
нажатом состоянии клавишу SHIFT и пользуйтесь любой из клавиш -стрелок,пере-
мещайте и/или образмеривайте окно вправо,влево,вверх вниз и т.д.
Чувствительная к контексту помощь Т.Б. обеспечивает информацию,имеющую
отношение к вашему конкретному экрану,независимо от того где вы находитесь в
системе меню.чтобы получить помощь при любом уровне ,нажимайте F1;нажатие
ALT-F1 дает вам предыдущий экран помощи.
Т.Б. имеет ряд клавиш ("горячих клавиш"),которыми вы можете пользо-
ваться,где бы вы не находились в главном меню.Например ,чтобы вывести Т.Б.
из любого места в системе меню,вы можете нажать ALT-X.Для удобства все горя-
чие клавиши перечислены в таблице
-------------------------------------------------------------------
клавиши функции
--------------------------------------------------------------------
F1 обеспечивает чувствительность к контексту помощь
F2 обеспечивает сохранение вашего файла
F3 обеспечивает создание нового файла
F5 фокусируются экраны прогона или редактирования
F6 переключается задействованное окно
F7 переход к задействованному окну из системы меню
SCROLL LOCK образмеривание и перемещение задействованного окна
- 35 -
ESC ваш возврат к главному меню
ALT-C компилируется загруженная в данный момент программа
ALT-E редактируется загруженная в данный момент программа
ALT-R прогоняется загруженная в данный момент программа
ALT-N выход из системы Т.Б.
ALT-F ваш возврат в файловое меню
ALT-O ваш возврат в меню опций
ALT-D ваш возврат в меню отладки
ALT-W ваш возврат в меню окон
--------------------------------------------------------------------
Файловая команда
-----------------
Команда FILE обеспечивает меню с несколькими опциями
LOAD
----
загрузка позволяетвам выбирать рабочий файл,который можно затем редак-
тировать,компилировать ,исполнять или хранить.
После нажатия L вы получаете подсказку на задание имени файла.Ввод вы
можете осуществлять одним из следующих способов:
1.Любое законное имя файла.Если точка и тип файла опускаются,автомати-
чески добавляется удлинение .BAS Чтобы специфицировать имя файла без удлине-
ния,вводите его со следущей после имени точкой .
2.Имя файла из справочника.Если вы останавливаете выбор на поддержании
своих собственных удлинений,избегайте тех,которые имеют специальное смысло-
вое значение в DOS ,таких как .EXE,.COM,.BAT,.BAK.
Добивайтесь определенности в выборе уникальных имен файлов,независимо
от того,используете вы удлинение или нет.Рассмотрим например файлы MYPROG.V1
и MYPROG.V2 после редактирования и обеспечения хранения MYPROG.V1 а Т.Б.
производится переименование первоначальной формы программы в MYPROG.BAKЕсли
вы будете редактировать затем MYPROG.V2, ее исходная форма тоже будет названа
MYPROG.BAK,и очевидно сотрется резерв первого файла.
Когда вы нажимаете клавишу Enter после ввода имени рабочего файла,Т.Б.
осуществляет поиск файла в справочнике на регистрирующем диске.Если он не
найден,создается новый файл.
NEW
-------
Эта опция обеспечивает стирание имеющегося в настоящее время в редак-
торе текста и дает файлу имя по умолчанию NONAME.BAS
SAVE
----
Обеспечивает хранение текущего рабочего файла на диске старой версии
именованного файла,если таковая существует,дается удлинение BAK.Если ваш
файл именуется NONAME.BAS и вы пытаетесь сохранить ваш файл ,вы задаете из-
менение на его переименование перед исполнением операции сохранения.Если вы
просто нажимаете Enter,сохраняется файл,именуемый NONAME.BAS.
WRITE TO
--------
После редактирования для записи текущего редакторского файла на диск
под новым именем используется опция записи W.Вам предоставляется подсказка
для выбора нового имени .
MAIN FILE
----------
При работе с большими программами вы можете разбить исходную программу
на управляющие секции.Если вы превышаете литерные возможности редактора,вы
просто не будете иметь другого выбора.Отдельные части программы храняться и
редактируются как независимо "включаемые файлы",но когда наступает время
компилирования,они собираются в единый блок.
В тандеме с метаоператорами $INCLUDE(включить) выбор главного файла
позволяет вам компилировать программы с множеством исходных файлов.
Исходный модуль вы определяемые как главный файл с директива-
ми$INCLUDEКак всегда, чтобы редактировать любой модуль программы (даже глав-
ный модуль),делайте его загруженным в данный момент файлом.
По получении команды компилирования,Т.Б. осуществляет проверку с целью
- 36 -
обнаружить ,не отличается рабочий файл от главного файла.Если он не отлича-
ется компилируется рабочий файл.Если он отличается,вы получаете подсказку на
сохранение рабочего файла(если он уже изменен,а затем в память загружается
главный файл.Если во время компилирования обнаруживается ошибка,файл ,содер-
жащий ее,загружается таким образом,чтобы его можно было отредактировать.Ког-
да ошибка уже исправлена и вновь начато компилирование,вы получаете подсказ-
ку на сохранение отредактированного рабочего файла.Затем повторно загружает-
ся главный файл.
DIRECTORY
----------
Для получения перечня справочников,поиск субсправочников и изменения
на лету маски нажимайте D.
CHANGE DIR(смена справочника)
-----------------------------
Команда для смены справочника используется для выбора другого справоч-
ника.После нажатия С вы получите подсказку на задание прохода к справочни-
кам.Можно задавать любое законное имя прхода.Описание других используемых
системой справочников см.в разделе "Команды настройки".
OS SHELL(OS-каркас)
-------------------
нажатием О вызывается DOS операционная система;Т.Б. резидентно остает-
ся в памяти.Управление возвращается в резидентную систему Т.Б. с помощью ко-
манды EXIT(выход).
QUIT(уход)
----------
Команда обеспечивает ваш уход из программы Т.Б. в DOS.Если ваш текущий
файлредактирования был модифицирован,но ен отправлен на хранение,вы получае-
те соответствущую подсказку .
Команда редактирования
Команда EDIT (редактирование) обеспечивает вызов встроенного экранного
редактора с подачей ему для редактирования рабочего файла.(Вы именуете рабо-
чий файл через команду загрузки в меню файловой команды)Если имя рабочего
файла не специфицировалось,редактируется NONAME.BAS.
Чтобы покинуть редактор и возвратиться в главное менб,нажимайте
ESC.Ваш исходный текст продолжает отображаться на экране для возврата к нему
вам достаточно нажать Е.
Команда прогона
Команда RUN(прогон) обеспечивает исполнение программы,находящейся в
памяти.Если компилированная программа уже располагается в памяти,а ее источ-
ник не модифицировался в редакторе с момента последней компиляции или прого-
на,и никакие опции не применялись,исполнение осуществляется немедленно.Если
компилированной программы памяти нет,сначала компилируется результирующая
программа.Нажатие Ctrl-Break во время исполнения программы прерывает испол-
нение если опция KEYBOARD BREAK установлена,а прогоняющая программа осущест-
вляет ввод/вывод .Если обнаруживается ошибка вы оказываетесь в редакторе в
той точке,где возникла ошибка.В строке состояния редактора появляеися описа-
ние ошибки.Далее исправляйте вашу ошибку и возвращайтесь в вашу программу
(перекомпилирование будет происходить автоматически).В окне сообщений Т.Б.
отображает с приращением 20 число обработанных строк и операторов.В окне
прогона отображается вывод программы.Для фокусировки окна прогона во время
прогона программы нажимайте ALT-FS.
Команда компилирования
Команда Compile(компилирование) осуществляет надящейся в данный момент
в редакторе программы.В результате получается располагаемая в памяти (по
умолчанию) программа в .EXE-файле или .TBC-файле(цепочке,в зависимости от
текущей установки опций в меню команды компилирования.
Для начала компилирования нажимайте С (или Enter при позиционировании
курсора на этой опции). Если не специфицируется главный файл ,компилируется
загружаемый файл.
- 37 -
Если выбрано главное меню вы получаете подсказку относительно вашего желания
хранить текущий рабочий файл(если файл в редакторе модифицирован) затем
главный файл загружается и компилируется.
По мере компилирования Т.Б. отображает в окне сообщений т число строк и опе-
раторов,которые уже отработаны.
Отказ от компилирования осуществляется с помощью команды Ctrl-Break
.Если обнаруживается ошибка ,вы помещаетесь в редактор в точке возникновения
ошибки в программе.Описание ошибке появляется в строке состояния редактора .
Команда опций
Команда Options (опций ) обеспечивает просмотр меню опций компилято-
ра.Эти опции глобальны и обеспечивают управление компилированием в целом,ес-
ли не преодолеваются внутренними метаоператорами исходной программы.
COMPILE TO (компилировать в )
Эта установка позволяет компилировать ваши программы в память,
.EXE-файл,.TBC-файл .Для просмотра 6разворачиваемого вверх меню,нажимайте С
и клавишу ввода и затем пользуйтесь клавишами стрелками или нажимайте клави-
шу которая соответствует высвечиваемой букве верхнего регистра ,для осущест-
вления вашего выбора.
По умолчанию ,компилирование в память,дает лучшие условия для отладки
и тектирования программ,так оно дает самый быстрый результат.
Установка .EXE-файла вызывает создание компилятором программ,которые
могут прогоняться из операционной системы(программа с расширением
.EXE).Обычно этот режим выбирается после того,как программа уже отлажена,хо-
тя из DOS могут быть тестированы только определенные возможности (напри-
мер,создание цепочки).
Установка файла цепочки дает файлы (с расширением .TBC) подходящие для
CHAINING (образование цепочки) или RUNNING (прогона ) из создаваемого Т.Б.
.EXE файла.Эти файлы не включают в себя библиотечные подпрограммы,поэтому
они не могут прогоняться независимо.
Т.Б. имеет несколько переключателей генерирования кодов,доступных че-
рез меню опций.По умолчанию каждый переключатель выключен идает поумолчанию
самые быстрые и самые маленькие программы из числа возможных.Вы можете выби-
рать для включения во время разработкиваших программ или в стадии отладки
некоторые или все эти переключатели.Чтобы выбрать любую из опций,используйте
клавиши стрелки или нажимайте букву верхнего регистра меню.Эти опции могут
быть сохранены для файла конфигурации через меню настройки.
Вы можете тумблерно включать и выключать следущие опции,
нажимая клавишу ввода при позиционированном на желаемой строке курсора:
.требуется 8087
.разрыв клавиатуры
.границы
.переполнение
.тестирование стека
8087 REGUIRED(требуется 8087)
-----------------------------
Включайте эту опцию,когда используете чип 8087.С помощью этой опции
Т.Б. генерирует лучший из возможных кодов для операций с плавающей точкой, и
быстрый и компактный ,с использованием внутристрочных операторов 8087.Недос-
таток состоит в том ,что генерированная с применением этой опции программа
не сможет прогоняться на машине без чипа 8087.
При выключенной опции 8087 (режим умолчания) программы могут проходить
обоими путями:т.е.,если имеется 8087,программа будет его использовать,если
нет,программой будет использоваться для выполнения того же самого (хотя и
медленнее) стандартное программное обеспечение.
KEYBOARD BREAK (прерывание с клавиатуры)
----------------------------------------
Включайте эту опцию ,если вы желаете прервать программу с помощью ко-
манды Ctrl-Break.Следует заметить,что это применимо только к Ctrl-Break,а не
- 38 -
к Ctrl-C.Имейте ввиду ,что прерывание программы с использованием
Ctrl-Break является окончательным-нет никакого способа продолжить исполнение
позднее.
Важно также заметить,Ctrl-Break оказывает воздействие,когда программа
осуществляет вывод текста( не графики) на экран или печатающее устройство,ли-
бо когда выполняется клавиатурный ввод.Это означает,что вы не можете преры-
вать последовательности,не являющиеся вводом/выводом;например:
TIGHTLOOP:GOTO TIGHLOOP (связанный цикл)
прогоняется до тех пор,пока вы не осуществите повторную перезагрузку
системы.(Однако ,чтобы обезопасить вас от таких проблем связанного цикла,мы
оборудовали Т.Б. опцией авто-хранения при редактировании.Другими словами,вы
можете устанавливать эту опцию на включение таким образом,что если требуется
выйти из программы посредством повторного запуска ,вы еще сможете распоря-
диться сохранить вашу программу.Обращайтесь к "меню настройки") .
Вы можете использовать следущие опции для отслеживания определенных
типов ошибок периода прогона.Обычно,когда программа находится в стадии раз-
работки,вы желали бы иметь включенными эти опции,чтобы избавится от некото-
рых затруднений.когда ваша программа отлажена ,выключайте эти опции для ге-
нерирования окончательной версии,т.к. она становиться быстрее и требует
меньше памяти.
BOUNDS (границы)
---------------
Во включенном состоянии эта опция вызывает генерирование компилятором
проверки границ индексации массивов.Код проверки построчной индексации обес-
печивает уверенность в том,что какой-то индекс попадает под заданный размер
массива,в котором должен использоваться еще до считывания или записи указан-
ного элемента .При включении проверки границ,проходит сообщение об ошибке по
диапазону индексов(ошибка 9),когда ваша программа пыталась исползовать
слишком большой или слишком маленький для данного массива подстрочный ин-
декс.Рассмотрим ,например ,эту программу:
dim myarray(100)
x=114
y:=myarray(x)
В массиве нет 114-го элемента,хотя это грубая ошибка не отлавливается
компилятором.Однако,если программа компилируется с включенным тестированием
границ,во время исполнения третьей строки появляется ошибка диапазона подст-
рочных индексов.
Если вы прогоняете програму при выключенной проверке границ,сообщения
об ошибке нет,и значение загружается в y,несмотря на то ,что оно попадает в
память на несколько байтов за пределами последнего элемента массива
myarray.При записи в несуществующий элемент массива ситуация еще хуже,пос-
кольку память ,используемая для хранения бог знает чего,безмолвно перезапи-
сывается.
Следует отметить ,что компилятор всегда сообщает подстрочные индексы
констант вне диапазона.Следущая программа будет не компилироваться независимо
от установки переключателя проверки границ:
DIM MYARRAY(100)
Y=MYARRAY(114)
OVERFLOW(переполнение)
----------------------
Переполнение возникает,когда какая-то арифметическая операция дает
значение вне пределов возможностей хранения целых чисел (-32768 до
32767).Например,кодовый фрагмент
X%=22555
X%=X%+19000
переполняет ограничение +32767 для целых переменных.Если вы компилиру-
ете эту программу с включенной проверкой переполнения,генерируется ошибка
переполнения периода прогона.Однако при выключенной проверке X% назначается
ненормальное значение и исполнение продолжается,как будто ничего не случи-
лось(что оставляет вашу программу непригодной).
Остерегайтесь промежуточных переполнений:
Y%=200000;X%=Y%
Z=(Y%+X%)*2.1
- 39 -
Хотя окончательный результат выражения (X%+Y%)*2.1 легко укладывается
в формат с плавающей точкой единичной точности,переполнение происходит при
сложении X% и Y% стандартными программами отработки целых чисел еще до то-
го,как результат сложения преобразуется к единичной точности и умножается на
2.1.Чтобы вынудить выполнение операций над целыми в форме с плавающей запя-
той,исползуйте функции CSNC и CDBL.Следует заметить,что проверка переполне-
ния осуществляется для целых, целых и любого из двух типов чисел с плаваю
щей точкой;однако для целых имеются некоторые исключения(например,расчеты ре-
гистров).
STACK TEST (тестирование стека)
-------------------------------
Включение этого переключателя вызывает генерирование Т.Б. кода ,кото-
рый обеспечивает проверку стековых противоречий по входу в каждую подпрог-
рамму,функцию или процедуру.Если вы ожидаете,что ваши программы выбегают за
строковое пространство,осуществляйте компилирование с включением этого пе-
реключателя.Для размещения большого стекового пространства используйте мета-
оператор $STACK.
Последними двумя входами в меню опций являются строка параметров с ма-
таоператорами.
PARAMETER LINE (строка параметров)
----------------------------------
Выбор Р вызывает выдачу Т.Б. подсказки на задание строки,которыю бу-
дет возвращать,когда программа прогоняется в следующий раз.Это позволяет
вам моделировать информацию командной строки в помощь при отладке из любого
места Т.Б..Нажатие Enter после ввода вашей строки,и затем ESC возвращает
вас в главное меню.
METASTATEMENT (метаопределения)
-------------------------------
Последняя опция из опций имеет собственное меню.Вы можете выбирать
любую опцию,нажимая S(стек),М(музыка) или С(коммуникации);или вы можете
воспользоваться клавишами-стрелками и нажимать Enter ,когда курсор позицио-
нируется на желаемой опции,отметим,что ваша исходная программа может прео-
долеть эти установки.
.Размер стека используется для переопределения размера стека.По
умолчанию он состовляет 1024 десятичных или 400 шестнадцатиричных байтов
(1 параграф есть 16 байтов).Когда вы нажимаете S,появляется подсказка на
задание нового размера стека в интервале от 400 до 7EFE шестнадцатиричных
байтов.(см.метаоператор $STACK в главе 5 "Словарь-вправочник Т.Б.").
.Буфер музыки есть размер основного музыкального буфера .Если вы не
пользуетесь SOUND или PLAY,то ваш результирующий код будет меньше когда вы
установите этот буфер в ноль.Минимум есть ноль;максимум-4096 байтов.Следу-
ет заметить,что 8 нот равны 1 байту;по умолчанию 32 ноты - 256 байтов.
.Коммуникации относяться к буферу-приемнику для каждого коммуникаци-
онного входа (в некоторых программах вы можете использовать метаоператор
$COMN для изменения размещения любого буфера) минимум есть 0;максимум
-32767;по умолчанию 256 байтов.
Команда настройки
Выбирайте SETUP(настройку),когда вы желаете инспектировать любые па-
раметры настройки,их изменять или постоянно регистрировать текущую конфи-
гурацию в ТВ-файле.Меню настройки показано на рис 3-6.
COLORS(цвета)
-------------
Используйте этот вход для определения цветов одной или более сис-
темных рамок,меню или окон.Нажимайте С или Enter для ввода меню и выби-
райте WINDOWS(окна),MENUS(меню) или SYSTEM BOXES ситемные рамки).В помощь
вам для определения изменений выбранного окна ,меню или рамки имеется три
дополнительных разворачивающихся вверх меню.
Как ,например,если вы выбираете меню из первого разворачиваемого
вверх меню,то можете сделать выбор определить главное -вытягиваемое вниз
- 40 -
меню,первое,второе или третье разворачиваемое вверх.Если вы выбираете
главное,появляются другие разворачиваемые вверх,чтобы вы могли определить
как изменить ваш выбор.Вашими опциями являются TITLE(назва-
ние),BORDER(бордюр),NORMAL TEXT(нормальный текст),FIRST LETTER (первая
буква),SELECTION BAR(полоска выбора) и RESTORE DEFANLTS (восстановление
по умолчанию).
Если вы уже приняли решение отом,в каком аспекте изменить меню,ска-
жем,например,вы выбрали полоску выбора ;на вашем экране появляется рамка
для выбора палитры.Для выбора желаемого цвета из цветовой гаммы пользуй-
тесь клавишами-стрелками.Для осуществления вашего выбора нажимайте
Enter,а затем ESC .Выбранное вами меню окно отражает текущее цветовое
значение.
DIRECTORIES(справочники)
------------------------
Входами INCLUDE(включаемый),EXECNTABLE(исполнительный) и TURBO
(турбо) определяются дисковвод и проход для каждого из трех справочни-
ков,используемых системой.справочник умолчаний имеется всюду,где бы вы ни
были в момент запуска вами Т.Б..
Когда выбирается какой-либо справочник ,вы получаете подсказку на
задание дисковвода и прохода.Вводите с клавиатуры дисковвод и/или про-
ход,нажимайте Enter и Т.Б. примет вашу спецификацию.Если вы изменяете
ваши соображения относительно того,какой справочник выбрать и желаете
повторить выбор,перед тем как покинуть системную рамку и до нажатия кла-
виши ввода можно нажать ESC и вы возвращаетесь к выбору варианта справоч-
ника.
Включаемые справочники используются для файлов ,которые содержат
директиву компилятора включить.Вы можете специфицировать множество спра-
вочников,отделяя их друг от друга двоеточиями.
Исполнительный справочник используется для файлов .EXE и .TBC,гене-
рируемых системой Т.Б.,а также для файлов ,создаваемых компилятором вре-
менно.Можно каждый раз выбирать только один такой справочник.
Турбо-справочник используется самой системой Т.Б.;т.е. для систем-
ного файла TB.EXE,файлов конфигураций и файлов помощи(TBHELP.TBH). И этот
справочник каждый раз можно выбирать только один.
MISCELLANEONS(разное)
---------------------
Нажатием М вводимое разворачиваемое вверх меню с двумя специальными
параметрами:
.AUTO SAVE EDIT(редактирование с авто-хранением)Тумблерно включайте
эту опцию,когда желаете автоматически отправлять на хранение ваш текущий
рабочий файл перед прогоном программы.
.BACKUP SOURSE FILES(резервирование исходных файлов)
----------------------------------------------------
При включении этой опции ваши файлы будут автоматически резервиро-
ваться .Выключайте,если не желаете создавать резервный файл каждый
раз,когда реализуете хранение.
Все компиляторные опции и установочные значения загружаются и храняться в
файле конфигурации(если не специфицируете TB.EXE).Это полезно для инвели-
ровки среды разработки программ различными способами.Например,при отладке
программ вы можете пожелать включить все компиляторные опции,а также рас-
ширить окно отслеживания и включить флаг глобального слежения.Другой об-
разчик конфигурации может потребоваться при компилировании конечной про-
дукции без видимых окон отслеживания или прогона и при всех выключенных
опциях.
Следущие опции дают вам возможность загружать и хранить ,соответст-
венно новую настройку конфигурации.
LOAD OPTIONS/WINDOW/SETUP(загрузить опции/окно/настройку)
---------------------------------------------------------
Нажимайте L для загрузки TB-файла справочника и повторно устанавли-
вайте систему в соответствии с содержащимися в нем параметрами.
SAVE OPTIONS/WINDOW/SETUP(хранить опции/окно/настройку)
-------------------------------------------------------
Нажатие S обеспечивает сохранение текущей настройки в TB-файле тур-
бо-справочника.Кофигурации может быть дано любое имя,но имя по умолча-
нию(TBCONFIG.TB)используется автоматически,когда Т.Б. запускается впер-
- 41 -
вые.Вы также можете хранить справочник конфигураций в файле TB.EXE.Однако
,если вы это делаете , вам выдается подсказка относительно того не хотите
ли вы изменить оригинальный файл TB.EXE.
Команда окон
Как говорилось в разделе о главном меню,вы можете изменять размер
любого задействованного окна и перемещать его ,нажимая STROLL LOCK,а за-
тем удерживать клавишу SHIFT в нажатом состоянии и использовать любую из
клавиш-стрелок для перемещения окна в желаемом направлении.По умолчанию
все окна задействованы,пока вы не выбираете их закрытие.
Теперь нажмите W для ввода в действие вытягиваемого вниз меню ко-
манд окон.
OPEN(открыть)
-------------
Нажимайте О и выбирайте из разворачиваемого вверх меню
EDIT,RUN(прогон),MESSAGE(сообщение) или TRACE (отслеживание).Команда отк-
рыть делает выбранное окно "задействованным".Это означает,что если окно
ранее было закрыто,то оно создается, и во всех случаях"открытое" окно бу-
дет выводиться в верхнюю часть экрана.Теперь все другие команды окон воз-
действуют на задействованное окно.
CLOSE(закрыть)
-------------
командой закрыть выбранное в данный момент окно скрывается,хотя в
него еще может продолжаться запись.
NEXT(следущее)
-------------
опция следующего позволяет вам выбирать другое окно как задейство-
ванное без необходимости возврата к опции открыть для выбора нового окна.
Повторяя нажатие NEXT,можно реализовать циклический проход по окнам.При
нахождении в окне или главном меню так же как опция следующее работает
клавиша F6.
GOTO(идти к)
-------------
После открывания окна используйте команду идти к для ввода этого
окна без необходимости возврата в главное меню.
STACK(стек)
------------
Используйте опцию стек для расположения всех открытых окон слоями
максимально возожного размера.Нажатием F6 последний экран в стеке выво-
диться в верхнюю часть экрана.
TILE(черепица)
-------------
Нажимайте I, чтобы добиться занятия всеми задействованными окнами
равных долей экрана.Задействованное окно включается клавишей F6.
ZOOM(фокусировать)
-----------------
Выбором опции фокусирования (или F5)осуществляется расширение выб-
ранного окна на полный экран;однако эта опция работает только с окнами
прогона и редактирования.Чтобы снова получить вашу первоначальную наст-
ройку экрана,вновь включайте фокусировку,работающую как тумблер.
Команды откладки
Возможности откладки предоставляются в виде двух цепных опций из их
вытягиваемого вниз меню:TRAGE(отслеживание) и RUN - TIME ERROR(ошибка пе-
риода прогона).
TRACE(отслеживание)
-------------------
отслеживание позволяет глобально устанавливать отслеживание прог-
рам.Этот переключатель может преодолевать вставляемыми заявлениями TRON и
TROFF.В этом окне отображаются метки заявлений,номера строк,имена продце-
- 42 -
дур и функций.
При прогоне в режиме отслеживания пользуйтесь командой ALT - F9.На-
жатие ALT-F10дает пошаговый переход к следующему номеру строки,метке и тд.
RUM-TIME ERROR(ошибка периода прогона)
-------------------------------------
эта опция используется,главным образом,для нахождения ошибок,кото-
рые возникают в файлах,ехе или твс(отдельные программы);в этих случаях не
дается ни каких сообщений.Если вы прогоняете программу под управлением
системы турбо-бейсика,все описание ниже дается автомвтически.
Эта функция возбуждается нахождением R или клавиши ввода
TRACE(отслеживание)
-------------------
Отслеживание позволяет глобально устанавливать отслеживание прог-
рамм.Этот переключатель может преодолеваться вставляемыми операторами
TRON и TROFF. В этом окне отображаются метки операторов,номера строк и имена
процедур и функций.
При прогоне в режиме отслеживания для переключения вашей программы
между отслеживанием и исполнением пользуйтесь командой Alt-F9.Нажатие
Alt-F10 дает пошаговый переход к следушему номеру строки,метке и т.д.
RUN-TIME ERROR (ошибка периода прогона)
---------------------------------------
Эта опция используется главным образом для нахождения ошибок,кото-
рые возникают в файлах .EXE или .TBC;в этих случаях не дается никаких со-
общений.Если вы прогоняете программу под управлением Т.Б.,все описания
ниже даются автоматически.
Эта функция возбуждается нажатием R и клавиши ввода.Затем вы полу-
чаете запрос на обеспечение значения прграммного счетчика.Далее Т.Б. оп-
ределяет соответствующую точку в исходном коде и устанавливает курсор на
оператор с погрешностью.
Когда происходит ошибка периода прогона,Т.Б. сообщает вам тип ошиб-
ки (всегда в числовой форме и словами,если запуск осуществлялся из
Т.Б.),а также значения из программного счетчика процессора в момент ошибки.
После компилирования Т.Б. в состоянии вычислить точку в исходной
программе,соответствующую адресу периода прогона в обектной программе,со-
ответствующую адресу периода прогона в обьектной программе.Рассмот-
рим,например,программу в TEST.BAS:
X=256
PRINT SHRS(X)
Хотя эта программа синтаксически правильна и поэтому будет компили-
роваться успешно,когда система попытается напечатать литеру со значением
256 кода ASCII,будет генерироваться ошибка периода прогона:
ERROR S ILLEGAL FUNCTION CALL OT PGM-OTR:29(незаконный вызов функ-
ции при значении 29 программного счетчика)
Опцией ошибка периода прогона это значение программного счетчика
используется для нахождения оператора ,которое вызвало ошибку.
ГЛАВА 4
ТУРБО-БЕЙСИК ЯЗЫК
Структура программы
Программы на Т.Б. состоят из одной или более строк исходного текс-
та,каждая из которых имеет следующий формат:
[номер строки]оператор[:оператор]...['коментарий]
или,
метка:
или,
метаоператор
Номер строки есть целое в диапазоне от 0 до 65535,которое опционально
может идентифицировать строки программы.Т.Б. относится не строго к установке
номеров строк.Они свободно могут перемешиваться с метками,использоваться в
одних частях программы и не использоваться в других.По существу,им нет не-
обходимости быть в числовой последовательноси,хотя ни одна строка не может
иметь и метку и номер.По сути номера строк являются метками.
Операторы -строительные блоки,образующие программы.В Т.Б. имеется приб-
лизительно 100 типов операторов.Строка может не содержать вовсе,содержать
одно или несколько операторов,разделяемых двоеточием.
Все представленное ниже есть законные строки Т.Б.:
START: 'только метка
10 'только номер строки
$INCLUDE "CONST.TBS" 'метазаявление
20 A=A+1 'номер строки плюс оператор
A=A+1:B=B+1 'два оператора
30 A=A+1:B=B+;:C=A+B 'номер строки и три оператора
Ширина в 249 колонок Т.Б. есть единственное ограничение,накладываемое
на число операторов,которые могут появляться в одной строке.Следует,одна-
ко,знать,что некоторые школы программирования придерживаются правила,что
устанавливать более одного оператора в строке,если это не требуется особен-
ностями синтаксической конструкции(например,IF/THEN/ELSE),плохая практика.В
отличии от интерпретаторного Бейсика,Т.Б. не накладывает ограничений перио-
да прогона за щедро расставленные в ваших программах пробелы и коммента-
рии,они просто игнорируются компилятором.
Все школы придерживаются мнения, что плохая форма для записи строк,если
ее ширина больше 80-колонной ширины окна редактора (несмотря на возможности
горизонтальной скрутки).Перейдете за 80 колонок и вы ничего уже не сможете
увидеть одновременно.Получить аккуратную распечатку тоже не удается.
В ситуациях,где синтаксические требования вынуждают вас строить строку
длинее 80 литер,ставьте литеру подчеркивания (_) в конце строки.
Это приведет к рассмотрению т.Б. следующей строки как продолжение пер-
вой.Эта строка также может продолжаться .Например:
FIELD $1,AS ADDRESS 1$,30 AS ADDRESS 2$,-15 AS CITY$,2 AS STATE$,5 AS_
2IP$,-30 AS COMMENTS$
Как только к этому приступит компилятор,весь текст окажется одной боль-
шой строкой начинающейся с FIELD и оканчивающийся COMMENTS$без литер под-
черкивания.
Комментарием может быть любой текст,добавляемый в конце строки и отде-
ляемый от самой программы единичной кавыукой ('). Единичная кавычка может
использоваться вместо REM для отделения коментариев от операторов в такой
строке,если она не находится в конце оператора DATA(который может принять
комментарий за часть строки).В отличии от REM ,нет необходимости отделять
отмеченные одной ковычкой комментарий от соответствующих операторов с по-
мощью двоеточия.Например,следущие строки для компилятора равнозначны:
AREA=RADINS 2*3.14159 'вычислить площадь
AREA=RADINS 2*3.14159 :REMвычислить площадь
Метка должна появляться в строке сама по себе(хотя за ней может следо-
вать комментарий) и служить для идентификации оператора,следущего непосред-
ственно за ней.Метки должны начинаться с буквы и могут содержать любое чис-
ло букв и цифр.Регистр не имеет значения:THISLABEL и THISLABEL эквивалент-
ны.За меткой должно следовать двоеточие,однако операторы,в которых имеется
- 44 -
ссылка на метку (например,GOSUB),не должны включать двоеточие.
Примеры:
SORTSUBROUTINE:
EXITPOINT: A=A+1 'незаконно ,метка должна быть в строке одна
SORTINVOICES:
GOSUB SORTINVOICES 'ссылочная метка
$метаоператоры-это операторы,которые работают на другом уровне,чем
стандартные операторы.Они независимые директивы компилятора и начинаются со
знака доллара ($) . Стандартные операторы управляют компилятором в период
прогона;метаоператоры,подобно выбору в меню опций ,управляют компилятором в
период прогона компилирования.
Примером метаоператора является $INCLUDE,которое вызывает включение
компилятором содержимого другого файла в точке,указанной в текущем фай-
ле.Следует заметить,что метаоператоры Т.Б. не появляются в REMARKS(комента-
риях )подобно тому,как это характерно некоторым другим бейсик-компилято-
рам.В одной строке может быть один метаоператор.
Литерный набор Турбо-Бейсика
Т.Б. в чем-то схож со строительным набором для составления программ.Он
обеспечивает вас набором документальных элементов языка(резервными словами
и символами),которые можно соединять вместе бесчисленными способами для
создания любого мыслимого программного обеспечения машины.
Буквы от А до Z и цифры от 0 до 9 можно использовать в формирующих
идентификаторах(именах меток,переменных,процедур и функций).
Числа от 0 до 9;символы .,+ и =; а также буквы Е,D можно использовать
при формировании числовых констант.
Следущие символы в Т.Б. имеют специальное смысловое значение:
-----------------------------------------------------------------------
символы описание/функция
-----------------------------------------------------------------------
= знак равенства(оператор назначения,оператор отношения)
+ знак плюс(оператор сложения и сцепления строк)
- знак минус (оператор вычитания и отрицания)
* звездочка (оператор умножения)
/ косая черта(оператор деления)
\ обратная косая черта (оператор деления нацело)
^ знак вставки(оператор возведения в степень)
% знак процента(литера оператора целого типа)
& амперсанд ( литера оператора типа длинного целого и
дескриптор недесятичной базы)
! восклицательный знак (литера оператора типа
единичной точности
# знак номера(литера оператора типа двойной точности)
$ знак доллара(литера оператора строчного
типа,префикс метаоператора)
() круглые скобки(аргументы функций/процедур,
массивы,приоритетность в выражениях)
[] квадратные скобки(законны только для массивов)
пробел(разделитель)
, запятая(общецелевой разделитель)
. точка(десятичная точка,разделитель в удлинении имени
файла
' единичная ковычка(ограничитель примечаний)
; точка с запятой(общецелевой разграничитель)
: двоеточие(разграничитель операторов)
? знак вопроса (замена PRINT (печать))
> меньше чем(оператор отношения)
< больше чем(оператор отношения)
" двойная кавычка(строчный разграничитель)
_ знак подчеркивания(литера продолжения строки)
----------------------------------------------------------------------
В Т.Б. резервируется использование определенных слов для заранее опре-
- 45 -
деленных синтаксических целей.Эти резервированные слова не могут применять-
ся в качестве меток,переменных,именованных констант или процедур и функ-
ций,хотя ваши идентификаторы могут содержать их.
Например,ENDявляется незаконным именем переменной,поскольку оно всту-
пает в противоречие с синтаксисом функций,определяемых пользователем.
попытки использовать резервированное слово в качестве тдентификатора
дают синтаксическую ошибку периода прогона компилирования.
таблица 4-1.Резервированные слова Турбо-Бейсика
---------------------------------------------------------------------
слово описание
---------------------------------------------------------------------
$COM коммуникация 1(метаоператор)
$COM2 коммуникация 2(метаоператор)
$DEBUG отладка(метаоператор)
$DYNAMIC динамический(метаоператор)
$ELSE иначе(метаоператор)
$ENDIF конец если(метаоператор)
$EVENT событие(метаоператор)
$IF если (метаоператор)
$INCLUDE включать(метаоператор)
$INLINE в строке(метаоператор)
$LIST перечень(метаоператор0
$OPTIONS опция(метаоператор)
$SEGMENT сегмент(метаоператор)
$SOUND звук(метаоператор)
$STACK стек(метаоператор)
$STATIC статический(метаоператор)
ABC авсолютное значение(функция)
ABSOLUTE абсолютный (ключевое слово)
AND и(логическое отношение)
APPEND прибавить
AS переменная файла
ASC код ASCII(функция)
AT
ATN арктангенс(функция)
BASE база(атрибут)
BEEP звуковой сигнал(оператор)
BIN$ двоичный эквивалент числа(функция)
BINARY двоичный (ключевое слово)
BLOAD загрузка в сохраняемую память(оператор)
BSAVE диапазон памяти на диске(оператор)
CALL вызов(оператор)
CASE регистр(ключевое слово)
CDBL преобразование в двоичную точность
CEIL наименьшее целое(функция)
CHAIN цепочка(оператор)
CHDIR смена справочника(оператор)
CHR$ символ на экран
CINT
CIRCLE окружность(оператор)
CLEAR очистить(оператор)
CLNG преобразовать в длинное целое(функция)
CLOSE закрыть(оператор)
CLS очистить(оператор)
COLOR цвет(оператор)
COM отслеживание коммуникации(оператор)
COMMAND$ командная строка(функция)
COMMON общие переменные(оператор)
COS косинус(оператор)
CSNS преобразование в единичную точность(функция)
CSRLIN позиция курсора по вертикали(функция)
CVD !
SVI !преобразование строчных произвольного
!файла в числовую форму (функция)
CVL !
- 46 -
CVMD !преобр.строчных МИКРОСОФТв числовую форму
CVMS !(функция)
DATA данные(оператор)
DATE$ дата (системная переменная)
DECR сбрасывание(оператор)
DEF определение(оператор)
DEFDBL !
DEFINT !оператор типа идентификатора переменной
DEFLNG ! по умолчанию(двойная точность,целое,
DEFSNG !длинное целое,единичная точность,строка,
DEFSTR !соответственно)
DELAY задержка(оператор)
DIM образмерить массив(оператор)
DO исполнять цикл(оператор)
DRAW чертить(оператор)
DYNAMIC динамический(атрибут)
ELSE иначе(ключевое слово)
ELSEIF иначе если(ключевое слово)
END конец(оепратор0
ENDNEM адрес конца адреса
ENVIRON модифицировать информацию в таблице
среды(оператор)
ENVIRON$ восстановление нормативов таблицы среды(функция)
EOF конец файла (функция)
EQV равно(отношение)
ERADR адрес последней ошибки(функция)
ERASE стереть динам. массив(оператор)
ERDEV !информация драйвера устройства(функция)
ERDEV$ !
ERL !строка и код последней ошибки(функция)
ERR !
ERROR ошибка(оператор)
EXIT выход(оператор)
EXP10 !
EXP2 !експонента (Е,2,10)(функция)
FIELD !
FILES переменная поля (оператор0
FIX усечение до целого(функция)
FN функция (ключевое поле)
FOR для(оператор цикла)
FRE свободная память (функция)
GET считать запись из произвольного файла(оператор)
GET$ считать графику с экрана(оператор),строку
из двоичного массива(функция)
GOSUB идти к подпрограмме(оператор)
GOTO идти к(оператор)
HEX$ преобразовать в шестнадцатиричный(функция)
IF если (оператор)
IMP
INCR приращение(оператор)
INKEY$ считать клавиатуру(функция)
INLINE в строке(ключевое слово)
INP считать с входного устройства(функция)
INPUT ввести(оператор)
INPUT# загрузить из последовательного файла(оператор)
INPUT$ считать определенное число литер(функция)
INSTAT состояние клавиатуры(функция)
INSTR поиск по строке(функция)
INT преобразование к целому(функция)
INTERRUPT прерывание(ключевое слово)
IOCTL !коммуникация с драйвером устройства
IOCTL$ !
KEY клавиша(оператор)
KILL стереть файл(оператор)
LBOUND нижняя граница(функция)
- 47 -
LCASE$ только нижний регистр(функция)
LEFT$ левые литеры(функция)
LEN длина строки(функция)
LET присвоить значение(оператор)
LINE линия/строка
LIST список (ключевое слово)
LOC позиция в файле(функция)
LOCAL локальная переменная(оператор)
LOF длина файла(функция)
LOG !логарифм(Е,10,2)(функция)
LOG10 !
LOG2 !
LOOP конец цикла(оператор)
LPOS позиция буфера принтера(фукция)
LPRINT строчная печать(оператор0
LPRINT#
LSET данные в буфер произвольного файла(оператор)
LOCATE позиционировать курсор(оператор)
MEMSET верхний предел памяти(оператор)
MID$ литерная строка(функция),замена
строки(оператор)
MKDIR субсправочник(оператор)
MKD$ !
MKI$ !преобразование чисел в строки (функция)
MKL$ !
MKMD$ !
MKMS$ !
MKS$ преобразование единичной точности в строку(функ.)
MOD
MTIMER микротаймер(функция и оператор)
NAME имя файла(оепратор)
NEXT следующий(оператор цикла)
NOT не (логическое отношение)
OCT$ восьмеричное представление(функция)
OFF выключить (ключевое слово)
ON включить(ключевое слово)
OPEN открыть(оператор0
OPTION опция
OR или (логическое отношение)
OUT запись на выходное устройство(оператор0
OUTPUT вывод
PAINT окрасить(оператор)
PALETTE !цветовая палитра(оператор0
PALETTE USING !
PEEK байт из ячейки памяти(функция)
PEN световое перо(функция/оператор)
PLAY игра(функция/оператор0
PMAP преобразование координат(функция)
POINT точка(функция)
POXE запись байта(оператор)
POS позиция курсора(функция)
PRESET установка точки(оператор)
PRINT данные на экран(оператор)
PRINT# запись в файл(оепратор)
PSET точка на экран(оператор)
PUT запись в произвольный файл(оператор0
PUT$ запись в двоичный файл(функция0
RANDOM произвольный(ключевое слово)
RANDOMIZE случайные числа(оператор)
READ загрузка переменных(оператор0
REG регистры(функция и оператор)
REM примечания(оператор)
RESET повторная установка(оператор)
RESTORE восстановление(оператор)
RESUME возобновление(оператор0
- 48 -
RETURN возврат(оператор)
RIGHT$ правые символы(функция)
RMDIR удаление справочника(оператор9
RND случайное число(функция)
RSET помещение строки в буфер(оператор0
RUN прогон(оператор)
SAVE хранить(ключевое слово)
SCREEN экран(функ./оператор)
SEEK позиция в двоичном файле(оператор)
SEG сегмент(кл.слово)
SELECT выбор (оператор)
SERVISE сервисная(кл.слово)
SGN знак(функция)
SHARED разделение переменных(оператор)
SHELL "детский процесс"
SIN синус(функция)
SOUND звук(оператор0
SPACE$ все пробелы(функция0
SPC пропукс пробелами(функция)
SQR квадратный корень(функция)
STATIC статические переменные(оператор)
STEP шаг (кл.слово)
STICK положение ручки управления(функция)
STOP останов программы(оператор)
STR$ строчный эквивалент числа(функция)
STRIG кнопки управления(функ./оператор0
SUB подпрограмма(оператор)
SWAP обмен значений(оператор)
SYSTEM системное управление(оператор)
TAB табуляция(функция)
TAN тангенс(функция)
THEN то (кл.слово)
TIME$ время(системная переменная)
TIMER таймер(функция/оператор)
TO к (ключевое слово)
TROFF !вкл/ выкл слежения за исполнением
TRON !
UBOUND верхняя граница(функ.)
UCASE$ нижняя граница(функ.)
UTIL пока(кл.слово)
USING используя(кл.слово)
USR !
USR0 !
USR1 !
USR2 !
USR3 ! регистры
USR4 !
USR5 !
USR6 !
USR7 !
USR8 !
USR9 !
VAL числовой эквивалент строки(функ.)
VARPRT адрес переменной(функ.)
VARPRT$ указатель переменной в строке(функ.)
VARSEG$ сегментный адрес переменной(функ.)
VIEW активная зона экрана(оператор)
WAIT ожидать(оператор)
WEND !операторы цикла с параметром
WHILE !
WIDTH логический линейный размер(оператор)
WINDOW графическая координатная система(оператор)
WRITE запись данных на экран(оператор)
WRITE# вывод в последовательный файл(оператор)
XOR исключающее или(логическое отношение)
- 49 -
-----------------------------------------------------------------------
Числа в Турбо-Бейсике
Забота о числах состовляет важную часть любой системы программиро-
вания.Т.Б.,как принято в традиции Бейсика,структурирован так,чтобы позво-
лить вам в значительной степени игнорировать технические соображения о
внутренней обработке чисел.Если вы никогда не задумывались о таких ве-
щах,как скорость вычислений,точность и требования к памяти,ваши программы
все равно будут работать так как вероятнее всего вы ожидаете.Однако пони-
мание того,что лежит в основе получаемых результатов поможет вам писать
программы,которые быстрее,точнее т требуют меньше памяти.
В целях повышения эффективности Т.Б. обеспечивает хранение и обра-
ботку чисел в четырех разных форматах;т.е. он обеспечивает четыре уникаль-
ных "типа" чисел:целые,длинные целые,плавающую точку единичной точности и
плавающую точку двойной точности.
Целые
Простейшими и самыми быстрыми числами,циркулирующими в программах
на Т.Б.,являются целые.Для Т.Б. целое есть число без десятичной точки(т.е.
то,что математики называют целыми числами) в диапазоне от -32768 до
32767.Эти значения проистекают из основополагающего 16 битового представ-
ления целых;32768 есть 15 .
2
Хотя этот диапазон ограничивает использование целых чисел,почти
наверняка в любой программе,которую вы будете писать,найдется несколько
переменных (таких как счетчики в циклах FOR/NEXT),которые могут функциони-
ровать в указанных пределах.Если это так,использование целых дает исключи-
тельно быстрый и компактный код. Ваш компьютер необычайно удобен для выпол-
нения арифметических операций над целыми(например,он удобен для выполнения
арифметических операций над целыми,а для каждого числа требуется только 2
К памяти.
Переключатель отладки переполнения в меню опций позволяет вам соз-
давать программы,которые автоматически проверяют случаи переполнения целых
переменных и сообщают о них.
Длинные целые
Значительным расширением интерпретаторного бейсика является то,что
Т.Б. поддерживает тип чисел,известных как длинные целые.Чтобы избегать
ошибок округления в финансовых операциях,длинные целые пр5едставляют собой
идеальный тип данных.Подобно обычным целым,данные не могут содержать деся-
тичные точки.Однако в отличии от обычных целых они имеют громадный диапа-
зон,от -2147483648 до +21474883647 (от 31 31 )
( -2 до 2 )Для длинных целых
требуется 4 байта памяти,а расчеты с ними занимают больше времени чем с
целыми.
Длинные целые относительно эффективны ,а при приближенном рассмот-
рении определенно ценны,особенно на машинах,которые не имеют 8087.В зави-
симости от вашей области применения,десятичные точки могут оказаться менее
важными ,чем вы думаете.Например,вы можете определять денежные суммы в
пенсах и делить их на 100 для отображения в долларах.Таким образом можно
выражать значения до 20 миллионов долларов.
Плавающая точка единичной точности
Плавающая точка единичной точности (или просто единичная точность)
возможно наиболее гибкий тип чисел в Т.Б..Значения единичной точности мо-
гут содержать десятичные точки и иметь диапазон : -38 38
от 10 до 10 .Вам при
дется усердно поработать ,прежде чем откопать число которое не уложиться в
число единичной точности.Скорость вычислений не так уж мала,для каждого
числс требуется 4 байта.
- 50 -
Оборотной стороной единичной точности является то,что хотя и воз-
можно представление как ненормально больших,так и микроскопических чи-
сел,их невозможно обрабатывать с точностью более шести значащих цифр.Еди-
ничная точность хорошо работает с числами вроде 451.21 доллара и 6411.92
доллара.Но 671421.22 доллара невозможно представить точно,поскольку это
число содержит слишком много цифр.Ни число 234.56789 ,ни число
0.00123456789 в представлении единичной точности не будут представляться
столь же точно,как в случае шести цифр:671421 доллара или 234.567,или
0.00123457.В зависимости от вашей области применения,это округление может
быть тривиальным или приносящим вред недостатком.
Плавающая точка двойной точности
Двойная точность также соотносится с единичной,как длинные целые с
целыми.Числа занимают в памяти вдвое больше места (8 байт ),а следователь-
но и дольше вычисляются, и имеют больший диапазон (10) и большую точность
(16 цифр против 6 для единичной точности).
Требования по хранению чисел двойной точности становятся особенно
заметны,когда приходится иметь дело с массивами.При двойной точности для
массива с 5000 элементов требуется 40000 байтов.Массив целых при том же
числе элементов занимает только 10000 байтов.Примечание:в Т.Б. для арифме-
тики с плавающей точкой используется стандарт 1ЕЕЕ,а не собственный формат
МИКРОСОФТ,используемый Интерпретаторным Бейсиком.Поэтому вы должны приме-
нять специальные функции для трансляции МИКРО-
СОФТ/1ЕЕЕ(CVMS,CVMD,MKMS$,MKMD$) для чтения и записи данных с плавающей
точкой,содержащихся в массивах,созданных И.Б.(Интерпретаторным Бейси-
ком)(Дополнитнльную информацию смотри в разделе "Произвольные файлы" далее
в этой главе).
Если вы не уверены какой тип плавающей точки использовать,мы реко-
мендуем двойную точность.Т.Б. наиболее эфективно работает на двойной точ-
ности.Его трансцедентные функции,такие как SRS или LOG ,возвращают значе-
ния двойной точности.Единичная точность может оказаться не лучшей для
больших массивов,однако именно в них ее размерные преимущества становяться
наиболее очевидными.
Вычисления и 8087
Сопроцессор 8087 (80287 на машинах АТ-типа) впечатляюще сужает
различие в скорости вычислений для предложенных типов чисел.Поскольку все
вычисления 8087 делает с двойной точночтью,независимо от типа,он делает
двойную точность даже более привлекательной.
В отличии от И.Б. ,Т.Б. не всегда округляет дробную часть числа в
большую сторону.Т.Б. особым образом анализирует любое число,содержащее 5 в
его дробной части.Число округляется в направлении ближайшего четного чис-
ла.Например,число 0.5 будет округляться до 0,как ближайшего четного чис-
ла.Поскольку в большинстве методов округления числа всегда округляются в
большую сторону,метод Т.Б. действительно дает более равномерное распреде-
ление.
Константы
Програмами Т.Б. оьраьатывается два разных класса данных:константы
и переменные.Переменные допускают изменение их значения по мере прогона
программы.Значение константы фиксировано во время компилирования и не мо-
жет быть изменено во время исполнения программы.Т.Б. поддерживает три типа
констант:строчные константы,числовые константы и,в порядке расширения
И.Б.,специальную форму целой константы,именованные константы.
Строчные константы
Строчные константы-это просто группы литер,окруженные двойными ка-
вычками;например
"THIS IS STRING"(это строка)
"3.14159"
- 51 -
"TIM TONES,ATTORNEY OF LAW" (ТИМ ДЖОНС,юрист)
Если строка оканчивается строчной константой,закрывающие кавычки
можно опустить:
PRINT " THIS IS LOPPY BUT LEGAL (Это небрежность,но она законна)
Числовые константы
Числовые константы представляются числовыми значениями,поэтому они
состоят прежде всего из цифр от 0 до 9 и десятичной точки.Для отрицатель-
ных констант проставляемый перед ними знак минус(-) ;знак (+) для положи-
тельных констант можно ставить и не ставить.Величина точности,которую вы
предусматриваете,определяется внутренним представлением(целое,длинное це-
лое,единчная или двойная точность),которое Т.Б. будет исползовать при об-
работке этой константы.
Если значения не содержат десятичную точку и лежит в диапазоне от
- 31 31-1
2 до 2 ,что превышает диапазон,Т.Б. использует свой тип длинного цело
го.(Примечание:тип длинного целого невозможен в И.Б.)
Если значение содержит десятичную точку и имеет до шести цифр,Т.Б.
использует свой тип плавающей точки единичной точности.
Числовая константа с десятичной точкой и более чем шесть цифр или
целое число,являющееся слишком большим,чтобы быть длинным целым,храниться
в формате плавающей точки двойной точности.Например:
345.1 единичная точность
1.103221 единичная точность
1.1032137 двойная точность
3456783.1234 двойная точность
Идентификация целых констант в других основаниях
Иногда удобновыражать целые в основаниях,иных чем десятичное.Это в
частности верно,когда выражается информация,являющаяся двоичной по своему
характеру;например,машинные адреса.Т.Б. позволяет вам специфицировать це-
лые данные в шестнадцатиричном ,восьмеричном и двоичном основании.Следует
заметить,что длинные целые нельзя представлять с изменением нотации.
Шестнадцатиричная константа содержит до четырех литер ,где каждая
литера имеет установки от 0 до 9 и от А до F,и должны предшествоваться &H.
Восьмеричные константы состоят только из литер от 0 до 7,могут
иметь до 6 цифр и должны предшествовать &О (либо просто &).
Двоичные константы содержат только 0 и 1.Могут быть длинной до 16
цифр и должны предшествовать &B.
Каждая следущая константа представляет одно и то же целое,десятичное
число 256:
&h100
&O400
&400
&b100000000
Именованние константы
Т.Б. позволяет ссылаться вам на целые константы по имени.Это пред-
ставляет собой некоторое усиление И.Б.,чем то похожее на возможность CONST
в Паскале.Таким образом можно именовать только целые.
Чтобы именовать целую константу предпошлите ей идентификатор со
снаком процента(%) и назначте ему целую константу.В отличии от перемен-
ной,вы можете использовать именованную константу в левой части оператора
назначения точно однако и ей может назначаться только постоянное значение(
не переменная или выражение).Например:%DEBUG=-1 'именованная константа
DEBAG%=1234 'целая переменная
Используйте именованные константы для флагов условных вычислений
для повышения читабельности ваших программ.(Вы также можете использовать
именованние константы для уменьшения случаев "магических чисел" в ваших
программах."Магическими числами" являются фантастические значения ,которые
что-то значат для вас,когда вы впервые пишете программу,но не шестью меся-
- 52 -
цами позже,когда вы к ней возвращаетесь).
Переменные
Переменная представляет собоц идентификатор,которым представляются
числовые и строчные значения.В отличии от константы,значение переменной
может меняться в процессе исполнения программы.Подобно меткам имена пере-
менных должны начинаться с буквы и могут содержать любое число букв и
цифр.Не скупитесь в назначении имен важных переменных.В отличии от И.Б.,в
Т.Б. длинные имена переменных не крадут память в период прогона.Для пере-
менных ENDOFMONTHTOTALZ (итоги на конец года) и EMT(акроним того же имени)
одинаково требуется ровно 4 байта для хранения в период прогона.
Т.Б. педдерживает пять типов переменных:строка,целое,длинное це-
лое,единичная точность.Имя переменной определяет ее тип.Обычно набор пере-
менной сопровождается добавлением литеры оператора типа к имени переменной.
Строчные переменные заканчиваются знаком доллара ($):
a$="turbo basic"
в целых переменных используют знак процента (%):
a%=100
в качестве идентификатора длинных целых используют амперсанд(&):
a&=7000
переменные с плавающей точкой единичной точности сопровождаются
восклицательным знаком:
a!=1.1
переменные с плавающей точкой двойной точности оканчиваются знаком
номера(#):
а#=1.031
Если вы не вкючаете в имя переменной литеру оператора типа,Т.Б.
будет использовать тип по умолчанию-единичная точность.Чтобы тип по умол-
чанию изменить на другой,используется оператор DEFTYPE:
например,
A#=1.031 'А# есть переменная двойной точности
B=16.5 'B имеет единичную точность
A%=3 'A% есть целая переменная;A#-это отдельная переменная
DEFINTM 'тип по умолчанию для переменных ,начиная с М,теперь целый
M=16 'М есть целое
Следует отметить,что А%,A#,A&,A$ и A!-это пять отдельных переменных.
Массивы
Массив-это группа строчных или числовыхданных ,разделяющих между
собой одно и то же имя переменной.Отдельные значения ,которые образуют
массив,называются элементом.Элемент массива может использоваться в опера-
торе или выражении всюду,где вы использовали строчную или числовую пере-
менную.Другими словами,каждый элемент массива сам по себе является пере-
менной.
Во время запуска программы каждый элемент числового массива устан-
вливается в нуль.Строчные массивы устанавливаются в нуль-строку("").Образ-
меривание динамического массива также очищает кажый элемент.Если программа
позднее повторно запускается с помощью оператора RUN,это возбуждение пов-
торяется.
Заявление имени и типа массива,так же как определение числа и ор-
ганизации его элементов,выполняется посредством оператора:
DIMENSION
DIM PAYTENTS(55)
создает массив переменных PAYMENTS(выплаты),состоящий из 56 эле-
ментов единичной точности,нумеруемых от нуля до 55.Массив PAYMENTS и какая
либо переменная единичной точности,именованная также являются отдельными
переменными.
Построчные индексы
Отдельные элементы массива выбираются с помощью подстрочных индек-
сов,целых выражений в круглых скобках справа от имени массивной перемен-
ной,например,PAYMENTS(1) и PAYMENTS(22) -это два из 56 элементов массива
- 53 -
PAYMENTS.Обычно первый элемент массива выбирается со значением подстросно-
го индекса ноль,хотя это можно изменить с помощью оператора DIM или OPTION
BASE:например
'заявляется массив из 56-ти элементов
'с границами подстрочных индексов от 0 до 55
dim payments(55)
- - - - - - - - -
option base 1
'этим оператором dim заявляется 55-ти злементный массив
'c границами от 1 до 55 ,т.к. имеет место оператор option base
dim payments(55)
Если вы используете какой-то массивв программе без его образмери-
вания,Т.Б. продолжает работу,как если бы вы заявили одиннадцати-элементный
массив(значения подстрочного индекса от 0 до 10).Однако мы рекомендуем вам
потратить время на явное образмеривание каждого массива,используемого ва-
шей программой.
Как усиление методологии обраьотки массивов в интерпретаторном
бейсике,Т.Б. дает вам возможность определять диапазон значений подстрочных
индексов6а не только верхнее ограничение.Например,оператором DIM
DIM B(50:60)
создается массив В,состоящий из одиннадцати элементов единичной
точности,нумеруемых от 50 до 60.
Оператором
DIM C(50:60,25:45)
создается двумерный массив С,содержащий 231(11*21) элемент.
Способности Т.Б. определять диапазон подстрочных индексов дает вам
возможность моделировать структуры программных данных наиболее близко со-
ответствующие решаемой задаче.
Рассмотрим ,например,программу отслеживаущую статистику рождаемос-
ти в 19 веке.Центральной структурой данных этой программы является массив
единичной точности из 100 элементов ,которые содержат число детей,родив-
шихся в каждом году прошлого столетии .
Идеально,если бы вы создавали массив,в котором используются значе-
ния подстрочных индексов равные году,в котором имели место рождения(напри-
мер,BIRTHS(1851) представляет сколько много детей вошло в мир в 1851 г.:
DIM BIRTHS(1899)
.
.
.
FOR N=1800 TO 1899
PRINT "THERE WERE "BIRTHS(N)"BIRTHS IN "N
NEXT N
К сожаленью DIM BIRTHS(1899)создает 1900-элементный массив,из ко-
торого первое 1800 идут в отход.Традиционно программисты,работающие на
Бейсике ,решают эту задачу,заявляя массив как
dim births(99)
и далее
for n=1800 to 1899
print "there were"births(n-1800)"births in "n
next n
В то время как подобные вещи усложняют дело и замедляют программу
на эту сотню неожиданных вычитаний,которых прежде не было.
Для определения наименьшего элемента в массиве можно также исполь-
зовать связанный оператор option base,хотя механизм диапазона средство бо-
лее мощное и предпочтительное.
Строчные массивы
Элементы строчных массивов содержат строки ,а не числа.Каждая
строка может быть разной длины от 0 до 32767 литер.Общее строчное прост-
ранство для строчных массивов состовляет 64К.Например:
dim a$(50)
создает последовательность из 51 независимых строчных переменных:
- 54 -
a$(0)="a medium lendth" 'строка из 22 литер
a$(1)=" " 'нуль-строка
a$(2)=space$(20000) 'строка из 20000 литер
.
.
.
а$(50)="the last one" 'последняя строка
Многомерные массивы
Массивы могут иметь одно или более измерений,вплоть до максималь-
ных 8.Одномерный массив представляет собой просто список переменных.Дву-
мерный массив представляет таблицу чисел с рядами и колонками информа-
ции.Равно возможны и многомерные массивы,не имеющие готового аналога в ре-
альном мире:
DIM A(15)
DIM B(15,20)
DIM C(5,5,10,20,2)
Максимальное число элементов на один размер равно 32768.
Тестирование границ массивов
Т.Б. старательно удерживает вас от попадания в затруднительное по-
ложение с плохоми подстрочными индексами(т.е. такими ,которые слишком ве-
лики,или слишком малы для данного массива).И компилятор сообщает вам о
плохих постоянных подстрочных индексах:
DIM A(50)
A(51)=33
Эта программа не будет компилироваться,поскольку Т.Б. неизвестно
как генерировать код для доступа к 52-му элементу 51-элементного масси-
ва.Однако ,если вы используете в качестве подстрочника индексов перемен-
ные,компилятор ошибку не обнаружит:
DIM A(50)
N=51
A(N)=99
Доже этот код компилируется без ошибки ,вы еще не можете уследить
ссылку на диапазон в строке 3 во время прогона,компилируя с включенным пе-
реключателем отладки границ(СМ.раздел "Команда опций" в главе 3,где дается
более подробная информация о проверке подстрочных индексов).
Требования к хранению массивов
По техническим причинам,относящимся к скорости исполнения и эфек-
тивности размера кода,Т.Б. ограничивает размер отдельных массивов до 64
К.,хотя программа может иметь столько 64Л-массивов,сколько позволяет па-
мять.Максимальное число элементов,которое может содержать массив,есть фун-
кция его типа,как показано ниже:
---------------------------------------------------------------
тип требования к хранению
---------------------------------------------------------------
целый 2 байта на элемент (32768 на 64 К)
длинный целый 4 байта на элемент (16384 на 64 К)
единичной точности -------------""------------
двойной точности 8 байтов на элемент (8192 на 64 К)
строчный 4 байта на элемент (16384 на 64 К)
---------------------------------------------------------------
Примечание:В элементе строчного массива содержится только указа-
тель и информация о длине.Сами строчные данные храняться в строчном прост-
ранстве и занимают столько байтов,сколько литер имеет строка.Строчное
пространство максимально может содержать 64 К литер.
Динамическое разделение ресурсов
Т.Б. поддерживает динамическое распределение ресурсов памяти.Это
означает создание массивов переменного размера(или статических) во время
- 55 -
компилирования.
Это дает вам возможность конструировать массивы,которые велики
точно настолько,сколько необходимо для обработки данных программой во вре-
мя прогона.
Чтобы создать динамический массив ,в операторе DIM просто исполь-
зуются переменные аргументы;если память имеется в наличии,массив будет
создаваться.Когда ваша программа заканчивает использование этого масси-
ва,применяйте оператор ERASE для освобождения от него и память можно ис-
пользовать для других целей.
Например:
'разберитесь сколько записей есть в файле
'образмерьте динамические массивы и зпгрузите их
OPEN "PARTS.DTA" AS #1 LEN=56
COUNT=LOF(1)/56
DIM PARTS(COUNT),DESC$(COUNT),GUAN(COUNT),COST(COUNT)
GOSUB LOADARRAYS
GOSUB USEARRAYS
ERASE PARTS,DESC$,GUAN,GOST
Чтобы воспользоваться преимуществом динамических массивов Т.Б.,вам
необходимо только принять решение о вызове каждого массива в программе:как
статического или как динамического.Является его размер постоянным в соот-
ветствии с конструкцией программы ,или он зависит от какого-то парамет-
ра,который неизвестен до периода прогона?Например,массив BIRTHS из приво-
дившегося ранее примера лучше создавать как статическую структуру-он всег-
да длжен быть длинной 100 элементов.
Ловушка динамических массивов состоит в том,что вы можете попы-
таться образмертвать большой массив и потерпеть неудачу из-за недостатка
свободной памяти в период прогона для выполнения ваших требований.Если
программа содержит только статические массивы и уже заявлено достаточно
памяти для начала работы,прекращение прогона быть не может;эти массивы
создаются еще до начала прогона программы.
Программа ,использующая динамические массивы,должна быть поэтому
как-то осведомлена о том,что в период прогона может оказаться недостаточно
памяти для заявления желаемых массивов.Перед попыткой образмерить динами-
ческий массив используйте функцию FRE(-1),чтобы посмоьреть достаточно ли
места для него .
Заявление статических и динамических массивов
Типом массивов по умолчанию,содержащихся в программе, управляют
метаоператоры $DYNAMIC и $STATIC.Обычно программа содержить только один
из этих операторов.По умолчанию компилятор полагает атрибут $STSTIC.
Класс хранения массива также может быть установлен с использовани-
ем аттрибутов STATIC и DYNAMIC в DIM-операторе.Кроме того,массив всегда
динамический,если в сочетании с DIM-оператором используется какое-то выра-
жение.
Например: $STATIC ' с этого момента все предполагаемые массивы явля-
'ются статическими
DIM A(40),B(20,20)
DIM DYNAMIC C(20) 'атрибут DYNAMIC преодолевает STATIC ,установ-
ленный по умолчанию
DIM D(N) 'использование переменной в DIM также вынуждает к дейст-
'вию атрибут DYNAMIC
$DYNAMIC 'с этого момента компилятор предполагает все массивы ди-
'намическими
DIM E(50) 'массив у динамический
Динамические массивы устраняются с помощью оператора ERASE.Стира-
ние динамического массива не высвобождает память,но приводит к установке
его элементов в ноль(для строчных массивов в ноль-строку).
Выражения
Выражение состоит из операторов и операндов ,которые обеспечивают
выполнение определенных операций при вычислении выражения.В Т.Б. имеется
два фундаментальных типа выражения:Строчные и числовые.
- 56 -
Строчное выражение состоит из строчных констант,строчных перемен-
ных и строчных функций (из тех,которые оканчиваются знаком доллара
"$"),опционально комбинированных со сменяющим их оператором,знаком плюс
"+".Строчные выражения редуцируются до строки;т.е. ,до последовательности
литер кода ASCIIизвестной длинны.Примерами строчных выражений являются :
"Cats and dogs"
a$
a$+z$
left$(a$+z$)
a$+mid$("cots and digs",5,3)
right$(mid$(a$+z$,1,6),3)
Числовые выражения состоят из числовых констант,переменных и функ-
ций,опционально разделяемых числовыми операторами.Числовые выражения всег-
да редуцируются к значениюодного из четырех числовых типов(целому,длинному
целому,единичной точности,двойной точности).
Примерами числовых выражений являются:
37
37/15
a
37/ф
sqr(37/a)
sqr(s+d)/a)*sin(37/a)
При формировании числовых выражений вы должны знать,что определен-
ные операции будут выполняться первыми.Ниже дан список порядка вычилений
выражения.Возведение в степень имеет наивысший приоритет;импликация-наи-
меньший.
.возведение в степень
.отрицание
.умножение,деление с плавающей точкой(*,/)
.деление нацело()
.модуль (mod)
.сложение,вычитание(-+)
.операторы отношения (<,<=,=>,>,<>)
.not (не)
.and (и)
.or (или)
.xor (исключающее или)
.eqv (эквивалентность)
.imp (импликация)
Например выражение 3+6/3 дает при вычислении 5 ,а не 3.
Поскольку деление имеет более высокий приоритет,чем сложение,опе-
рация деления выполняется первой.
При обработке операций с одинаковым приоритетом Т.Б. следует слева
направо.Например, в выражении 4-3+6 вычитание выполняется раньше сложения.
Операции внутри скобок имеют наивысший приоритет и всегда выполня-
ются первыми;внутри скобок выполняется стандартный порядок предпочтения.
Операторы
Числовые операторы классифицируются по трем главным группам:
арифметические,отношения,логические.
Арифметические операторы
Они обеспечивают выполнение обычных математических операций.Арифме-
тические операторы Т.Б. перечислены в порядке их предпочтения в таблице:
---------------------------------------------------------------
оператор действие пример
---------------------------------------------------------------
^ возведение в степень 10^3
---------------------------------------------------------------
- отрицание -16
---------------------------------------------------------------
*,/ умножение ,деление 45*19,45/19
с плавающей точкой
- 57 -
---------------------------------------------------------------
mod модуль 45mod19
---------------------------------------------------------------
\ деление нацело 45\19
---------------------------------------------------------------
+,- сложение ,вычитание 45+19,46-23
---------------------------------------------------------------
Пара этих операторов требует небольшого обьяснения.Обратной косой
чертой (\)представляется деление нацело.При делении нацело операнды округля-
ются до целых и получается усеченное частное от деления без остатка;напри-
мер ,5\2 равно 2,а 9\10 равно нулю.
Остаток от деления нацело можно определить с помощью оператора mod
.(Следует заметить ,что оператор mod имеет законное действие только для
коротких целых).Действие оператора mod подобно делению нацело,за исключе-
нием того,что выдается остаток от деления нацело,а не частное;например , 5
mod равно 1.
Операторы отношения
Операторы отношения дают вам возможность сравнивать значения двух
строк или чисел (но не значения каждого) для получения булева результата
TRUE (истинно) или FALSE (ложно) .Результат сравнения назначается как це-
лое значение -1,если отношение истинно и 0 если отношение ложно.Например,
PRINT 5>6,5<6,(5<6)*15
дает распечатку 0,-1,-15.Хотя они могут использоватьсяв любом
арифметическом выражении (например a-(b>c)/13,числовые результаты выдавае-
мые операторами отношения,главным образом6используются в операторе IF или
другом операторе,обеспечивающем принятие решения для обработки сужде-
ния,касающегося программной последовательности действий.Операторы отноше-
ния перечислены в таблице:
---------------------------------------------------------------
оператор отношение пример
---------------------------------------------------------------
= равенство X=Y
<> несходство X<>Y
< меньше чем X<Y
> больше чем X>Y
<= меньше чем или равно X<=Y
>= больше чем или равно X>=Y
----------------------------------------------------------------
Когда в каком -то выражении комбинируются арифметические операторы
и операторы отношения,арифметические операции всегда выполняются первы-
ми.Например,4=5<4*3 вычисляется как -1(истинно),потому что арифм.операции
выполняются до операции отношения,которая в конце концов тестирует истин-
ность утверждения 9<12.
Логические операторы
Логическими операторами выполняются логические (булевы) операции
над целыми.При использованиие с операторами отношения они дают вам возмож-
ность настраивать сложные тесты ,подобные:
IF DAY>29 END MONTH=2 THEN "ERROR IN DATE"
Этот оператор обеспечивает выполнение логического И над целыми ре-
зультатами,выдаваемыми двумя операторами отношения.(Оператор AND имеет
меньший приоритет ,чем операторы отношения. "<"и"=",поэтому в скобках не-
обходимости нет).Например,если DAY=30,а MONTH=2,оба оператора отношения
дают TRUE(-1).Принципы представления двоичных целых таковы,что -1 имеет
значение &HFFFF (все биты установлены);представление 0 есть &H0000,т.е.
все биты обнулены.Далее оператор AND выполняет операцию логического И над
этими двумя TRUE результатами:
1111 1111 1111 1111
and
1111 1111 1111 1111
-------------------
1111 1111 1111 1111 давая результат TRUE (ненулевой)
- 58 -
Операция OR (логическое ИЛИ) выдает TRUE ,если один или более ее
аргументов истинны,а результат FALSE(ложно) -если оба аргумента ложны.
Операция XOR(исключающее ИЛИ) выдает истинно,если значения различ-
ны и ложно ,если значения одинаковы.
-1 xor -1 есть false
5>6 xor 5<7 есть true
Функция EQV(эквивалентность) противоположна xor.Она выдает истин-
но,если два логических значения одинаковы при тестировании и возвращает
ложно ,если это не так:
-1 eqv 0 есть false
-1 eqv -1 есть true
Оператор IMP(импликации) выдает ложно ,только если первый операнд
истинно,а второй ложно:
-1 IMP -1 есть true
0 imp -1 есть true
Следует заметить ,что логические операторы работают с целыми,но не
с длинными целыми или значениями с плавающей точкой.Если операнды логичес-
кого выражения не могут быть преобразованы в целые,возникает переполнение:
X=500000
IF X OR Y THEN GO EXIT
Этот оператор IF дает ошибку переполнения если X не может быть ус-
пешно преобразовано в целое.
Битовые манипуляции
В длополнение к созданию сложных тестов,логические операторы поз-
воляют управлять основными битовыми образчиками их целых операндов.Наибо-
лее общими операциями являются AND,OR,XOR-маскирование.
AND-маски используются для очистки выбранных битов целых количеств
без воздействия на другие биты.Например,чтобы очистить 2 бита наибольшей
значности в целом значении &H3FFF ;т.е. маска содержит все единицы ,кроме
тех битовых позиций,которые вы желаете сделать нулевыми:
1001 0111 0000 0000 &H9700
and
0011 1111 1111 1111 &H3FFF (маска)
--------------------
0001 0111 0000 0000 &H1700 (результат)
OR- маской устанавливаются выбранные биты целого без воздействия на
другие биты,чтобы установить два бита наибольшей значности в &H9700,
используется OR-маска &HC000;т.е. маска содержит все нули,кроме
битовых позиций,которые вы желаете сделать единичными:
1001 0111 0000 0000 &H9700
or
1100 0000 0000 0000 &HC000
--------------------------
1101 0111 0000 0000 &HD700
XOR-маской дополняются (реверсируются) выбранные биты целого коли-
чества без воздействия на его другие биты.Например,чтобы получить дополне-
ние 2 битов наибольшей значности в &h9700,используется XOR с маской
&HC000;т.е. со всеми нулями ,кроме позиций,подлежащих дополнению:
1001 0111 0000 0000 &H9700
xor
1100 0000 0000 0000 &HC00
-------------------------
0101 0111 0000 0000 &H5700
Операции XOR обычны для графики,поскольку они позволяют обьету пе-
ремещаться ,не нарушаясь по сложному фону.Проделайте одно XOR-маскирование
того же обьекта на том же месте для его стирания,восстановливая его фон в
его первоначпльне состоянии .
Строки и операторы отношения
Т.Б. дает вам возможность сравнивать строчные данные.Строчные вы-
ражения можно тестировать на равенство,а также на "больше чем" и "меньше
чем" при алфавитном упорядочении.
- 59 -
Два строчных выражения равны,если они содержат точно одни и те же
литеры точно в одном и том же порядке.Например:
a%="cat"
print a$=cat",a$="cets",a$="cat"
Строчное упорядочение базируется на двух критериях,причем в следу-
ющем порядке:
(1) основных значениях в коде ASCII содержащихся в них литер и
(2) длине.Например,А меньше В,поскольку код ASCII для А есть
65,что меньше кода В ,равного 66.Заметим,однако,что в меньше А ,поскольку
код ASCII для каждой буквы нижного регистра больше соответствующей буквы
верхнего регистра.При сортировке смешанной информации верхнего и нижнего
регистра вы можете выбирать использование функций UCASE$ или LCASE$ для
удержания регистровых различий от влияния на сортировку.
Длина вовлекается в рассотрение только если обе строки идентичны
до длинны более короткой из них,причем более короткая оценивается как
меньшая,а длинная как большая;например,"cat"меньше ,чем "cats".
Подпрограммы,функции и процедуры
Структура программы на Т.Б. может быть упрощена посредством ис-
пользования подпрограмм,процедур и функций.Подпрограмма -это снабженный
меткой набор инструкций,подлежащих исполнению,(ссылка на которую осуществ-
ляется так же,как подрограмму),которая выполняет какую-то существенную
важную часть вашей главной программы.Функция-это набор стандартных прог-
рамм,которые выдают строчный или числовой результат,обычно имеющий отноше-
ние к параметрам,подаваемых в функцию.Помещая сложный и/или часто исполь-
зуемый код в вашу программу.
Процедуры Т.Б. и определяемые пользователем функции превосходят
проедлагаемые подпрограммами упрощения структур.Хотя миллионы Бейсик-прог-
рамм написаны с использованием GOSUB/RETURN,как их главного организацион-
ного устройства,мы постоянно рекомендуем вам принять эти более передовые
структуры.
Процедуры и функции в Т.Б. дают истинную реккурсивность,подавая
параметры и обеспечивая доступ к локальным,статистическим и глобальным пе-
ременным.Если вы никогда не имели опыта в получении выгод от передачи па-
раметров,использования нескольких переменных и реккурсивности,вы приобри-
тете его,попытавись сами задавать все это.
Процедуры и функции скорее похожи друг на друга ,чем различны.Наи-
более очевидное различие между ними состоит в том,что функции возвращают
значение и поэтому возбуждаются не явно ,появляясь в выражениях с "FN",до-
бавляемым перед ними.Процедуры не возвращают значение и должны возбуждать-
ся явно с помощью оператора CALL.
Например:
A=W+FNCUBERROOT(C) 'вызов функции
CFKK ONTCHAR(A) 'вызов подпрограммы
Подпрограмма
Подпрограммами,состоящими из снабженных метками групп операто-
ров,которые оканчиваются оператором RETURN,реализуется традиционный метод
подразделения Бейсик- программ.
Чтобы исполнить подпрограмму вы можете воспользоваться оператором
GOSUB(идти к подпрограмме) для указания метки,ассоциируемой с первым опе-
ратором подпрограммы.Когда встречаются операторы RETURN,управление возвра-
щается к оператору следующему непосредственно после вызывающего подпрог-
рамму GOSUB.Например:
GOSUB ADDMONTHS(сложение по месяцам)
PRINT TOTAL (печатать итог)
ADDMONTHS:
FOR I=1 TO 12
TOTAL=TOTAL+MONTH(1)
NEXT I
RETURN
- 60 -
Функции
Имеется два типа функций:заранее определенные функции(такие как
COS,SIN,LEFT$),которые определяются языком,и функции, определяемые пользо-
вателем,которые могут быть одно или многострочными.(Более детально о зара-
нее определенных функциях см.специальные рубрики в главе 5 "Словарь-спра-
вочник Т.Б.").
Синтаксис определения однострочной функции имеет следующий вид:
DEF FN идентификатор [список параметров]=выражение,где идентифика-
тор есть определяемое пользователем имя специального выражения.
Список параметров-это опциональная ,разделяемая запятыми,последо-
вательность из одного или более идентификаторов,которыми представляются
обекты данных,подлежащие отправке в функцию,когда она вызывается во время
прогона.(Для любой функции вы ограничиваетесь 16 параметрами).Выражение
определяет обработку,необходимую для получения значения,возвращаемого фун-
кцией.Рассмотрим,например,метеорологическую программу,в которой постоянно
должно осуществляться преобразование между градусами цельсия (которые
обычно используются внутри самой программы) и градусами форенгейта(которые
отображаются на экране и принимаются с клавиатуры).Однострочные функ-
ции-просто благо для программ такого типа:
DEF FNCTOF(градусы С)=1.8*градусы С)+32
DEF FNTOC(градусы F)=(градусы F-32)*.555555
Чтобы отобразить переменную,которая посредством преобразования
всегда удерживает значения в градусах цельсия,используется FNTOF(читается
как функция С от F) в любом операторе,которое может принимать числовое вы-
ражение;например,PRINT :
TEMP=100
PRINT FNCTOF(TEMP)
Чтобы преобразовать ваши значения из градусов фаренгейта в градусы
цельсия ,используется FNFTOC:
INPUT "ENTER TIDAY'S HIGH",TH (ввод "ввести сегодняшний максиму:"TH)
TEMP=FNFTOC(TH)
Многострочные функции Т.Б. играют более значительную роль 6чем до-
пускается простыми однострочными функциями И.Б..Т.Б. допускает распределе-
ние функций по многим программным строкам и ее эффективное использование
подобно программе,которой тоже случается возвращать значения.Формальный
синтаксис для многострочной функции выглядит следующим образом:
DEF FN идентификатор [список переменных]
[заявление переменных]
.
.
.
[EXIT DEF]
[FN имя функции=выражение]
END DEF
где идентификатором заявляется имя функции.Список параметров-это
опциональный,разделяемый запятыми,перечень формальных параметров,которыми
представляются переменные,подлежащие подаче в функцию,когда она вызывается.
В порядке иллюстрации,рассмотрим многострочную функцию
FACTORAIAL(факториал).(6!=1*2*3*4*5*6=720)
Факториал не входит в набор встроенных матоператоров Т.Б. ,но мно-
гострочные функции покрывают этот пробел:
100 DEF FNFACTORIAL(X%)
110 LOCAL I%,TOTAL#
120 IF X%<0 OR X%>170 THEN FNFACTORIAL#=-1:EXIT DEF
130 TOTAL#=1
140 FORI%=X% TO 2 STEP -1
150 TOTAL#=TOTAL#*I%
160 NEXT I%
170 FNFACTORIAL#=TOTAL#
180 END DEF
FNFACTORIAL демонстрирует структуру многострочной функции(нумера-
ция строк включена, чтобы мы могли ссылаться на различные строки по их но-
мерам в процессе обсуждения-они ,конечно,опциональны).
- 61 -
Определения функции заключены в скобки,образуемые операторами DEF
FN и END DEF.
В строке 180 функции дается ее имя и следовательно тип(# -означает
двойную точность).FNFACTORIAL имеет формальный параметр как единичное це-
лое,X%.
В строке 110 заявляется пара "локальных " переменных ,I% и
TOTAL#.Локальные переменные это временные структуры,существующие и выдан-
ные только в пределах определений функций и процедур.(подробно они обсуж-
даются позднее в разделе,озаглавленном "локальные переменные").
В строке 120 выполняется проверка ошибки в аргументе,подаваемом в
FNFACTORIAL.Нет места попыткам вычислять факториал отрицательного числа
или факториал такого значения аргумента,при котором результат получается
вне значения двойной точности,в этих случаях вы определяете возвращаемое
значение функции как -1 и выход из определения.Программа ,в которой ис-
пользуется FNFACTORIAL должна уметь распознать,что возвращаемое значение
-1 представляет условие ошибки,и соответственно себя вести.(Между про-
чим,0! определяется равным 1).
EXIT DEF предназначен для функции ,что и RETURN для подпрограммы:с
его помощью управление возвращается к оператору ,которым функция ранее вы-
зывалясь.Следует заметить ,что EXIT DEF необязателен,если у вас не возник-
нет необходимости в возврате до момента достижения конца функции.
Строками с 130 по 160 определяется алгоритм вычисления факториалов
эта часть многострочной функции можетбыть сколь угодно длинной или сколь
угодно короткой,в зависимости от необходимости.
В строке 170 определяется возвращаемое факториалом значение пос-
редством назначения имени.Как ни удивительно,назначение не является син-
таксическим требованием для определения функции.Если вы не выполняете наз-
начения имени функции,то возвращаемое значение будет неопределенно.
Определение FNFACTORIAL завершается оператором ENDDEF в строке
180.
Интересно ,сколько перестановок возможно с игральными картами:
PRINT FNFACTORIAL# (52)
дает результат 8.065817094388Е069
Поскольку FNFACTORIAL определяется как имеющий формальный пара-
метр,аргументы с плавающей точкой перед их передачей в функцию округляются
до целых;например FNFACTORIAL(2.7) есть то же самое,что и
FNFACTORIAL(3).Если вы вызываете FNFACTORIAL с числом большим,чем может
обработать стандартная программа Т.Б.,обеспечивающая преобразование к це-
лым(более 32767 или менее -32768),то во время прогона вы получите сообще-
ние об ошибке 6,переполнение.
Тот же процесс реализуется применительно к аргументам встроенных
функций Т.Б.,которые ожидают подачи целых аргументов;например:
LOCATE 2.7,1 обеспечит установку курсора на строке 3.
Сравнение формальных и актуальных параметров
Переменные,которые появляются в списке параметров определения фун-
кции,называются формальными параметрами.Они служат только для определения
функции и полностью отделены от других переменных в программе с теми же
именами.В целях иллюстрации рассмотрим эту программу:
100 DEF FNAREA(X,Y)=X*Y
110 X=56
120 PRINT X,FNAREA(2,3),X
Переменная X в строке 110 и 120 этой программы не имеет отношения
к формальному параметру X ,который определяется в функции площадь в первой
строке.Когда прогоняется эта программа,X сохраняет свое значение по обе
стороны результата обращения к FNплощадь:оба раза распечатывается 56.
Значения,которыми функция обеспечивается в период прогона,иногда
называется актуальными параметрами.В последнем примере актуальными пара-
метрами,называемыми в FNплощадь были константы 2 и 3.Так же просто акту-
альными параметрами могут быть переменные:
A=2:B=3
PRINT FNAREA(A,B)
Файлы
- 62 -
Как только вы создали программу или накопили данные,к которым вам
вновь потребуется доступ,следующий шаг состоит в том,чтобы сохранить
их.При хранении ваших данных вы создаете файл,который может использоваться
для ввода и вывода.Существуют три типа файлов,которые вы можете соз-
дать:последовательные,произвольного доступа и двоичные.Здесь мы рассмотрим
каждый из этих типов ,но прежде обратим внимание на то,как именовать файлы
и/или справочники (которые содержат несколько файлов или субсправочников).
Как граждане мира MS-DOS,файлы ,которые вы создаете и к которым
реализуете доступ с использованием Т.Б.,должны подчиняться DOS-соглашениям
об имяобразовании.Имена файлов состоят из двух частей ,отделяемых точкой:
ИМЯ ФАЙЛА.УДЛ
где имя файла может быть от одной до восьми литер,а УДЛ-удлинение
опционального типа,включающее в себя до трех литер.Если имя файла длинее
восьми литер,Т.Б. автоматически его замечает и добавляет в конце точку.Ес-
ли,например,вы вводите
TESTINGDATA (тестирование данных)
Это превращается в
TESTINGD (тестирование Д.)
Если строка имеет точку,которая отделяет имя файла от его удлине-
ния, но само имя длинее восьми литер,Т.Б. добавляет удлинение:
VERYLONGFILENAME.TBS
превращается в
VARYLONG.TBS
Если вы используете удлинение с более чем тремя литерами,лишние
литеры замечаются:
TESTING'.DATA
становиться
TESTING'.DAT
Имена файлов могут состоять из следующих литер:
А-Z 0-9 ()[]@#^%&_/'-
Следует заметить ,что литера пробела использоваться не может,а
буквы нижнего регистра автоматически преобразуются в буквы верхнего регис-
тра.Ниже дпны примеры законных имен файлов:
MYFIRST.TBS
MYIST.TBS
MY_ABC.(1)
10-25-51.XX&
В дополнение к операторам создания,чтения,записи файлов,Т.Б. рас-
полагает средствами выполнения из программы функций утилит,подобный утили-
там DOS.Оператором NAME осуществляется перенаименование файлов.Оператором
KILL-стирание файлов.Оператором MKDIR создаются справочники.CHDIR меняет
задействованный справочник.RMDIR стирает справочник.Не существует команды
COPY ,вместо ее используйте приемы двоичного файла (или SHELL для возбуж-
дения COMMAND.COM).
Имена файлов ,используемые в операторе Т.Б. (например
,KILL,OPEN),должны быть в строчной форме;например:
KILL "MYFILE.BAK"
A$="MYFILE.BAK":KILL A$
но не
KILL MYFILE.BAK
Справочники и имена проходов
В MS-DOS 2.0 и выше (Т.Б. и создаваемые с его помощью программы не
могут прогоняться на более ранних версиях) форматообразованием гибкого или
жесткого диска создается справочник фиксированного размера,известный как
корневой.Входы в корневой справочник могут представлять собой и файлы и
дополнительные справочники (называемые субсправочниками).
Подобно обычным файлам,субсправочники имеют свои собственные стан-
дартные файловые имена и удлинения,в результате чего получается система
файлов и справочников, представляющее собой повернутое вершиной вниз дерево.
В верхней части системного дерева находится корневой справочник
имя которого заранее определяется как одна обратная косая черта ([).
- 63 -
Файлы в дереве специфицируются посредством указания цепочки спра-
вочников,или имени прохода который к ним ведет.
Имена проходов образуются посредством перечисления субсправочников,ведущих
к файлу,отделяемых друг от друга обратной косой чертой .Например,
C:\TURBO\BASIC\GAMES\CHESS.BAS
Ведущая обратная косая черта указывает,что проход начинается у
корневого справочника,в противоположность текущему справочнику.DOS удержи-
вает след текущего справочника (известного как задействованный или спра-
вочник по умолчанию),по которому пойдет поиск файлов,когда вы не специфи-
цируете проход.Если имя прохода не начинается с обратной косой четрты ,то
им описывается проход относительно текущего справочника,если текущим явля-
ется \TURBO\BASIC ,оба следущие описания точно определяют местоположение
CHESS.BAS
GAMES CHESS.BAS
или \TURBO\BASIC\GAMES\CHESS.BAS
В каждом субсправочнике,при перечислении из DOS ,указываются два
специальных файла :"." и ".." имя файла с одной точкой указывает справоч-
ник,подлежащий включению в перечень как субсправочник.Имя файла с двумя
точками обеспечивает ссылку на родительский файл этого справочника.
Приемы хранения файлов
Т.Б. представляется три различных способа хранения информации на
диске и нахождения ее на нем:ввод /вывод последовательных,произвольных и
двоичных файлов .У каждого из ниж есть преимущества и недостатки,поэтому
какой из них окажется лучшим,для вас в работе зависит от вашей области
применения.
Краткий экскурс в управление базами данных
Традиционная номенклатура программирования подразделяет файлы дан-
ных на отдельные записи,каждая из которых состоит из одного или более по-
лей.Например,в программе перечня почтовой рассылки каждая запись в файле
данных представляет лицо.В каждой записи имеются поля,содержащие особые
сведения об этом лице.Например,штат и ZIP-код(код по программе зонального
усовершенствования почтовой системы США)-этг два поля,которые вы можете
найти в файле перечня почтовой рассылки.При бумажном представлении строки
соответствуют записям,колонки-полям:
-----------------------------------------------------------------
имя адрес город штат ZIP класс оклад
-----------------------------------------------------------------
KATI GARVEY 1010э.редвурд сиу-сити айвова 51103 73 0.00
ЭНДРУ РИЧ 37АНДЕРСОН-РОУ хЬюСТОН ТЕхАС 77018 58 500.00
-----------------------------------------------------------------
Этот файл почтовых отправлений бывших школьников имеет три запи-
си,по семь полей в каждой.
По причинам,которые мы кратко поясним,обычно делается различие
между числовыми и строчными полями,в этом номере последние три поля явля-
ются числовыми ,остальные строчными.
Последовательные файлы
Командами последовательных файлов Т.Б. создаются текстовые фай-
лы:файл литер кода ASCII с парами возврат каретки/подача строки,разделяю-
щими записи.
Вполне вероятно,что наилучшим поводом для применения последова-
тельных файлов является степень их портативности для других программ,язы-
ков программирования и компьютеров.По этой причине вы часто можете видеть
в последовательных файлах некий общий знаменатель обработки данных:они мо-
гут считываться программами для пословной обработки и редактирования,и по-
сылаться через серийные устройства коммутации к чужим компьютерам.
Идея,на которой базируется последовательные файлы,сама по себе
проста:записать в них , как если бы они представляли собой экран,и считы-
вать из них,как если бы они являлись клавиатурой.
- 64 -
Создавайте последовательный файл, применяя следущие шаги:
1.OPEN (открыть)файл в режиме последовательного OUTPUT(выво-
да).
Последовательные файлы имеют две опции для подготовки файла к вы-
воду:
OUTPUT:если файл не существует,создается новый файл.Если файл уже
существует,его содержимое стирается,а затем он трактуется как новый файл.
2.Вывести данные в файл.Для записи данных в последовательный файл
используют WRITE# (записать),PRINT# (напечатать) или PRINT USING# (напеча-
тать,используя).
3.CLOSE (закрыть) файл.Оператором CLOSE закрывается некоторая пе-
ременная файла после завершения программой всех операций ввода/вывода.
Чтобы считать последовательный файл:
1.OPEN файл в режиме последовательного INPUT (вывода).
2.считывать данные из файла,используя операторы Т.Б. INPUT ,INPUT$
,LINE INPUT#.
3&CLOSE файл.Оператором CLOSE закрывается некоторая файловая пере-
менная после завершения программой всех операций ввода/вывода.
Отрицательной стороной последовательных файлов явл. то ,что вы об-
ладаете только последовательным доступом к вашим данным.Вы получаете за
один раз доступ к одной записи,начиная с первой.Это означает,что вы желае-
те получить последнюю запись из последовательного файла с 23000 запи-
сей,вам приднтся пройти через первые 22999 записей.
Пoэтому последовательные файлы лучше всего подходят к таким облас-
тям применения,в которых осуществляется последовательная обработка(напри-
мер подсчет слов,проверка орфографии,печать почтовых меток в файловом по-
рядке) или в которых все данные можно держать в памяти одновременно.Это
дает вам возможность считывать файл за один проход при запуске программы и
записывать его весь в конце.В промежитке между началом и концом доступ к
информации может осуществляться через временные произвольного доступа ис-
ходные условия,реализуемые в виде числовых и строчных массивов.
Последовательные файлы органически подходят для таких ситуаций в
базе данных,когда длина индивидуальной записи переменна.Например,предполо-
жим,что список питомцев имеет поле коментариев.Некоторые люди могут иметь
коментариев на 100 байтов и более;другие ,возможно большинство не имеют их
вовсе.Последовательными файлами эта проблема решается без пустых трат дис-
кового пространства.
С использованием Т.Б. можно создавать два типа последовательных
файлов :(1) последовательные файлы с разделителями полей,где каждое поле в
каждой строке файла отдкляется спецлитерами ,и (2) безразделительные пос-
ледовательные файлы,где каждое поле выглядит совершенно так же ,как если
бы его данные отображались на экране или расчитывались на печатающем
устройстве.Эти два типа файлов создаются с помощью операторов WRITE# и
PRINT#,соответственно.(Используйте INPUT#,INPUT$ или LINE INPUT# для счи-
тывания информации из одного из типов последовательного файла).
Последовательные файлы с разделителями полей
Взглянув на последовательный файл ,созданный Т.Б.,вы можете заме-
тить,что данные в нем разделяются запятыми,а любая строчка заключается в
двойные кавычки-точно в той форме,в которой осуществляется поиск данных с
использованием оператора INPUT#.(Двойные кавычки,окружающие строки,удержи-
вает вас от попадания в затруднительное положение в связи с запятыми,со-
держащимися в строках.Числа не нуждаются в кавычках,поскольку они записы-
ваются без запятых).
Рассмотрим следущую программу и исполним ее:
'зтой программой открывается последовательный файл
'для вывода ею записывается пара строк различных
'типов данных в файл с использованием оператора
' write#
OPEN "SEQUENTI.BAS" FOR OUTPUT AS #1
STRINGVARIABLE$="THIS IS STRING OF TEXT"
INTEGER%=1000
FLOATINGPOINT!=30000.1234
когда файл создается для считывания с помощью оператора INPUT#,ис-
- 65 -
пользуется оператор WRITE# ,а не PRINT#&
Безразделительные последовательные файлы
В безраздилительном последовательном файле данные выглядят в точ-
ности так,как если бы они отображались на экране с использованием PRINT
или распечатывались на печатающем устройствес использованием оператора
LPRINT.Рассмотрим и исполним следущую программу:
'эта программа открывает посл.файл для вывода
'она записывает пару строк различных типов данных в файл ,исполь-
'зую оператор PRINT# и PRINT#USING.
OPEN "SEQUENTI.BAS" FOR OUTPUT AS #1
STRINGVARIABLE$="Это строка текста"
INTEGER%=1000
FLOATINGPOINT!=30000.1234
PRINT# 1,STRINGVARITABLE$,INTEGER%,FLOATINGPOINT!
STRINGVARITABLE$="Это другая строка"
INTEGER%=-32767
FLOATINGPOINT!=123454321
PRINT#1,USING "#####&##.##^^^^";INTEGER%_
STRINGVARIABLE$,FLOATINGPOINT!
CLOSE #1
END
Содержимое файла SEQUENTI.BAS выглядит следущим образом:
это строка текста 1000 30000ю12306875
-32767другая строка 12.35E+03
Важно обратить внимание на то ,что в данном случае существует фор-
мат данных,и на то как происходит считывание .Если вы попытаетесь исполь-
зовать тот же оператор INPUT#,что и во втором примере программы,Т.Б. выда-
ет ошибку периода прогона.Т.Б. будет считывать слово "Это" первой строки
как строчную переменную и попытается считать следущие два слова как две
числовые переменные.Вместо этого вы должны использовать INPUT$ илиLINE
INPUT#.
Следущая программа считывает последовательный файл ,который был
создан программой из последнего примера:
' эта программа открывает последовательный файл для ввода
'она считывапет пару строк различных типов данных из файла с ис-
'пользованием операторов LINE INPUT# и INPUT$
OPEN "SEQUENTI.BAS" FOR INPUT AS #1
STRINGVARIABLE$=" "
STRINGVARIABLE$=INPUT$(80,1)
PRINT STRING VARIABLE$
LINE INPUT #1,STRINGVARIABLE$
PRINT STGINGVARIABLE$
CLOSE #1
END
Ниже представлены операторы и функции Т.Б. ,которые управляют вво-
дом/выводом последовательных файлов:
-------------------------------------------------------------
оператор /функция операция
-------------------------------------------------------------
CLOSE прекращаются операции над файлом(ах)
EOF возврат сигнала о достижении конца файла
INPUT# читывание записи(строки текста)в указанную пере
менную
INPUT$ считывание N литер в строчную переменную
LINE INPUT# считывание целой строки в строчную переменную
OPEN открывается файл для ввода/вывода
PRINT# осуществляется печать в файл как если бы это было печат
PRINT#USING ающее устройство или экран
WRITE в файл записываются данные ,разделяемые запятыми
--------------------------------------------------------------
Произвольные файлы
- 66 -
Файлы произвольного доступа состоят из записей,доступ к которым
возможен в любой последовательности.Это означает,что данные храняться точ-
но так ,как они появляются в памяти,в результате чего достигается экономия
времени при обраьотке хранения (по причине отсутствия необходимости в
трансляции),как призаписи файла,так и при его считывании.
Вообще говоря,произвольные файлы являются лучшим решением проблем
организации баз данных,чем последовательные файлы,хотя и они не без недос-
татков.Один из них -произвольные файлы не слишком транспортабельны.Вы не
можете заглянуть в них с помощью редактора или набрать их каким-то осмыс-
ленным образом на экране.Фактически,для перемещения произвольного файла
Т.Б. к другому компьютеру или для другого языка вам ,вероятно,потребуется
написать какую-то трансляционную программу считывания произвольного файла
и вывода текстового(последовательного ) файла.Поскольку в И.Б. для значе-
ний с плавающей запятой используется нестандартный формат МИКРОСОФТ, а в
Т.Б. стандартные соглашения IEEP для плавающей точки.Вы не сможете считы-
вать поля с плавающей точкой из произвольных файлов,созданных в И.Б.,с
помощью программы на Т.Б., и наоборот без какой-то дополнительной работы.
Нами предусмотрено четыре специальные функции для выхода из этого
затруднения:CUMS и CVMD для переключения числовых полей в формате МИКРО-
СОФТ в переменные единичной и двойной точности в строки формата МИКРО-
СОФТ,которые можнозатем записывать в файл.
Главное преимущество произвольных файлов выражено в их имени:в лю-
бое время доступна каждая запись файла.Например,в базе данных из 23000
бывших питомцев программа может идти прямо к записи 22709 или 11663 без
считывания всех других.Эта возможность делает их единственным выбором для
организации больших файлов,а вероятно и лучшим выбором для маленьких,осо-
бенно тех,которые имеют относительно постоянные длины записей.
Произвольные файлы могут быть причиной бесполезного расходования
дискового пространства,посколько оно распределяется с ориентацией на наи-
большее возможное в каждой записи поле.Например,включение поля комментари-
ев в 110 байтов приводит к занятию каждой записью дискового пространства
110 байтов,даже если его использует только одна из тысячи записей.
Другая крайность состоит в том,что если имеют постояную длину,осо-
бенно если они содержат в большинстве своем числа,на произвольных файлах
может экономить пространство в обьеме ,большем того,который дает последо-
вательная форма. В эквивалентном файле кажый элемент одного и того же типа
(целое,длинное целое и т.д.)занимает одно и то же количество дискового
пространства.Например,для каждого из следущих значений требуется 4 байта:
0
1.660965Е-27
15000.1
641
623000000
В отличие от этого,в последовательном файле для чисел потребуется
столько байтов,сколько они занимают при распечатке в литерах ASCII,плюс
один байт для разделительной запятой.Например,
WRITE# 1,0:0 занимает 3 байта
PRINT# 1,0:0 занимает 6 байтов
PRINT# 1.66.56E-27 занимает 13байтов
Умеренной ценой ,которую вы платите за выигрыш от использования
произвольных файлов,является некоторая дополнительная обработка,необходи-
мая для получения строк и чисел при выводе,а такие при вводе в той фор-
ме,которая может обрабатываться стандартными программами средствами произ-
вольных файлов.
Вы можете создавать ,записывать и считывать произвольные фай-
лы,прибегая к следующим шагам:
-открыть и специфицировать длину каждой записи
OPEN FILESPEC AS [#] имя файла LEN=записи.размер
Параметром LEN Т.Б. указывается ,что это файл произвольного досту-
па.В отличии от последовательного файла,вы не заявляете о его открытии для
ввода или вывода,поскольку произвольный файл можно одновременно считывать
и записывать.
-исполнить оператор FIELD для определения маппирования последова-
тельностью строчных переменных (после ее обработки они становяться "пере-
менными поля")
- 67 -
FIELD имя файла,ширина AS-строчной переменной[ширина AS строчной
пер.]...
данный буфер представляет собой загрузочный склад данных,подлежа-
щих записи в этот конкретный файл или считывания из него.Для данного про-
извольного файла оператор FIELD долежо исполняться 6по крайней мере ,один
раз.
-Чтобы записать в файл ,используйте LSET и RSET для загрузки долж-
ны быть преобразованы в строчную форму с помощью подходящей после чего
можно использовать LSET или RSET.Наконкц для записи в файл на специфициро-
ванной вами позиции используется PUT.
-Чтобы считать запись из файла ,используется GET ,числовые пере-
менные вашей программы загружаются из подходящих переменных буфера.Прежде
чем вы сможете что-то с этим сделать,числовые данные должны быть преобра-
зованы из строчной формы с помощью одной из функций преобразования(напри-
мер CVS для единичной точности).
-По окончании CLOSE (закрыть) файл.
Ниже перечислены операторы и функции Т.Б.,используемые для управ-
ления считыванием и записью произвольных файлов:
----------------------------------------------------------------
оператор/функция операция
----------------------------------------------------------------
CLOSE закрыть файл
CVI,CVL,CVS,CVD преобраз.переменную поля в соответств
ующий тип
FIELD определить переменную поля
GET считать запись
LOC определить номер записи,считываемой послед
ней
LSET,RSET назначить переменную поля
MKI$,MKL$,MKS$,MKD$ преобразовать спец. числовые типы в форму,кото
рая может быть назначена переменной поля
MKMS$,MKMD$,CVMS,CVMD спец. функции для трансляции формата МИКРОСОФТ
OPEN открыть файл,как произвольный
PUT записать запись
----------------------------------------------------------------
пример:
'программа считывания из базы данных перечня почтовых отправлений
'пользователь вводит номер записи;программа отражает все поля
'для этой записи
' этой программой не могут считываться последовательные файлы
OPEN "ADDRESS.DTA " AS #1 LEN=81
FIELD #1 25 AS ИМЯ$,25 AS АДРЕС$,18 AS ГОРОД$,2 AS КЛАСС$,4 AS_
ВКЛАД$
INPUT "какую запись вы желаете видеть",номер_записи
GET #1,номер_записи
PRINT "данные для записи"номер_записи
PRINT "имя: "имя$
print "адрес :"адрес$
PRINT "город/штат/zip"город$,штат$,cvl(zip$)
PRINT "класс :"cvi(класс$)
PRINT "самый последний вклад:"cvl(вклад$)
предостережение :НЕ используйте переменную поля с левой стороны
оператора назначения.Назначением переменной поля осуществляется разьедине-
ние переменной с назначенным ей буфером.Например:
после ZIP$=AS
переменная поля ZIP$ более не относиться к буферу,который был ей
назначен в операторе FIELD.Следовательно операторами LSET и RSET она обр
атно выдаваться не будет.
Двоичные файлы
Прием обработки двоичных файлов в Т.Б. есть расширение И.Б.,кото-
рое дает вам возможность открывать любой файл как числовую последователь-
ность байтов вне зависимости от литер ASCII,соображении о различии строк и
чисел,длины записи,возвратов каретки или чего-либо еще.
- 68 -
При двоичном подходе к проблеме файла,вы его считываете и записы-
ваете,специфицируя какие байты записать и куда в файле они должны пой-
ти.Это похоже на услуги,обеспечиваемые вызовами DOS-системы для считывания
и записи файлов.
За гибкость всегда приходится платить.Файлы двоичного режима тре-
буют ,чтобы вами была проделана вся работа по решению того,что куда
идет.Двоичный режим может быть наилучшей опцией при работе с выравниными
файлами,которые не привязаны к формату ASCII;например,файлы DBASE или
LOTUS 1-2-3.
Конечно вы должны знать точную структуру файла,еще до того ,как
попытаетесь разбить его на числа и строки,согласуемые с Т.Б..
Каждый файл,открываемый в двоичном режиме,имеет назначенный пози-
ционный индикатор,который указывает место в файле6которое будет считывать-
ся или записываться следующим.Для установки позиционного индикатора ис-
пользуется оператор SEEK,а для считывания-функция LOC.
Двоичные файлы доступны следующим образом:
1.OPEN файл в BINARY режиме.Вам нет необходимости специфицировать
будете заниматься считыванием или записью-вы можете не делать ни того ,ни
другого.
2.Чтобы считать файл,используется SEEK для позиционирования файло-
вого указателя на байте,который вы желаете считывать.Затем,для считывания
специфицированного числа литер (от 1 до 32767) в строчной переменной,ис-
пользуется оператор GET$.
3.Чтобы записать файл,загружается строчная переменная с подлежащей
записи информацией.Затем,для спецификации строчных данных и точки в фай-
ле,с которой она должна записываться,используется оператор PUT$.
4.По окончании,CLOSE (закрыть файл).
Ниже перечислены операторы и функции Т.Б. для управления чтением и
записью двоичных файлов.
---------------------------------------------------------------
оператор/функция операция
---------------------------------------------------------------
CLOSE закрыть файл
GET$ считывается специфицируемое число начиная
с поисковой позиции
LOC определяется поисковая позиция в файле
LOF возвращается длина файла
OPEN открывается файл и заявляется,что он двоичный
PUT$ записывается специфицируемое число байтов,начиная
с поисковой позиции
SEEK перемещается поисковый идентификатор
---------------------------------------------------------------
Устройство ввода/вывода
Т.Б. поддерживает так называемые файлы устройств,т.е. аппаратные
устройства,такие как клавиатура,экран и печатающее устройство,как если бы
они были последовательными файлами.Каждое поддерживаемое устройство имеет
зарезервированное файловое имя,которое оканчивается двоеточием:
---------------------------------------------------------------
имя функция
---------------------------------------------------------------
KYBR:(клавиатура) клавиатура может открываться для ввода.считыв
ание из файла устройства KYBR: подобно использованию INKEY$
SCRN:(экран)экран может открываться для вывода записи в SCRN: по-
добно PRINTING(распечатке)
LPT1-3: устройства строчной печати 1-3
COM1-2: коммуникационные устройства 1 и 2
---------------------------------------------------------------
Например:
OPEN "SCRN:"FOR OUTPUT AS $ 1:PRINT #1,"HELLO"(открыть "экран:"для
вывода AS #1 ,"алло")
имеет тот же эффект ,что и PRINT "HELLO"
а
OPEN "KYBRD:FOR INPUT AS #1:INPUT #1,AS#1:INPUT #1,A$,B$
- 69 -
(открыть "клавиатура " для ввода AS #1:ввод#1,a$,b$
есть то же самое,что и
INPUT A$,B$
Графика
Когда она подходит к отражаемой на экране информации,программа,ге-
нерированная Т.Б.,должна работать в рамках ограничений,дозволенных ей ап-
паратным дисплейным оборудованием.Т.Б. поддерживает три главных класса ви-
део-интерфейсов на РС и совместимых с ними:
монохромный дисплейный адаптер,который годиться только для монох-
ромного текста,а также цветной /графичкский адаптер(CGA) и улучшенный гра-
фический адаптер (EGA),каждый из которых может давать графику в цвете и
черно-белую
-----------------------------------------------------------------
адаптер режим экрана формат текста примечания
-----------------------------------------------------------------
монохром 0 80 колонок 80х25 литер с 4 атрибутами
(нормальный,яркий,мерцающий
с подчеркиванием)
-----------------------------------------------------------------
CGA 0,1,2 40/80 колонок до 16 цветов(только в тексто-
вом режиме);до 4 цветов в
графическом режиме.Разрешающая
способность экрана 64х200
пиксел
------------------------------------------------------------------
EGA 0,1,2,7,8,9,10 40/80колонок разрешающая способность экрана
до 640х350 пиксел.До 16 цве-
тов из 64-цветной палитры в за-
висимости от памяти EGA)
-------------------------------------------------------------------
В соответствии с художественными талантами этих видео-плат,Т.Б.
может выбирать любой режим с помощью оператора SCREEN или WIDTH.
Текстовые режимы
В 80 -колонном текстовом режиме экран состоит из 25 строк по 80
литерных позиций в каждой,нумеруемых от 1 до 25(сверху вниз)и от 1 до 80
(слева направо).В режиме 40-колонного текста(именующемся на адаптерах
CGA/EGA)экран состоит из 25 строк по 40 литер.Каждая позиция каждой строки
может содержать в таблице литерного набора приложения F.
!\ !
! \ !
! строки (1-25) строка 25 !
! / колонка 80 !
! / \ !
!-----------------------------------------------------------#!25
Строка 25 зарезервирована для отображения программных клавиш.
Вообще говоря,вы помещаете литеры на экран ,перемещая курсор в же-
лаемое положение с помощью оператора LOCATE,а затем используйте PRINT .Эк-
зотические литеры которые трудно генерировать на клавиатуре ,можно полу-
чать с помощью функции CHR$.
25-я строка экрана заслуживает специального рассмотрения:операто-
ром KEY она загружается описаниями функциональных клавиш.Чтобы защитить
эти описания клавиш вы не выключаете отображение функциональных клавиш с
помощью KEY OFF.
Для монохромных адаптеров оператор COLOR можно использовать с
целью создания специальных эффектов,таких как инверсия и уменьшение ви-
део-интенсивности,а также подчеркивание и/или мерцание текста.В случае
адаптера CGA/EGA ,оператор COLOR используется для выбора того цвета,кото-
рый будет отображаться при выводе посредством оператора PRINT.
В текстовом режиме адаптеры CGA/EGA поддерживают до восьми страниц
- 70 -
отображения;отображаемая страница устанавливается с помощью оператора
SCREEN.
Графические режимы
Т.Б. имеет полный комплект программ для графического вычерчивания
точек,линий и фигур на экране в различном цвете.Если увас нет подходящего
аппратного видео-оборудования,такого как CGA/EGA ,эти команды не будут ра-
ботать так ,как здесь описано.(это приводит к ошибке вызова незаконной
функции).
В графическом режиме экран трактуется как сетка малых точек,или
пиксел,любая из которых может включаться (как белая или какого-то цвета)
или выключаться (в цвете фона,обычно черном).Пикселы идентифицируются их
положением на (X,Y) сетке,началом координат которой по умолчанию является
верхний левый угол экрана.Значение Х представляет собой расстояние по го-
ризонтали от левой кромки экрана,а значение Y -расстояние по вертикали от
верхней кромки экрана.Следует заметить,что это представление для Y являет-
ся обратным по отношению к обычной декартовской геометрии,в которой мень-
шие значения Y получаются по мере перемещения сверху вниз.
В зависимости от выбранного режима (а возможно и от размера ви-
део-памяти вашей установки)горизонтальная разрешающая способность может
быть 320 или 640 пиксел,тогда как по вертикали эти величины состовляют 200
или 350 .Эта комбинация определяет также число возможных цветов(2/*/16) и
максим. количество видео-страниц(1/2/4/8).Нумерация пиксел индексируется
от нуля,что отличается от нумерации рядов и колонок текста,которая начина-
ется с единицы.
(0,0)! !(319,0)
! <-------320 пиксел по горизонтали-----> !
! !
! !
! 200 пиксел по горизонтали !
! !
!(0,199)----------------------------------------------(319,199)
Каждый пиксел имеет ассоциированное с ним цветовое значение(или
атрибут) в диапазоне от 0 до макс. в конкретном режиме.Цвет,получающийся
по каждому значению,находится под управлением операторов COLOR и PALETTE.
Точка последней ссылки
После большинства графических операций некий кончик паза отображения
"парит " над какой -то X,Y-координатой экрана.Положение этого паза называ-
ется точкой последней ссылки или LPR.Когда вы впервые возбуждаете графи-
ческий режим с помощью оператора SCREEN,LPR устанавливается в центре экрана.
Определенные чертежные команды способны принимать LPR как коорди-
натный аргумент.Например,Если оператором LINE задается только точка расс-
тояния,линия вычерчивается между LPR и специфицированной точкой расстоя-
ния.Далее эта точка становиться LPR.
Абсолютные и относительные координаты
Большинством графических операторов Т.Б. могут специфицироваться
координаты как в относительной,так и в абсолютной форме.
В абсолютной форме координатной парой (X,Y) точно описывается ,где
должна произойти операция,например,PSET(50,75) обеспечивает включение пик-
села,находящегося на расстоянии 50 пиксел от левой и на 75 пиксел от верх-
ней кромок экрана.
В относительной форме координата специфицируется относительно LPR
и представляет собой приращение от LPR по горизонтали и вертикали.Для раз-
личия этой формы и стандартных абсолютных координат в ней используется
ключевое слово STEP.например,если LPR есть (60,75):
PSET(10,20) специфицирует точку (10,20)
PSET STEP (10,20) специфицирует точку (70,95),находящуюся на 10
- 71 -
дальше и 20 ниже LPR.Отрицательные относительные координатные значения
специфицируют точку выше и левее LPR.
Переопределение экранных координат
Если вам неудобна эта адресная система,для изменения маппирования
пары(X,Y) ,задаваемой в операторах графики и вычерчиваемой на экране пик-
селами,используйте оператор WINDOW(окно).
Например:
WINDOW (-1,1)-(1,-1)
переопределяет экранные координаты к наиболее подходящей декарто-
вой плоскости аналитической геометрии,с началом координат в средней части
и значениями Y ,возрастающими при перемещении вверх.После этого
оператора WINDOW оператор PSET(0,0) включает физический пиксел (100,16)
PSET (-1,-1) дает самый нижний и самый левый пиксел экрана,а PSET (5,5)
включает физический пиксел (220,50) в середине верхнего правого квадра-
та.применяя окно можно значительно упрастить генерирование математических
диаграмм и графиков.
Оператор VIEW дает вам возможность создавать активный регион или
"окно" на экране графики и оптимально специфицировать координаты относи-
тельно верхнего угла окна. Вне окна вы не можете манипулировать пикселами.
В число графических команд входят следущие:
-------------------------------------------------------------
команда функция
-------------------------------------------------------------
CIRCLE вычертить всю или часть окружности
COLOR выбрать цветовую палитру или цвет фона
DRAW мини-чертежный язык
GET загрузить числовой массив с пиксел-информацией с экр
ана
LINE вычертить линию или рамку ,заданную двумя точками
PAINT заполнить замкнутую зону сплошным цветом или образчиком цвет
овой гаммы
PALETTE выбор одного или более цветов палитры
PALETTE USING изменить все коды палитры одним оператором
PMAP выполнить маппирование
POINT возвратить информацию о точке или точке последней ссылки
PRESET установить точку графика
PUT копировать содержимое числового массива на экран
SCREEN выбор графического режима
VIEW заявить активную зону для графических операций
WINDOW определить координаты окна
---------------------------------------------------------------
Глава 5
Словарь-справочник ТУРБО-БЕЙСИКА
200 с лишним команд ТУРБО-БЕЙСИКА можно сгруппировать соответственно
их синтаксическому классу в функции,операторы,системные переменные и метао-
ператоры.
Функции (заранее определенные в отличие от определяемых пользователем)
возвращают значение и потому должны использоваться внутри выражений.Для
большинства из них требуются один или более аргументов;например:
t=cos(3.1) -числовая функция с 1 числовым аргументом
t$=left$("cat",2) -строчная функция с 1 строчным и одним числовым ар-
гументами
Операторы-это неделимые строительные блоки,образующие программы.Опера-
торы должны появлятся в строке,занимая ее целиком,или с разделяющими смеж-
ные операторы двоеточиями,например:
CIRCLE (160,100),50 -чертить окружность
CALL Mysub(x,y,z) -вызвать процедуру
a=a+1 -присвоение (см. оператор LET)
Системные переменные являются заранее определенными идентификаторами
для доступа и управления определенной системой информации,например:
a$=DATE$ -считать системную дату
TIME$="00:00" -установить системное время
Метаоператоры представляют собой директивы компилятору.Если быть точ-
ными,они не являются частью языка, но вместо этого работают на другом уров-
не,управляя поведением компилятора,например:
$INCLUDE "module1.tbs" -загрузка и обработка включаемого файла
$STACK &H1000 -см.размер стека
Метаоператоры,подобно субменю опций компилятора,управляют компилятором
во время компиляции,а не компьютером во время прогона.Метаоператорам пред-
шествует знак доллара ($) для отличия их от обычных операторов.В строке мо-
жет быть только один метаоператор и,в отличии от некоторых других компили-
рованных Бейсиков,они не помещаются внутрь REMARKS(замечаний).
Формат справочника
-------------------
Каждый вход справочника содержит описание,синтаксис,общие замечания и
пример использования оператора,функции или процедуры.Где это приемлемо,свя-
занные входы снабжены перекресными ссылками,оговорены любые ограничения
применения,а также отмечены любые различия в использовании их в Турбо-Бей-
сике и интерпретаторе Бейсика.
Ниже приведены соглашения,касающиеся синтаксического описания,исполь-
зуемого в алфавитном порядке команд.
Числовое выражения
-------------------
Числовая константа,числовая функция или числовая переменная,либо их
комбинация,в которой используются арифметические,логические операторы и
операторы отношения.Иногда специфицируется тип числового выражения,например
целое выражение:
---------------
16
X
16^X
SIN(3.14159)
SIN(X/(16*X))
Строковое выражение
--------------------
Строковая константа,строковая переменная или строковая функция,либо их
комбинация ,опционально включающая в себя оператор сцепления,знак
плюс(+).Например:
"CAT"
a$+"CAT"
LEFT$(a$+"CAT$",4)
- 73 -
Спецификация файла
-------------------
Строчное выражение описывающее имя файла MS-DOS (восемь литер с опцио-
нальным трехлитерным расширением,которому предшествует точка,регистр без-
различен),возможно включающее в себя спецификацию привода и/или прохода.За
исключением случаев снабженных замечаниями,имена файлов должны выражаться
как строчные переменные,либо заключаться в двойные кавычки,например:
"MAYFIRST.BAS"
"turbobas\myfirst.bas"
"a:\turbobas\myfirst.bas"
Проход
-------
Строчное выражение,описывающее законный субсправочник на зарегистриро-
ванном приводе.Например:
"\TURBOBAS"
"GAMES"
LPR
----
"Точка последней ссылки"(LPR) используется как неявное координатное
значение в некоторых графических операциях и устанавливается большинством
операторов графики .
Метка
------
Метка представляет собой либо алфавитно-цифровую метку,либо номер
строки,идентифицирующие программную строку.Номера строк и метки более или
менее взаимозаменяемы в синтаксисе Турбо-Бейсика,за исключением того,что
метки должны появляться в строке сами по себе,как таковые.
Типографические особенности
----------------------------
Курсивом указывают зоны команд,подлежащие заполнению специальной ин-
формацией области применения,например:
REG register,value
Текстом в литерах верхнего регистра обозначается часть команды,которая
должна присутствовать дословно,например:
RESUME NEXT
Квадратные скобки ([]) обозначают ,что заключенная в них информация
является опциональной,например:
OPEN filispec as [#]filenum
означает,что вы можете включать знак номера (#) перед номером файла в
операторе OPEN (открыть),либо отказаться от него по вашему выбору.Поэтому
законны обе следущие команды:
OPEN "cust.dta" AS 1
OPEN "cust.dta" AS #1
Фигурными скобками ({}) указывается выбор двух или более опций,одна из
которых должна использоваться обязательно.Опции разделяются вертикальной
чертой.Например:
KEY {on!off}
означает,что законны оба заявления KEY ON и KEY OFF,а само по себе KEY
незаконно.
Многоточием (...)отмечается,что часть команды может повторится столько
раз,сколько необходимо.Например:
READ variable[,variable]...
означает,что одним оператором READ может отрабатываться множество пе-
ременных,разделяемых запятыми:
READ a$
READ a$,b$,a,b,c
Три вертикально расположенные точки указывают на пропуск одной или бо-
лее строк программного текста:
FOR n=1 to 10
.
- 74 -
.
.
NEXT n
Метаоператор $COM
------------------
Функция $COM распределяет пространство для приемного буфера последова-
------- тельного входного устройства.
Синтаксис $COM n size
---------
Замечания n указывает коммуникационный адаптер (1 или 2),а size (размер)
--------- есть целая константа,определяющая емкость буфера для этого
адаптера (от 0 до 32767).По умолчанию-256.Значение по умолчанию может уста-
навливаться и храниться в меню опций.Значения по умолчанию могут изменяться
метаоператорами в программе.
Ограничения Размер буфера специфицируемый в операторе $COM,должен
----------- находиться в диапазоне от 0 до 32767.Интерпретаторный
Бейсик будет располагать буфер одного и того же размера для обоих
коммуникационных входных устройств,если они существуют.В Турбо-Бейсике
размеры этих двух буферов устанавливаются независимо.
Различия При возбуждении в интерпретаторном Бейсике эта функциональность
--------- доступна только через параметры камандной строки.
Пример 'оператор $COM используется для изменения пространства по
'умолчанию,распределяемого для буферов последовательных
'входных устройств.Настроить подпрограмму для обработки
'COM- ввода
$COM 1 1024 'настраивается буфер ввода 1 К
ON COM(1) GOSUB получить комввод
COM(1) ON 'включить обработку COM ввода
OPEN "COM1" AS #1 'oткрыть переменную файла как COM1
PRINT "Нажмите любую клавищу для завершения программы"
'пока клавиша еще не нажата
WHILE NOT INSTAT
LOCATE 2.1
PRINT TIME$ 'отобразить время
WEND
Пример 'оператор $COM используется для изменения пространства по
'умолчанию,распределяемого для буферов последовательных
'входных устройств.Настроить подпрограмму для обработки
'COM- ввода
$COM 1 1024 'настраивается буфер ввода 1 К
ON COM(1) GOSUB получить комввод
COM(1) ON 'включить обработку COM ввода
OPEN "COM1" AS #1 'oткрыть переменную файла как COM1
PRINT "Нажмите любую клавищу для завершения программы"
'пока клавиша еще не нажата
WHILE NOT INSTAT
LOCATE 2.1
PRINT TIME$ 'отобразить время
WEND
END 'конец программы
ПолучитьКомввод : 'обработать COM-порт прерывание
'считать ввод из буфера COM-порта
INPUT #1,КомПортВвод (заголовок %)
RETURN
КонецВвода: 'конец COM-порт ввода
PRINT "Достигнут конец ввода"
END 'конец программы
Метаоператор $DYNAMIC
----------------------
Функция $DYNAMIC заявляет ,что размещение массива по умолчанию
-------- должно быть динамическим.
Синтаксис $DYNAMIC
----------
Замечания Метаоператор $DYNAMIC не имеет аргументов и
---------- заявляет, что тип размещения массивов по умолчанию должен быть
динамическим.Пространство для динамических массивов распределяется во время
прогона.Для ликвидации массива используйте оператор ERASE.Динамические мас-
сивы дают более эфективное использование памяти.
Массивы можно заявлять как динамические с помощью ключевого слова DYNAMIC
- 75 -
или аргументов выражениа в операторе DIM.Массивы с переменными размера-
ми,которые заявдяются как общие или локальные в процедуре,либо функ-
ции,всегда динамические.
СМ.также DIM
-------- ERASE
FRE
$STATIC
Пример 'настроить обработчик ошибок
------- ON ERROR GOTO ОшибокОбработчик
'отобразить память,имеющуюся в массивном пространстве
PRINT FRE(-1)
DIM БольшойМассив(10000) 'заявить дин.массив
БолшойМассив(6666)=66
PRINT FRE(-1)
PRINT БольшойМассив(6666)
END 'конец прогона
Ошибокобработчик:
PRINT "ошибка типа " ERR;
PRINT "произошла по адресу" ERADR
END
Метаоператор $EVENT
--------------------
Функция $EVEN управляет генерированием кода отслеживания событий.
--------
Синтаксис $EVEN {ON!OFF}
---------
Замечания Если ваша программа содержит какое-либо средство захвата событий
--------- определенного сорта (например,ON KEY,ON COM),то $EVENT по умолча-
нию ON (вкл.),что приводит к генерированию компилятором кода проверки события
между всеми операторами вашей прграммы.Если в программе не предусмотрено
отслеживание,то $EVENT находится в состоянии OFF (выкл.) и код события не
генерируется.
$EVENT дает вам возможность управлять тем,какие части программы
будут проходить без проверки событий.Если существует какая-то зона,где мак-
симальная скорость важнее ответа на случайное событие,то заключайте эту
часть программного кода в скобки,образуемые метаоператорами $EVENT OFF и
$EVENT ON.
Пример: 'пример события
ON TIMER(1) gosub ПотеряВремени
timer on
print "Медленный цикл"
x=таймер
for i=1 to 10000
timer on
print "Медленный цикл"
x=таймер
for i=1 to 10000
i=i+i-i
next i
y=таймер
print "Время цикла есть" y-x
$event off
print "быстрый цикл"
x=таймер
for i=1 to 10000
i=i+i-i
next i
y=таймер
print "время цикла естьЭ" y-x
end
ПотеряВремени:
- 76 -
for j=1 to 1000:j=j+j-j:next j:print
return
Метаоператоры $IF/$ELSE/$ENDIF
------------------------------
Функция $IF,$ELSE и $ENDIF определяют частм программы,подлежащие компилиро-
-------- ванию или от него уклоняющиеся (часто этот способ называют условным
компилированием).
Синтаксис $IF константа
--------- .
.операторы
.
[$else
.
.операторы]
.
$ENDIF
Замечания Константа-это именованная константа или постоянное значение.Если
--------- константа не нулевая (TRUE),то операторы между $IF и $ELSE
компилируются,а операторы между $ELSE и $ENDIF не компилируются.
Если Константа нулевая (FALSE),то операторы между $IF и $ELSE
игнорируются,а находящиеся между $ELSE и $ENDIF компилируюся.$ELSE устанав-
ливается опционально,но $ENDIF требуется всегда.Операторы условной компиля-
ции могут вкладываться до уровня глубиной 256.
Пример %ЦветнойЭкран=1 'установка именованной константы на ненулевое
'значение указывает работу на цветном экране
'установка нулевого значения указывает работу в монохромной системе
$if %ЦветнойЭкран
def seg=&HB800 'адрес памяти графического экрана
$else
def seg=&HB000 'адрес памяти монохромного экрана
for i%=0 to 4000 step 2
poke i%,asc("A") 'заполнить экран буквами "A"
next i%
'хранить все 4000 байтов видео-прогона
bsave "$if.dta",0,4000
end
Метаоператор $INCLUDE
---------------------
Функция $INCLUDE включает текстовый файл
--------
Синтаксис $INCLUDE файласпец.литерал
---------
Замечания Используйте $INCLUDE для компилирования текста другого файла
--------- вместе с текущим файлом.ФайлаСпец.литерал это строчная констан-
та,а представляемый его файл должен следовать соглашениям DOS об имени фай-
ла и в то же время представлять собой исходный файл Турбо Бейсика.Если для
включенного файла не специфицируется его имя,предполагается расширение .BAS.
Механизм $INCLUDE вызывает трактовку компилятором включаемого файла таким
опбразом,как если бы он физически существовал в первоначальном тексте в
данной точке.Это дает вам возможность разрывать вашу программу на управляе-
мые куски.Принцип рабочий файл/главный файл Турбо Бейсика относится к
$INCLUDE.В иллюстративных целях рассмотрим файлы CALCAREA.BAS и CONST.BAS:
Файл CALCAREA.BAS
print "программа вычисления площади круга"
- 77 -
print " если вы находите эту программу полезной"
print "пожалуйста вышлите 3500 долларов"
print "Франк Борланд"
print "Скатте Валлей,СА95066"
print "-------------------------------------------------"
$include "CONST.BAS"
input "ввести радиус",r
print "площадь ="pi*r*r
Файл CONST.BAS
'общецелевые константы
pi=ANT(1)*4
%истинно=-1
%ложно=0
%максX=319
%максY=199
Чтобы компилировать эту программу CALCAREA должен быть сделан "главным
файлом",посколько это файл с оператором $INCLUDE .Рабочий файл двигается
туда и обратно по отношению к любому другому,в зависимости от нужд редакти-
рования (т.е если имеет ошибки).Вне зависимости от текущего рабочего фай-
ла,компилирование всегда начинается с CALCAREA (главного файла).(Более де-
тально см.в разделе "Главное меню" гл.3)
Когда компилятор Турбо Бейсика встречает метаоператор $INCLUDE в строке 7
файла CALCAREA ,он загружает и начинает считывать из CONST.BAS .Когда этот
код исчерпывается,компилятор захватывает оставленное им место в первона-
чальной программе.
$INCLUDE может вкладываться на глубину 5;т.е включаемый файл может иметь
свои $INCLUDE.
Пример 'хранить следущее в файле "example.inc"
-------- sub СкажиАлло 'процедура вывод
print "Алло"
end sub
'далее следунт главная программа
$include "example.inc" 'включить исходный файл
call СкажиАлло
end
Метаоператор $INLINE
---------------------
Функция $INLINE заявляет внутристрочный машинный код во внутристрочной суб-
------- процедуре.
Синтаксис $INLINE [Список байтов][файлспец.литерал]
---------
Замечания $INLINE может быть только в пределах тела внутристрочной субпро-
--------- цедуры.
Список байтов - это последовательность целых значений в диапазоне
от 0 до 255,подлежащих кодированию непосредственно в обьектном коде в дан-
ной точке.
ФайлСпец.литерал-это имя файла,который содержит код,в который
вставляется внутристрочная.Этот код должен быть переопределяем,а также дол-
жен защищать и восстанавливать следующие регистры:стековый сегмент(SS),сте-
ковый указатель (SP),базовый указатель (BP),сегмент данных (DS).Внутрист-
рочный код может иметь ссылку на пораметры с использованием относительной
адресации BP.Более подробная информация содержится в приложении А "Числовые
соображения" и приложении С "Интерфейс языка ассемблера".
Ппример sub визг inline
'$inline вызывает выдачу визга звуковым излучателем
- 78 -
$inline &HBA,&H00,&H07,&HE4,&H61,&H24,
$inline &HFC,&H34,&H02,&HE6,&H61,&HB9,
$inline &H40,&H01,&HE@,&HFE,&H4A,&H74
$inline &H02,&HF2
end sub
call визг
end
Метаоператор $SEGMENT
---------------------
Функция $SEGMENT заявляет новый кодовый сегмент.
--------
Синтаксис $SEGMENT
---------
Замечания Используйте "безаргументные" метаоператоры $SEGMENT для разрыва
вашей исходной программы,когда компилятор сообщает,что превышено ограниче-
ние 64К для кодового сегмента:ERROR 409 segment overflow press<ESC> (ошибка
409 переполнение сегмента нажмите <ESC>)
Все,что находится после метаоператора $SEGMENT,будет помещено в новый ко-
довый сегмент.В результате любой оператор управления программой
(GOSUB,GOTO),передающее управление черезэту границу,будет реализовать меж-
сегментное перемещение,вызов или переход,для которого требуется несколько
больше времени и стекового пространства.Этот эффект можно минимизиро-
вать,размещая операторы $SEGMENT там,где в программе проходят естественные
линии деления ее на части; например между главными подпрограммами или глав-
ной программой и кодом возбуждения или завершения.
В программе на Турбо Бейсике может быть до 16 кодовых сегментов.Данные
состояниа компилирования ,распечатываемые после его завершения,будут пока-
зывать размер каждого сегмента,отделяемого косой чертой(/).
Примечание :Вы не можете использовать оператор $SEGMENT в структурирован-
ном блоке: for/next,do/loop,while/wend,if block.
Пример sub Процедура1
print "это пустая процедура"
end sub
$segment 'определить второй сегмент
sub Процедура2
print "это другая пустая процедура"
end sub
$segment 'определить третий сегмент
sub Процедура3
print "Это другая пустая процедура"
end sub
call Процедура1
call Процедура2
call Процедура3
end
Метаоператор $SOUND
-------------------
Функция $SOUND заявляет емкость фонового музукального буфера
--------
Синтаксис $SOUND размер буфера
---------
Замечания Размер буфера-это числовая константа,которая указывает нотную ем-
--------- кость фонового буфера оператора PLAY от 1 до 4096.Увеличение ем-
кости буфера до максимального числа нот,которые вы намерены играть в данной
программе,исключает необходимость отслеживания счетчика нот (и соответству-
ющнго ухудшения качества исполнения).
- 79 -
Для каждой ноты требуется 8 байтов памяти;по умолчанию емкость равна 32
нотам или 256 байтам.Значение по умолчанию можно менять и хранить,пользуясь
входом музыкального буфера меню опций.Значения по умолчанию преодолеваются
включенными в код метаоператорами.
Метаоператор $STACK
--------------------
Функция $ STACK заявляет размер стека периода прогона.
--------
Синтаксис $STACK отсчет
---------
Замечания Отсчет -числовая константа от 1024 до 32 К.$STACK определяет
--------- сколько памяти в период прогона будет выделено на стек.Стек
используется для адресов возврата во времени вызовов подпрограмм и в
структурированных операторах,а также для локальных переменнных многострочных
функций.По умолчанию (минимальный) размер состовляет 1024 (400Н) байтов.
Вы можете пожелать размещить больше стекового пространства,если ваша прог-
рамма ненормально структурированта,в ней используются большие локальные пе-
ременные или выполняется реккурсивность.Если вы подозреваете что программа
выбегает за стековое пространство,перекомпилируйте ее с опцией тестирования
стека из меню опций.Программа ,генерированная с этим отладочным переключа-
телем во включенном состоянии,перед входом в подпрограммы,процедуры и функ-
ции всегда проверяет наличное стековое пространство.Значения по умолчанию
продлеваются включенными в код метаоператорами.
Вы можете проверять для себя величину стекового пространства с
помощью функции FRE(-2).
СМ. также FRE
Пример 'дается стек 4096 байтов
$stack &H1000
print fre(-2) 'отображается величина наличного стекового прост-
'ранства
Метаоператор $STATIC
---------------------
Функция $STATIC заявляет ,что размещаемый по умолчанию массив должен быть
-------- статическим.
Синтаксис Метаоператор $STATIC не имеет аргументов и заявляет ,что массив
--------- будет статического типа
Пространство для статических массивов распределяется во время ком-
пилирования.Массивы постоянных размеров являются статическими всегда,за иск-
лючением случаев заявления массива как локального для процедуры или функции
,либо если один и тот же массив имеет более одного размера.
Статические массивы невозможно стирать .Оператором ERASE каждый элемент
массива только возбуждается в ноль или ноль-строку.
Следует заметить,что метаоператор $STATIC ,несмотря на косметическое подо-
бие,не имеет ничего общего с оператором STATIC,которое определяет специаль-
ный тип локальной переменной в процедурах и функциях.В режиме умолчания ком-
пилятора-$STATIC.
CМ. также
DIM
$DYNAMIC
/Ш print "быстрый цикл"
x=таймер
for i=1 to 10000
i=i+i-i
next i
y=таймер
print "время цикла естьЭ" y-x
end
ПотеряВремени:
- 76 -
for j=1 to 1000:j=j+j-j:next j:print
return
Метаоператоры $IF/$ELSE/$ENDIF
------------------------------
чная память ",fre(-1)
'теперь ее меньше
erase a
print "Наличная память",fre(-1)
'никакого отличия нет,поскольку А не перераспределяется,а только
'обнуляется
erase b
print "наличная память ",fre(-1)
'больше памяти,поскольку динамические массивы перераспределяются
end
Функция ABS
-----------
Функция ABS возвращает абсолютное значение
-------
Синтаксис Y=ABS(числовое выражение)
---------
Замечания ABS возвращает абсолютное значение числового выражения.Абсолютное
--------- значение X указывает его величину вне зависимости от знака.Напри-
мер,абсолютное значение -3 равно 3;абсолютное значение +3 есть 3 .
Пример 'ABS возвпащает текущее расстояние от исходной точки,беря абсол.
------- 'значение расстояния
'назначить местоположение
Местоположение=-6.5
'отобразить текущее местоположение
print "текущее местоположение ",Местоположение#
'отобразить тек.расстояние от исходной точки
print "расстояние от исх.точки ",abs(Расстояние#)(Местоположение#)
Функция ASC
-----------
Функция ASC возвращает код ASCII первой литеры строки.
-------
Синтаксис Y=ASC(строчное выражение)
---------
Замечания ASC возвращает код ASCII (от 0 до 255) первой литеры строчного вы-
--------- ражения.Чтобы преобразовать целое в литерную строку,используйте
функцию CHR$,которая при подаче ASCII-значения дает одно-литерную строку.
Ограничения Строчное выражение ,подаваемое в ASC не может быть нулевой(пус-
----------- той) строкой,иначе генерируется ошибка 5 (вызов незаконной функ-
ции).
см. также CHR$
Пример print "ASCII- значение А есть",asc("А")
Функция ATN
-----------
Функция ATN определяет тригонометрический арктангенс.
-------
- 81 -
Синтаксис Y=ATN(числовое выражение0
---------
Замечания ATN определяет арктангенс (инверсию тангенса) числового выраже-
--------- ния.ATN выдает результат двойной точности.
Результат,как и во всех операциях с углами в Турбо Бейсике,предс-
тавляется в радианах,а не в градусах.Радианы -это единици угловых измерений
т.е математически более удобна,чем градусы.Когда углы специфицируются в гра-
дусах в диапазоне от 0 до 360 ,их спецификация в радианах лежит в диапазоне
от 0 до 2п ,при 0 рад7 на полож. оси X и возрастанием против часовой стрел-
ки.Это дает положительную ось Y (90градусов) при п/2 радиан,отрицательную
ось X (180 градусов) при п радиан и отрицательную ось Y (270 градусов) при
3п/2 радиан. 90=п/2рад.
^
!
!
180=п рад !
------------!----------->0=0рад.
!
!
!
!
270=3п/2 рад.
Если вы более тяготеете к градусам,радианы можно преобразовать в градусы
посредством умножения значения в радианах на 57.2958.Например ,арктангенс
0.23456 есть
ATN (.23456) радианы
=0.230395 радианы
=(0.230395*57.2958)градусы
=12.2градусы
Преобразовывайте градусы в радианы посредством умножения на 0.0174533.Нап-
ример,
14 градусы
=(0.0174533*14) радианы
=0.24435 радианы
Вместо того,чтобы запоминать коэффициенты преобразования радианы/граду-
сы,вычисляйте их для себя запомнив их взаимосвязь:2п радиан равны полной ок-
ружности,т.е 360 градусам,так что 1 радиан есть 180/п градусов,и наоборот ,1
градус равен п/180 радиан.
Вам в качестве справки :п с 16-тизначной точностью есть 3.141592633589793
Это значение можно вычислить из выражения
pi#=4*atn(1)
Градус-радианные и радиан-градусные преобразования являются хорошим прило-
жением для однострочных функций.
см. также COS
SIN
TAN
Пример 'вычислить значение pi,используя atn
pi#=4*atn(10
print pi#
Оператор BEEP
-------------
Функция BEEP обеспечивает звучание излучателя звука.
--------
Синтаксис BEEP играет тон 800 гц через динамик в течении 0.25 сек.Опцио-
--------- нальый числовой аргумент вызывает отсчет BEEP-сигналов.BEEP имеет
то же действие,что и литера колокольчика ASCII (код7) при выводе на экран;
например,print CHR$(7).Более мелодичные тоны можно создавать с помощью опе-
раторов SOUND и PLAY.
- 82 -
см. также PLAY
SOUND
Пример BEEP 2 'привлеч внимание пользователя
Функция BIN$
------------
Функция BIN$ двоичнную строку как эквивалент числа
-------
Синтаксис s$=bin$(числовое выражение)
---------
Замечание Числовое выражение лежит в диапазоне от -32768 до 65535.Перед соз-
--------- данием строки любая дробная часть округляется.Если числовое
выражение отрицательно,число возвращается в форме двоичного дополнения.
см также HEX$
OCT$
Пример ' в этом примере отображаются десятичное и двоичное значение для чисел
'от -5 до 5
print using "двоичный эквивалент -##=&";i%,bin$(i%)
next i%
end
Оператор BLOAD
Функция BLOAD загружает в память файл создаваемый с помощью оператора BSAVE.
-------
Синтаксис BLOAD файласпец.[,адрес]
---------
Замечания Файласпец-это строчное выражение,специфицирующее файл для загруз-
--------- ки,которое должно удовлетворять стандартным соглашениям DOS об на-
именовании файлов.Адрес -опциональное числовое выражение от 0 до 65535,кото-
рое указывает в какое место текушего сегмента должен быть загружен файл.Если
адрес опускается ,BLOAD помещает файл по адресу из которого он был изначаль-
но взят на хранение с помощью оператора BSAVE.
Если адрес задается,он преодолевает хранимую с файлом адресную ,информа-
цию,генерированную оператором BSAVE.Поскольку не делается никакой проверки
адреса в BLOAD,вполне возможна небрежная загрузка файла в верхнюю часть DOS
и /или в вашу программу и разрушение системы.
Ограничения BLOAD не будет осуществлять непосредственную загрузку памяти
----------- EGA(улучшенного графического адаптера).
см также BSAVE
DEF SEG
Пример rem загрузить графический экран
def seg &HB800
bload "картинка",0
Оператор BSAVE
--------------
Функция BSAVE сохраняет некоторый диапазон данных на диске
--------
- 83 -
Синтаксис BSAVE файласпец,адрес,длина
---------
Замечания Файласпец-строчное выражение6специфицирующее файл,в который подле-
--------- жат записи данные.Файласпец должно следовать стандартным
соглашениям DOS об именовании файлов.Адрес-это числовое выражение в диапазо-
не от 0 до 65535,указывающее смещаемую часть адреса,с которого файласпец бу-
дет сохраняться (см оператор def seg).Длина есть число байтов для хранения
,от 0 до 65535.BSAVE обеспечивает хранение некоторого диапазона памяти на
диске (эффективно храниться цифровая выборка указанного диапазона во время
BSAVE).Файлы,создаваемые с помощью BSAVE,можно потом перегружать с помощью
команды BLOAD ;опционально файлы можно перегружать по другому адрксу,чем за-
нятый при BSAVE.BSAVE и BLOAD часто используются для хранения и загрузки эк-
ранных образов посредством непосредственного считывания и записи памяти дис-
плея.Дисплейный буфер Монохромного Дисплейного Адаптераимеет длину 4000 бай-
тов и начинается на смещении 0 сегмента &HB000.Дисплейный буфер для Цветного
Графического Адаптера состовляет 4000 байтов в текстовом режиме (SCREEN 0) и
16384 байта как в режимах графики средней и высокой разрешающей способнос-
ти;оба начинаются на смещение 0 в сегменте &HB500.
Ограничения Перед исполнением оператора BSAVE программист должен явно уста-
----------- новить сегмент,который должен будет храниться на диске,
используя оператор DEF SEG.
см также BLOAD
DEF SEG
Пример 'BSAVE заполняет экран буквами А и обеспечивает хранение на диске
for i%=1 to 2000
print "A"
next i%
'определить экран для BSAVE
def seg=&HB000
'хранить монохромный видео-экран
bsave "text.pic",0,4000
' удвоенное число литер поскольку имеются атрибуты
end
Оператор CALL
-------------
Функция CALL вызывает процедуру (подпрограмму0
-------
Синтаксис CALL процимя[(список параметров)]
---------
Замечания Процимя-это имя процедуры6определяемое где-то в прогрмме с помощью
--------- оператора SUB .Список параметров есть опциональный список разделя-
емых запятыми переменных,выражений и /или констант,передаваемых в Проци-
мя.Существует три типа SUB-процедур:STATIC,стандартные процедуры и
INLINE.Предыдущее обсуждение применимо ко всем типам;однако способ,которым
компилятор обрабатывает списки параметров ,зависит от типа SUB-процедуры.Ко-
личество и тип аргументов,подаваемых в процедурутребует согласованности со
списком параметров в определении Процимя;иначе возникаетошибка несогласован-
ности параметрав периода компиляции.Если SUB-процедура является процедурой
INLINE,числоаргументов переменно и никакая проверка набора параметров не вы-
полняется.Сама процедура SUB INLINE ответственна за то как узнать или опре-
делить количество и тип параметров в нее неподаваемых.(Более подробно о SUB
INLINE см в приложении С "Интерфейс языка ассемблера").Когда процедурные ар-
гументы подаются посредством ссылки (т.е являются переменными),они доступны
изменению вызвынной процедурой.Когда переменная заключена в скобки,она пода-
ется значением и исходное значение изменено быть не может.Следует заме-
тить,что выражения и константы всегда подаются значением.Аргументы массивов
- 84 -
специфицируются с использованием пустого набора скобок посде имени массива .
Целые массивы всегда подаются посредством ссылки.Например:
CALL СуммаМассив (а()) 'подать массив а в СуммаМассив
CALL СуммаМассив (а(3)) 'подать элемент 3 массива а в СуммаМассив
см также $INLINE
SUB
Пример DIM Массив (1) 'заявить массив из 2 элементов
SUB ТестПроцедура (i%,l&,s!,d#,e,a(1))
'эта процедура просто выводит значения каждого подаваемого в нее
' параметра
print i%;l&;s!;d#;e;a(0)
end sub
Целое%=1
ДлинноеЦелое&=2
ЕдиничнаяТочность!=4
Массив(0)=5
call ТестПроцедура (Целое%,ДлинноеЦелое&,ЕдиничнаяТочность!,Двой-
наяТочность#,целое%^2,Массив())
end
Оператор CALL ABSOLUTE
----------------------
Функция CALL ABSULUTE возбуждает подпрограмму языка ассемблера.
-------
Синтаксис CALL ABSOLUTE адрес(список параметров)
---------
Замечания Адрес-это числовой скаляр,содержащий смещение внешней подпрограм-
--------- мы,подлежащей возбуждению .Сегмент определяется самым последним
заявлением DEF SEG .Адрес должен находится в диапазоне от -32768 до
65535.Отрицательные значения будут преобразовываться компилятором в положи-
тельные. Формой списка параметров поддерживается совместимость с интерпрета-
тором Бейсика посредством подачи на стек коротких целых параметров.Только
эта форма допускает подачу целых.(См.приложение С "Интерфейс языка ассембле-
ра".Буфер регистров загружается на поцессорные регистры как раз перед CALL
ABSOLUTE или CALL INTRRUPT и отпрвляются обратно на хранение сразу же после
прогона.В любое данное время буфер содержит состояние процессора,в котором
он находился при компилировании самой последней внешней процедуры .
Буфер регистров доступен с помощью оператора и функции REG,в которых ис-
пользуется числовой аргумент для ссылки на соответствующий регистр,как пока-
зано ниже:
----------------------------------------------------------------------------
Аргумент регистра Регистр
----------------------------------------------------------------------------
0 Флаги
1 АХ
2 ВХ
3 СХ
4 DX
5 SI
6 DI
7 BP
8 DS
9 ES
----------------------------------------------------------------------------
REG,как оператор, загружает выбранный элемент буфера регистров ука-
занным целым значением:
REG 2,&H1000 'загрузить 1000H на ВХ буфера регистров
REG ,как функция,возвращает значение выбранного элемента буфера
регистров:
PRINT REG (2) 'вывести значения из ВХ буфера регистров
Программист ответственнен за защиту регистров сегмента данных
- 85 -
(DS),сегмента стека (SS),указателя базы (BP),указателя стека (SP)
см также CALL INTERRUPT
DEF SEG
REG
Пример defint a-z
dim a(100)
dim ЗаполненияПодпрограмма (10)
ЗаполненияПодпрограмма (0)=&HF2FC
ЗаполненияПодпрограмма (1)=&HCBAA
reg 1,-1
reg 3,101*2
reg 9,varseg(a(0))
reg 6,varptr(a(0))
def seg=varseg(ЗаполненияПодпрограмма (0))
print a(1)
while not instat:wend
ЗаполнитьАдрес=varptr(ЗаполненияПодпрограмма(0))
call absolute ЗаполнитьАдрес '(reg)
print a(1)
end
Оператор CALL INTERRUPT
-----------------------
Функция CALL INTERRUPT вызывает системное прерывание
--------
Синтаксис CALL INTERRUPT n
---------
Замечания Целым выражением n представляется прерывание для вызова в диапазо-
--------- не от 0 до 255.Как раз перед получением управления обработчиком
прерываний регистры процессора загружаются значениями из буфера машинных ре-
гистров.При возврате ,осуществляемом обработчиком прерываний,буфер принимант
значения из процессорных регистров.В любое данное время буфер содержит сос-
тояние регистров процессора в том виде,в котором находились эти регистры при
компилировании самого последнего внешнего вызова или оператора REG.
В справочном руководстве по технике DOS содержится полная информация о
многих функциях,доступных через механизм CALL INTERRUPT.Программист ответст-
веннен за защиту регистров стекового сегмента (SS) и стекового указателя (SP).
Ограничения Перед исполнением оператора CALL INTERRUPT подходящие регистры
центрального процессора должны быть возбуждены через оператор REG.После ис-
полнения оператора CALL INTERRUPT к значениям процессорных регистров должен
быть обеспечен доступ через функцию REG.
см также CALL ABSOLUTE
REG
Пример 'call interrupt исполняет обслуживание DOS прерываний
$include "regnames.inc"
reg %ax &H0200
'ah=02 шестнадцатиричная функция станд. DOS-вывода литерала
reg %ox,reg(%ox)and&HFF02
'DL=02 шестнадцатиричное DH остается тем же
'DL:=литера для вывода
call interrupt &H21 'вызов прерывания 21
Функция CDBL
------------
Функция CDBL преобразует число в формат двойной точности
-------
Синтаксис y=CDBL(числовое выражение)
---------
- 86 -
Замечания CDBL преобразует числовыю переменную или числовое выражение в фор-
мат двойной точности.Используйте CDBL для исключения случаев переполнения
целых в выражениях,где комбинируются целые операнды и операнды с плавающей
точкой,например:y#=(z%+x%)/a#
Это выражение будет приводить к переполнению ,если (z%+x%) больше
32767.Чтобы избежать этого,используйте CDBL для принудительного преобразова-
ния одной из целых переменных в форму двойной точности.Это вызовет оценку
всего выражения в двойной точности.
y=(CDBL(z%)+X%)/a#
Ограничения Диапазон выражения,подаваемого в CDBL должен находится в преде-
----------- лах законного диапазона для числа двойной точности.
см также CINT
CLNG
CSNG
Пример 'CDBL полезен для предотвращения ошибок периодо прогона
x%=2000
y%=2000
z#=cdbl(x%)*y%
print x%,y%,z#
end
Функция CEIL
------------
Функция CEIL возвращает наименьшее целое,которое больше или равно аргументу
--------
Синтаксис y=CEIL(числовое выражение)
---------
Замечания Функция CEIL преобразует числовыю переменную или выражение в це-
--------- лое,возвращия наименьшее целое,которое больше или равно аргументу .
Различия Этой функции в Интерпретаторном Бейсике нет.
---------
см также CINT
FIX
INT
Пример for i!=-2.5 to 2.5 step 0.5
print using "CEIL-значение ### есть ###":i!,ceil(i!)
next i!
end
Оператор CHAIN
--------------
Функция CHAIN возбуждает модуль цепочек Турбо Бейсика (создаваемой как .TBC
------- или .EXE-файл)
Синтаксис CHAIN файласпец
---------
Замечания Файласпец-это строчное выражение ,которое следует стандартным
--------- DOS-соглашениям об наименовании файлов,и представляет модуль цепо-
чек Турбо Бейсика (расширение .TBC).Если расширение опускается,предполагается
.TBC.Поэтому ,если вы хотите специфицировать .EXE-файл,к имени файла необхо-
димо добавить .EXE.Переменные перечисляемые как COMMON (общие),подаются и
текущей программой,и программой назначения в программу назначения.
В фазе тестирования вызывающая программа должна комполороваться в .EXE
- 87 -
-файл, так как вы не можете реализовать цепочку из самого Турбо Бейсика.Вызы-
ваемая программа должна компилироваться на диск как модуль цепочек (.EXE или
.TBC-файл) .Если аргументы в операторе COMMON в вызывающей и вызываемой
программах не совподают (например,переменные с плавающей точкой в одном мес-
те и челые в другом),возникает ошибка периода прогона.Турбо-Бейсик не под-
держивает опции CHAIN Интерпретаторного Бейсика,ориентированные на нумерацию
строк,включая DELETE (стереть),MERGE (соединить) и CHAIN (цепочка)номерстроки.
Поскольку вы не можете специфицировать номер строки в модуле цепочек назна-
чения,исполнение начинаеися всегда от начала.При трансляции обработанной
CHAIN системы программ Интерпретаторного Бейсика на Турбо-Бейсик,вы можете
обнаружить ,что расширенное использование памяти Турбо-Бейсиком позволяет
консолидировать отдельные модули в единую программу,исключая необходимость
реализации цепочек.
Ограничения Образование цепочек возможно ,только когда программа использует-
---------- ся из DOS;т.е. из .EXE-файла.MERGE,DELETE,ALL и CHAIN по номеру
строки не поддерживаются.
Различия В Турбо-Бейсике образование цепочек делается из одной компилирующей
-------- программы в другую,которая уже компилирована в .TBC или .EXE-файл.
см также COMMON
Пример 'рассмотрим PROG1 ,которая образует цепочку к PROG2:
prog1.bas
'заявить переменные ,подлежащие подаче в организуемую цепочкой
'программу:скалярные переменные единичной точности a и b и целый
'массив с%
dim c%(3000)
a=65:b=13:c%(2000)=12
common a,b,c%(1)
'специфицировать #размеров в массиве
chain "prog2"
'заявить переменные ,подлежащие приему из возбуждающей программы
'они должны быть в том же порядке, иметь тот же тип6но не обяза-
'тельно то же имя
common x,y,z%(2000)
когда prog1.exe возбуждается из DOS,она будет автоматически вво-
дить модуль prog2.tbc и исполнять его,распечатывая значения,назна-
ченные в prog1.Когда prog2 окончивается6возврат осуществляется в
DOS ,а не в prog1.
Оператор CHDIR
--------------
Функция CHDIR изменяет текущий справочник (DOS-команда CHDIR или CD)
--------
Синтаксис CHDIR проход
---------
Замечания Проход-это строчное выражение,соответствующее DOS -соглашениям о
--------- проходах (описанных в разделе "Файлы" глава 4)
Если проход не указывает какой-то законный справочник,возникает
ошибка 76 периода прогона,"Проход не найден".Оператор CHDIR изменяет текущий
(задействованный по умолчанию справочник).Это аналогично действию команды
CHDIR из DOS,за исключением того,что невозможна аббревиатура,подобная
CD.Прогоном программы ,которая меняет справочник,из Турбо-Бейсика также ме-
няет задействованный справочник Турбо-Бейсика.
Пример INPUT "Новый справочник :",Проход$
CHDIR Проход$
end
- 88 -
Функция CHR$
------------
Функция CHR$ преобразует ASCII-код в однолитерную строку
-------
Синтаксис s$=CHR$(целое выражение)
---------
Замечания CHR$ возвращает однолитерную строку,единственная литера которой
--------- имеет целое выражение в ASCII-коде со значением от 0 до 255.CHR$
дополняет функцию ASC,которая возвращает ASCII -код первой литеры строки.
CHR$ удобна для создания литер,которые трудно ввести с клавиатуры,таких как
графические литеры экранного вывода и упрвляющие последовательности для
вывода на печать.Значение целого выражения ,подаваемое в CHR$ ,должно лежать
в диапазоне от 0 до 255. Использование аргумента вне этого диапазона вызывает
ошибку 5 периода прогона,вызов незаконной функции.
см также ASC
Пример 'CHR$ отображает на экране литерный набор ASCII
for i%=0 to 255
print using "i":chr$(i%):
'отобразить ascii литеру ,представляемую i%
next i%
end
Функция CINT
------------
Функция CINT преобразует свой аргумент в целое
-------
Синтаксис y=cint(числовое выражение)
---------
Замечания Функция CINT преобразует числовую переменную или выражение в целое
--------- округляя дробную часть числового выражения.Если числовое выражение
находится вне диапазона от -32768 до 32767 ,то возникает ошибка переполнения
(ошибка 6 периода прогона).Это преобразование выполняется косвенным пу-
тем,посредством назначения целой переменной или вызовом процедуры 6либо фун-
кции,которая принимает целый аргумент.
Различия В отличии от Интерпретаторного Бейсика,Турбо-Буйсик не всегда окру-
-------- еляет дробную часть числа в сторону увеличения.Если дробная часть
числа равна 0.5 округление осуществляется в сторону четного числа.
см также CDBL
CEIL
CLNG
CSNG
Пример for i!=0.0 to 5.0 step 0.2
print using "cint числа #.#=#":i!,cint(i!)
next i!
end
Оператор CIRCLE
---------------
Функция CIRCLE обеспечивает вычерчивание окружности или части окружности.
--------
- 89 -
Синтаксис CIRCLE (x,y),радиус[,цвет[,начало,конец[,вид]]]
---------
Замечания (x,y)-координаты центра окружности,которые могут специфицироваться
--------- в абсолютной или относительной форме(с использованием STEP.)
(Более детальную информацию об абсолбтных и относителбных коорди-
натах см в разделе о графике Главы 3 ).
Радиус -это числовое выражение ,задающий размер окружности.
Цвет -целое выражение,определяющее цвет окружности.Приемлемыми
значениями являются 0-3 в графике средней разрешающей способности(по умолча-
нию -3) и 0-1 в графике с высокой разрешающей способностью (по умолчанию
-1).Цветом по умолчанию является наивысший возможный цвет того режима,в ко-
тором вы находитесь.Использование цветового аргумента вне этих диапазонов
дает ошибку 5 периода прогона,вызов незаконной функции.(Более подробную ин-
формацию о выборе цветов см в описании оператора COLOR).
Начало и конкц являются опциональными числовыми параметрами,опре-
деляющими начальную и концевую точки подлежащей вычерчиванию дуги6которые
специфицируются в радианах (см описание радианов в описании оператора
ATN).Используйте их,когда желаете вычертить только часть окружности.Если на-
чало и конец опускаются ,вычерчивается целая окружность .Например:
SCREEN 1:pi=4*atn(1)
CIRCLE (160,100),50,3,0,pi
обеспечивает вычерчивание белого полукруга от 0 радиан до п радиан.
Отрицательные значения начало и конец вызывают вычерчивание тор-
то-образных ;т.е. кромки дуги автоматически соединяются с центральной точ-
кой.Например :
SCREEN 1:pi=4*atn(1)
CIRCLE (160,100)50,,-pi/4,-pi/2
обеспечивает вычерчивание 45-градусного куска торта от п/4 радиан
до п/2 рад., который показан на рис. ниже7Чтобы начать клин на положительной
X-оси,используется отрицательное число,несколько меньше нуля6а не просто -0
(например ..0001) .
Вид -это числовое выражение,управляюшее тем,насколько круглой или
овальной будет окружность.По умолчанию в средней разрешающей способности его
значение равно 5/6 (0.833333),а в зависимости от вышей конкретной комбинации
дисплецной платы/видео-монитора,вам может потребоваться повозиться с этими
значениями (либо отрегулировать ваш монитор) для получения круглых окружнос-
тей.LPR после вычерчмвания окружности находится в ее центре.
Пример 'Эта программа демонстрирует возможности CIRCLE
'изменение местоположения радиуса,цвета,видового отношения.С по-
'мощью CIRCLE можно также вычерчивать дуги и клинья,полезные для
'игр "пак-ман"
pi#=4*atn(1)
screen 1
for радиус%=1 to 20 'увеличивать размер окружности
колер%=радиус%mod4 'рассчитать цвет изображения
circle (250,150),радиус%,колер% 'центр в 250,150
next радиус%
circle (220,60),50,1,-(pi#*5/4),-pi#*3/4) 'тело пак-ман и глаз
circle step (-5,-25),5,1
радиус%=50
'эллипс может давать иллюзию сферы ...
for вид=0 to 2.0 step 0.09
circle (90,100),радиус%,,,,вид
next вид
- 90 -
end
Оператор CLEAR
--------------
Функция CLEAR очищает переменную память
-------
Синтаксис CLEAR
---------
Замечания CLEAR -это команда без параметров,которая устанавливает числовые
--------- переменные в ноль,а строчные переменные в нуль-строку.CLEAR
выключает любое отслеживание событий ,которое находтся во включенном
состоянии (такие как музыка, которая может быть задействована оператором PLAY)
и повторно возбуждает массивную и строчную память.
Примечание: Оператор CLEAR внутри цикла будет очищать счетчикбвы-
зывая бесконечный цикл.
Для выборочного освобождения массивов в памяти пользуйтесь оператором ERASE.
Ограничения Турбо-Юейсик не поддерживает динамическую установку стека и сег-
----------- ментов данных;в этом операторе нет поэтому соответствующих
параметров.
Различия Различия между операторами CLEAR Интерпретаторного Бейсика и Тур-
-------- бо-Бейсика происходит,главным образом ,из различий между компилято-
рами и интерпретаторами.Интерпретаторный Бейсик дает вам возможность динами-
чески устанавливать пространство стека и данных там ,где пространство стека
и данных Турбо-Бейсика фиксируется во время компилирования.
см также ERASE
$STACK
Пример 'эта программа демонстрирует что может делать CLEAR
dim массив$(1) 'заявить массив строк
play "mb l1 efgabcdef" 'играть музыку в фоне
on pen gosub ПераДержатель 'настроить отслеживание светового пера
on strig(0) gosub КнопкиОдержатель 'настроить отслеживатель ручки
' управления
'возбудить строчные данные
Массив$(0)="это строка в Массиве$(0)"
Массив$(1)="это строка в Массиве$(1)"
'отобразить строчные данные
print using "Массивный элемент 1:&":Mассив;(0)
print using "Массивный элемент 2&":Массив$(1)
input "нажмите <enter>(ввод)для исполнения оператора CLEAR":Пусто$
clear 'делается очистка
' существующие строчные данные более не отображаются
print using "Массивный элемент 1:&":Массив$(0)
print using "Массивный элемент 2:&":Массив$(1)
print "строчные переменные теперь пусты"
end
ПераДержатель:'определить пустую метку для ловушки светового пера
return
КнопкиЩдержатель :'определить пустую метку для ручки управления
return
Функция CLNG
------------
- 91 -
Функция CLNG обеспечивает преобразование в длинное целое
--------
Синтаксис y=CLNG(числовое выражение)
---------
Замечания CLNG преобразует числовую переменную или выражение в длинное целое
--------- посредством округления дробной части ее аргумента.Если числовое вы-
ражение находится вне диапазона от -2в степени31 до (2в степени31)-1 (приб-
лизительно от -2 до 2 боллионов),возникает ошибка 6 периода прогона,Перепол-
нение.
Ограничения Числовое выражение ,подаваемое в фуекцию CLNG должно находится в
----------- законном диапазоне длинных целых.
Различия Этой функции нет в больщинстве Интерпретаторных Бейсиков,поскольку о
-------- ни не поддерживают длинные целые.
см также CDBL
CINT
CSNG
FIX
INT
Пример print clng(2.0E9),clng(33.4),clng(-121.9),clng(100251.6)
------ end
Функция CLOSE
-------------
Функция CLOSE закрывает файл или устройство
--------
Синтаксис CLOSE[[#]файлнам[,[#]файлнам]...]
---------
Замечания CLOSE оканчивает взаимосвязь номера файла и файла,установленного в
-------- операторе OPEN (открыть),и закнчивает ввод/вывод в этот файл.Буфер
файла наполняется и ,если файлнам представляет файл (а не устройство),коман-
дой DOS CLOSE выполняется на нем для обновления справочника.Хороша привычка
периодически закрывать файлы ,которыя записываются программой.Это дает уве-
ренность в том ,что записывается вся информация,а вход этого файла в спра-
вочнике операционной системы правильно обновляется в случае последующего
сбоя питания или какого-то другого затруднения.CLOSE без спецификации номера
файла закрывает все открытые устройства и файлы (то же самое делают
RESET,END,STOP и RUN).
см также END
OPEN
STOP
Пример 'открыть файл назначенный печатающему устройству
open "lpt1:" as#1
print#1,"это тест"
close#1
open "закрыть Ф.ОДН" as#1
open "закрыть Ф.ДВА" as#2
print#1 "это тест"
print#2 "это тест"
close
end
- 92 -
Оператор CLS
------------
Функция CLS очищает экран
--------
Синтаксис В текстовом режиме CLS очишает экран до цвета фона и обеспечивает
--------- позиционирование курсора в исходном положении в левом верхнем углу
(ряд 1,колонка 1).CLS в графическом режиме очищает экран до фонового цве-
та.LPR оказывается в центре экрана,либо (160,100),либо (320,100),в зависи-
мости от того ,является текущий режим средней или высокой разрешающей спо-
собности,соответственно.
Если уже был исполнен оператор VIEW ,CLS очищает только обзорно -приемное
окно.Чтобы стереть весь экран,сначала воспользуйтесь VIEW без аргументов для
выключения обзорного окна,а затем CLS-для очистки экрана.
см также COLOR
SCREEN
VIEW
Пример 'cls очищает экран до фонового цвета
print "Это тест оператора CLS"
input "Нажать <enter> для очистки экрана...",Пусто$
color 10,1
cls
end
Оператор COLOR (графический режим)
----------------------------------
Функция COLOR устанавливает цвета для графических операций
--------
Синтаксис Для SCREEN 1:COLOR[задний фон][,(палитра)]
--------- Для SCREEN 7,8,9,10:COLOR[передний фон][,[задний фон]]
Замечания Задний фон -это целое выражение от 0 до 63,специфицирующее цвет
--------- фона. Палитра-это целое выражение от 0 до 1,обеспечивающее выбор
двухцветной палитры.Передний фон целое выражение от 1 до 15.Аргументы этой
команды определяют фоновый цвет экрана и палитру из четырех цветов ,которые
будут использоваться в последующих чертежных операторах.После того ,как вы
уже определили палитру и цвет фона с помощью оператора COLOR,цвет отдельных
обьектов попадает под управление различных команд графики (CIRCLE,LINE и т.д.)
В режиме высокой разрешающей способности на Цветном Графическом Адаптере
единственными возможными цветами являются черный и белый.Следовательно опе-
ратор COLOR не имеет значения в этом режиме и попытка его использования при-
водит к ошибке 5 периода прогона ,Вызов незаконной функции.
SCREEN 1
Фон 0-255:фактически используемый цвет фона есть фон MOD16.Следовательно
фон 1 и 16 дают один и тот же результат.
Палитра 0-255:выбирается заранее определенная палитра ,как показано на ниже
-----------------------------------------------
цвет палитра 0 палитра 1
-----------------------------------------------
1 зеленый цинковый
2 красный анилиновый
3 коричневый белый
-----------------------------------------------
Четными числами обеспечивается выбор палитры 0,а нечетными -палитры 1 по
умолчанию.Палитра 0 дает вышей программе возможность создавать обьекты в зе-
леном ,красном6коричневом цветах.Палитроц 2 предлагаются цвета цинковый,ани-
линовый и белый.
SCREEN 7 и 8
- 93 -
Только EGA(усовершенствованный графический адаптер):цвета зависят от теку-
щей палитры.Передний фон 1-15:выбираемый цвет используется как для записи
литер ,так и для чертежной графики.Задний фон 0-15:выбирает цвет фона.
SCREEN 9
Передний фон 1-15:выбранный цвет используется для записи литер и для чер-
тежной графики.Если ваш EGA имеет память 64К,можно использовать тоько значе-
ния из диапазона 103.Задний фон 0-63:выбирается фоновый цвет.
SCREEN 10
Передний фон 1-3:выбранный цвет используется и для записи литер и для чер-
тежной графика;1=черный,2=мерцание,3=высокая интенсивность.Цвет переднего
фона 0 приводит к ошибке Вызов назаконной функции.
Для изменения атрибутов умолчания используйте оператор PALETTE:
Задний фон 0-8:выбранный цвет используется в качестве фона.
Примечание: Значение цвета 0 для любой палитры есть цвет фона,специфицируе-
мого в этом операторе,а цвет переднего фона по умолчанию определяется макси-
мальным атрибутом.
Ограничения В экране режима 2 оператор COLOR вызвращает ошибку 5 периода
----------- прогона,Вызов незаконной функции.
Пример 'эта программа демонстрирует оператор COLOR в графическом режиме
'переключить на граф.режим средней разрешающей способности
'установить палитру 0
screen 1
color .0
for радиус%=1 to 20 'увеличить размер окружности
колер%=радиус%MOD4 'расчет цвета изображения
circle (160,100),радиус%,колер% 'отобразить окружность
next радиус%
delay 2
color .1 'изменить палитру
delay 2
'установить палитру и цвет фона и очистить экран
color 6,0:cls
'вычертить красную окружность в серкдине экрана
circle (160,100),50,2
delay 2
end
Оператор COLOR (текстовый режим)
--------------------------------
Функция COLOR устанавливает цвет текста
-------
Синтаксис COLOR[передний фон][,[задний фон][,бордюр]]
---------
Замечания передний фон -это целое выражение от 0 до 31,специфицирующее цвет
--------- литер.Задний фон - это целое выражение от 0 до 7,специфицирующее
цвет фона.Бордюр-это целое выражение от 0 до 15,которое определяет цвет бор-
дюра.Если какой-то из этих параметров находится вне указанного диапазона ,то
возникает ошибка 5 периода прогона,вызов незаконной функции,Для стандартных
видео-плат Цвета/Графики в список выбора вашего фона входят
0 черный 8 серый
1 голубой 9 светло-голубой
2 зеленый 10 светло-зеленый
3 цинковый 11 светло-цинковый
4 красный 12 светло-красный
5 анилиновый 13 светло-анилиновый
6 коричневый 14 желтый
7 белый 15 белый высокой интенсивности
Литеры могут делаться мерцающими посредством установки переднего
фона в желаемый цвет плюс 16.Например ,установка переднего фона 22 (6+16)
- 94 -
дает мерцающие коричневые литеры.
Адаптеры монохромного изображения не могут отображать цвет,поэтому значения
переднего фона интерпретируются следующим образом:
0 черный
1 подчеркивание
2-7 белый
8 черный
9 подчеркивание высокой интенсивности
10-15 высокая интенсивность
16 черный
17 подчеркивание черным
18-23 мерцание
24 черный
25 высокая интенсивность,подчеркивание,мерцание
26-31 высокая интенсивность,мерцание
Значения заданного фона от 0 до 6 дают черный фон.Значения 7 соответствует
белому фону.
Примечание:На любом Адаптере литеры становятся невидимыми,когда передний
фон равен заднему фону.
Улучшенный графический Адаптер может отображать 16 цветов из палитры,вклю-
чающей в себя 64 цвета.
Ограничения параметр бордюра не оказывает влияния на EGA с улучшенным мони-
------------ тором.
Пример 'Эта программа демонстрирует оператор COLOR
'в текстовом и графическом режимах
'отобразить таблицу атрибутов
for задний%=0 to 7
for передний%=0 to 15
color передний%,задний%
print using "###":задний%*16+передний%
next передний%
next задний%
for задний%=0 to 7 'отобразить таблицу всех атрибутов
for передний%=16 to 31 'с мерцанием
color передний%,задний%
print using "###":задний%*16+передний%-16
next передний%
next задний%
end
Оператор COM(n)
---------------
Функция COM(n) управляет отслеживанием событий на последовательных входных
------- устройствах .
Синтаксис COM(n){on!off!stop}
---------
Замечания n-число коммуникационных адаптеров,подлежащих отслеживанию (1 или 2)
--------- Оператор COM(n) ON дает возможность отслеживания подпрограм-
мой,специфицированной в предыдущем операторе ON COM(n).
После COM(n) ON Турбо- Бейсик осуществляет проверку между исполнением каж-
дого оператора с целью просмотра поступления каких-либо литер на специфици-
риванное входное устройство.Если обнаруживается,что такое событие уже прои-
зошло,вызывается подпрограмма специфицированная в операторе ON COM(n).
Если COM(n) в режиме OFF,активность на последовательном адаптере n игнори-
руется.Отслеживание коммуникаций прекращается после оператора COM(n)
STOP;однако любая активность запоминается,так что когда исполняется оператор
- 95 -
COM(n) ON ,происходит немедленный захват поступившего.Для увеличения или
уменьшения размера COM буфера используйте метаоператор $COM.
см также ON COM(n)
Пример 'Демонстрируется оператор COM(n).Эта программа не будет ничего отобра
'жать ,если ваш адаптер COM1 не получает ввода
'Настроить подпрограмму для обработки COM-ввода
on com(1) gosub ПолучитьКомВвод
'разместить массив 5К для хранения ввода
dim КомПортВвод (5*1024)
'разместить указатель на следующем имеющемся буферном пространстве
ЗаголовокПрт%=0
'и следующий для печати
КонецПрт%=0
'включить обработку COM-ввода
com(1) on
'настроить буфер ввода 1К
$com1 1024
'открыть файловую переменную,как com1
open
open "com1" as#1
print 'нажать любую клавишу для прекращения программы"
'пока клавиша не нажата
while not instat
'если буфер не пуст
if КонецПрт%<>ЗаголовокПрт% then
'отобразить ввод
print "Ком-порт ввод:";КомПортВвод(КонецПрт%)
'шаг к следущему месту в буфере
КонецПрт%=КонецПрт%+1
end if
locate 2.1
print time$
wend
end
'обработать ком-порт прерывание
ПолучитьКомВвод:
'читать ввод из Ком-Порт буфера
input#1.КомПортВвод(ЗаголовокПрт%)
'указать следущее буферное пространство
ЗаголовокПрт%=ЗаголовокПрт%+1
return
КонецВвода:'окончить ком-порт ввод
print "Достигнут конец ввода ..."
end
Функция COMMAND$
----------------
Функция COMMAND$ возвращает командную строку ,используемую для запуска програ
------- ммы из DOS
Синтаксис s$=COMMAND$
---------
Замечания COMMAND$ возвращает все,что было набрано в DOS-подсказке,в прцессе
-------- возбуждения программы ,за исключением имени самой программы (неко-
торые руководства ссылаются на этот текст,называя его "трейледом").Исполь-
зуйте COMMAND$ для накопления аргументов периода прогона,таких как имена
файлов и опции программы.Рассмотрим ,например,DOS-команду:
FASTSORT cust.dta cust.new
где FASTSORT (быстрая сортировка)есть созданная Турбо-Бейсиком .EXE прог-
рамма.Когда FASTSORT получает управление,COMMAND$ будет удерживать все,что
было набрано в DOS подсказке после имени самой программы,т.е. в данном слу-
- 96 -
чае строку "cust.dta cust.new".Что делать с этой строкой (возможна разбивка
COMMAND$ на файлаимя1 и файлаимя2 и сортировка содержимого файлаимя1 в новый
файл файлаимя2) остается для решения в соответствии с определением FASTSORT.
Для тестирования программы ,в которой используется COMMAND$ ,в пределах
Турбо-Бейсика, применяется опция строки параметров из меню опций для установ-
ки возвращаемой COMMAND$ строки.
Ограничения Максимальная длина DOS-командной строки- 127 литер
-----------
Пример 'Эта программа демонстрирует функцию COMMAND$
print "Параметром командной строки ,подаваемой в эту программу яв-
'ляются
print command$
Компилируйте эту программу в память и прогоняйте дважды,каждый раз
меняя ввод параметров в меню опций.
Оператор COMMON
---------------
Функция COMMON заявляет одну или более переменных,подлежащих подаче в соедине
------- ную цепочкой программу.
Синтаксис COMMON переменная[,переменная]...
---------
Замечания Переменная-это массивная или скалярная переменная,которая должна
--------- быть сделана доступной следующей соединяемой цепочкой программе.
Массивы специфицируйте посредством включения числа размеров в скобках после
имени переменной.Операторы COMMON могут подаваться в любом месте программы и
их может быть более одного но данная переменная может появляться только один
раз.Совпадающие операторы COMMON должны появляться в программе ,к которой
привязывается цепочка.Имена переменных ,используемых в операторе COMMON не
имеют значения ,но их количество и тип важны.Если переменные,заявленные как
общие в возбуждающей программе не совпадают по типу и количеству с перемен-
ными,заявленными как общие в принимающей программе ,то генерируется ошибка
рериода прогона.
Различия Турбо-Бейсик не поддерживает параметр CHAIN ALL ,обеспечиваемый Ин-
-------- терпретаторным Бейсиком.Каждую переменную ,общий доступ к которой
должны иметь связываемые в цепочку программы,вы должны заявлять
непосредственно.При специфицировании в Турбо-Бейсике в качестве общей пере-
менной массива ,необходимо специфицировать число измерений этого массива.В
Интерпретаторном Бейсике совпадающие COMMON не требуется,поскольку COMMON в
нем необходимы только из CHAIN ,а внутрь CHAIN в них нет необходимости.Сдру-
гой стороны Турбо-Бейсик требует ,чтобы переменные в каждом операторе COMMON
были правильно упорядочены.Другими словами,имена переменных в главной прог-
рамме и программе-цепочкемогут отличаться ,но типы переменных должны совпа-
дать.Правильным является следущее употребление COMMON :
'Главная программа
COMMON i%,Массив(1),j#
'Цепная программа
COMMON Цел%,ДействМасс(11),Двтчн#
Ограничения Турбо-Бейсик не поддерживает преодолеваемое CHAIN ALL COMMON Ин-
----------- терпретаторного Бейсика.
Пример 'Эта программа демонстрирует оператор COMMON
------ 'Чтобы исполнить эти программы выполняйте следущее
'(1) компилировать первую программу в .EXE-файл
'(2)компилировать вторую программу в .TBC-файл
'(3) при DOS подсказке исполнить первую программу
'Программа хозяин.Компилировать эту программу в .EXE-файл
dim СтарыйМассив$(1) 'заявить двустрочный массив
- 97 -
СтарыйМассив$(0)="Это первая строка массива"
СтарыйМассив$(1)="Это вторая строка массива"
СтароеЦелое%=12345
СтароеДлинноеЦелое&=123450000
СароеЕдиничнойТочности!=12345.12345
СтароеДвойнойТочности#=1.0E+300
'специфицировать переменные ,которые являются общими для программ
'хозяин и слуга
common СтарыйМассив(),СтароеЦелое%,СтароеДлинноеЦелое&,СтароеДвой-
нойТочности#
chain "Слуга.TBC" 'цепочка для программы слуга
end
'Программа Слуга.Компилировать эту цепочку в .TBC-файл
common НовыйМассив(),НовоеЦелое%,НовоеДлинноеЦелое&,НовоеЕдинич-
нойТочности!,НовоеДвойнойТочности#
print НовыйМассив(0)
print НовыйМассив(1)
print НовоеЦелое%,НовоеДлинноеЦелое&,НовоеЕдиничнойТочности!,Ново-
еДвойнойТочности#
Функция COS
-----------
Функция COS возвращает тригонометрический косинус
-------
Синтаксис y=COS(числовое выражение)
---------
Замечание Числовое выражение-это угол,специфицируемый в радианах.Чтобы преоб-
--------- разовать радианы в градусы ,умножайте на 180/n.Для преобразования
градусов в радианы умножайте на n/180(См.обсуждение радианов в
описании функции ATN).COS возврвщает значение двойной точности.
См.также ATN
SIN
TAN
Пример pi=atn(1)*4
for i%=0 to 360 step 45
print using "Косинус ### градусов=##.##":i%,cos(pi#/180*i%)
next i%
end
Функция CSNG
------------
Функция CSNG преобразует числовое выражение в его эквивалент единичной точ-
------- ности .
Синтаксис y=CSNG(числовое выражение)
---------
Замечания CSNG преобразует числовое выражение или переменную в форму с плава-
--------- ющей точкой единичной точности.CSNG обычно используется для предот-
вращения промежуточного переполнения при обработке целых операндов.
См.также CDBL
CINT
CLNG
Пример print csng (&HFFF),csng(12345.1234),csng(&HF000)
- 98 -
Функция CSRLIN
--------------
Функция CSRLIN возвращает текущее положение курсора по вертикали (номер ряда)
-------
Синтаксис y=csrlin
---------
Замечания CSRLIN возвращает целое от 1 до 25,представляющее текущее положение
--------- по вертикали (номер ряда) курсора.Для считывания курсорного положе-
ния по горизонтали (номер колонки) используйте функцию POS.
Оператором LOCATE курсор перемещается в специфицируемые строку и колонку
См.также LOCATE
POS
Пример Кол=pos 'сохранить ряд курсора
Ряд=csrlin 'сохранить колонку курсора
cls
locate Ряд,Кол 'восстанавливается курсорная позиция
end
Функции CVI,CVL,CVS,CVD
-----------------------
Функции CVI,CVL,CVS,CVD преобразуют строчные данные,считываемые из произволь-
------- ных файлов,в числовую форму.
Синтаксис y%=cvi(2байтовая строка)
--------- y&=cvl(4 байтовая строка)
y!=cvs(4 байтовая строка)
y#=cvd(8 байтовая строка)
Замечания CVI преобразует 2-байтовую строку в целое.CVL преобразует 4-байто-
--------- вую строку в длинное целое.CVS преобразует 4-байтовую строку в зна-
чение единичной точности.CVD преобразует 8-байтовую строку в значе-
ние двойной точности.Применительно к способу обработки Турбо-Бейсиком произ-
вольных файлов,числовые значения должны перед их записью на диск транслиро-
ваться в строку,а при считывании файла-обратно в числа.Не путайте эти функции
(предназначенные только для обработки произвольных файлов )с функцией VAL ,ко-
торая принимает строку вроде "3.7"и превращает ее в число.
См.также MKD$
MKI$
MKL$
MKS$
Пример 'Эта программа создает файл данных произвольного доступа и записывает
'в него некоторые данные.Затем эти данные считываются обратно
'с преобразованием в приемлемую форму с использованием описанных вы-
'ше функций
'открыть файл произвольного доступа
open "r",#1,"cvsld.dta",18
field #1,2 as Целое$,4 as ДлинноеЦелое$,4 as ЕдиничнаяТочность$,8 as
ДвойнаяТочность$
МаксЦелое%=32767
'записать данные в файл,преобразовать их и назначить в буфер перед
'записью в файл данных
for i%=1 to 5
- 99 -
lset Целое$=mki$(i%)
lset ДлинноеЦелое$=mkl$(i%+clng(МаксЦелое%))
lset ЕдиничнаяТочность$=mks$(csng(i%*csng(МаксЦелое%)))
lset ДвойнаяТочность$=mkd$(МаксЦелое%^i%)
put #1,i%
next i%
for i%=1 to 5 'считать данные из файла
get #1,i% 'отобразить их на экране
print cvi(Целое$),cvl(ДлинноеЦелое$),cvs(ЕдиничнаяТоч-
ность$),cvd(ДвойнаяТочность$)
next i%
clise#1
end
Функции CVMD,CVMS
-----------------
Функция CVMD и CVMS преобразует строчные переменные,считываемые из произвол
------- ьных файлов в формате Микрософт,в числовую форму.
Синтаксис y!=CVMS(4-байтовая строка)
--------- y#=CVMD(8-байтовая строка)
Замечания CVMS (Convert Microsoft Singl-precision string) преобразует 4-бай-
--------- товую строку,представляющую значение единичной точности в формате
Микрософт,в значение единичной точности в формате IEEE Турбо-Бейси-
ка.CVMD(Convert Microsoft Double -precision string) преобразует 4-байтовую
строку,представляющую значение двойной точности в формате IEE Турбо-Бейси-
ка. Эти функции предусмотрены исклбчительно для совместимости с существующими
файлами Интерпретаторного Бейсика.
Пример 'открыть файл произвольного доступа
open "cvmd.dta" as#1 len=12
field#1,4 as Единичная$,as Двойная$
for i=1 to 5 'записать некоторые данные в файл
'преобразовать данные и назначить файл данных
lset Единичная$=mkms$(i)
lset Двойная$=mkmd$(i^i)
put #1.1
next i
for i=1 to 5
get #1,1
print cvms(Единичная$),cvmd(Двойная$)
next i%
print cvs(x$),cvms(x$)
close #1
end
Оператор DATA
-------------
Функция DATA заявляет константы для операторов READ.
-------
Синтаксис DATA константа[,константа]...
---------
Замечания Константа-это числовая или строчная константа.Числовые константы
--------- могут быть с плавающей точкой или целые и опционально могут выра-
жаться как шестнадцатиричные или восьмеричные.Строчные константы не должны
заключаться в кавычки,если они не содержат разделители(запятые либо двоето-
-100 -
чия) или значащие передние либо концевые пустоты,и могут свободно размещать-
ся вперемежку с числовыми константами.Например:
DATA Тако,.79,куриный предел,2.29,.29
Программа может содержать много операторов DATA и они не обязательно долж-
ны быть следующими друг за другом строками.Каждое может содержать столько
констант,сколько умещается в строке
Во время прогона операторы READ получают доступ к константам
DATA слева направо и сверху вниз в том порядке ,в каком они появляются в ис-
ходной программе.Большинство общих ошибок ,ассоциируемых с оператором DATA и
READ получается из-за несинхронности и попыток загрузить строчныю данные в
числовую переменную;в результате генерируется ошибка 2 (синтаксическая ошиб-
ка). К сожалению вы не получаете информацию об ошибке при загрузке числовой
константы в строчную переменную,даже если это не то ,что вы намеревались
сделать.
команда RESTORE позволяет вам повторно считывать константы из первого опе-
ратора или любого специфицированного оператора DATA.Если вы пытаетесь реали-
зовать READ большое число раз,чем имеет констант ваша программа,это приводит
к ошибке 4 (вне данных).
Ограничения Вы не можете использовать в операторах DATA литеры с непрерывным
----------- подчеркиванием .Не пользуйтесь единичной кавычкой (') для комен-
тирования оператора DATA,поскольку Турбо-Бейсик может принять ее за послед-
ний вход ,а ваш комментарий за часть данной одной длинной строчной констан-
ты.Например:
"Кнопки","собаки" и "свиньи'список животных."
Вы можете ,однако ,безопасно использовать для этой цели :REM:
См.также READ
RESTORE
Пример 'Эта программа демонстрирует использование оператора DATA
sub ОбработкаРезультатов(СтудентаИмя$,СтудентаСредний%)
local Всего%,Бал%,i%
Всего%=0
read СтудентаИмя$
for i%=1 to 10
read Бал%
Всеге%=Всего%+Бал%
next i%
СтудентаСредний%=Всего%\10
end sub
for Студент%=1 to 3
call ОбработкаРезультатов(Симя$,Средний%)
print using "&'s средний равен ###";симя$,средний%
next Студент%
end
Ваши результаты:
DATA В.Перри,78,65,35,79,86,93,79,85,99,96
DATA П.Ватсон ,98,94,70,88,99,100,75,96,100,95
DATA М.Чикконе,65,59,75,82,56,79,82,76,69,89
Системная переменная DATE$
--------------------------
Функция DATE$ устанавливает и устанавливает системмную дату.
-------
Синтаксис DATE$=s$ (установить дату в соответствии с информацией в s$)
--------- s$=DATE$ (s$ содержит теперь информацию о дате)
Замечания Системная дата устанавливается назначением правильно сформирован-
--------- ного строчного значения в DATE$.Назначение DATE$ строчной пере-
менной делает системную дату доступной для обработки.DATE$ возвращает 10-ли-
терную строку в форме мм-дд-гггг,где мм-месяц,дд-день,гггг-год.
-101 -
Чтобы изменить дату ,ваша строка должно иметь формат даты одного
из следующих видов:
мм-дд-гггг
мм/дд/гг
мм-дд-гггг
мм/дд/гггг
Например :"10-25-86" устанавливает системную дату на 25 октября 1986 года.
Ограничения Год ,назначенный в системной переменной DATE$ должен лежать в
----------- диапазоне 1980-2099 .
См.также TIME$
Пример 'отобразить текущую системную дату
print "текущая системная дата";DATE$
input "пожалуйста ,введите новую дату в форме мм-дд-гг";НоваяДата$
DATE$=НоваяДата$
print "Текущая системная дата установлена на ",DATE$
end
Оператор DECR
-------------
Функция DECR сбрасывает переменную.
-------
Синтаксис DECR переменная[,размер]
---------
Замечания Переменная-это численная переменная ,а размер-опциональное число-
--------- вое выражение,которое указывает значение,которое должно вычитаться
из переменной.Если размер опускается,используется 1.
DECR-лучший способ сбрасывания переменной .Для приращения пере-
менной используйте оператор INCR.
См.также INCR
Пример i%=15
j%=500
while i%>0
print i%,j%
decr i%
decr j%,5 'сбросить значение на 5
wend
end
Оператор DEF FN/END DEF
-----------------------
Функция DEF FN/END DEF определяет функцию.
-------
Синтаксис Единичная строка:
--------- DEF FN идентификатор[(список аргументов)]=выражение
Многострочная:
DEF FN идентификатор[(список аргументов)]
[LOCAL список переменных]
[STATIC список переменных]
[SHARED список переменных]
.
.
.
[EXIT DEF]
-102 -
[FN идентификатор=выражение]
END DEF
Замечания Идентификатор- этоуникальное имя,которое должно ассоциироваться с
--------- функцией и следовать соглашению об наименовании меток и переменных
(т.е. представлять собой букву ,за которой следует любое число букв и/или
цифр).Список аргументов -это опциональная,разделяемая занятыми последова-
тельность формальныхпараметров.Параметры ,используемые в списке аргумен-
тов,служат только для определения функции:они не имеют взаимосвязи с другими
переменными программы,имеющими те же имена.скобки DEF FN и END DEF и имя по-
добной субпрограмме группы операторов называется функцией.Функции может оп-
ционально подаваться один или более аргументов по назначению.Функции возвра-
щают значение(тип которого управляется соответсвенно имени функции,как если
бы это была переменная ) и поэтому могут вызываться из любого оператора,ко-
торое способно принимать значение подходящего типа.
Оперделение функций и программный поток
---------------------------------------
Положение определений функций не имеет значения.Функция может быть опреде-
лена в строке1 или строке 1000 программы,вне зависимости от того,где она ис-
пользуется и вам нет необходимости пропускать программный поток непосредст-
венно через функцию в качестве шага возбуждения (что вы обязаны делать с од-
нострочными функциями в Интерпрет.Бейсике).Компилятор просматривает ваши оп-
ределения,где бы они ни были.
Также,в отличии от подпрограмм,исполнение не может неожиданно "приняться"
за функцию.Для всего,что касается исполнительного прохода программы,опреде-
ления функций и процедур невидимы.Например:
t=fnВыдатьШтат
def fnВыдатьШтат
print "Выдаю из fnВыдатьШтат"
end def
Когда исполняется эта четырех строчная программа,сообщение появляется
только один раз,посколтку ВыдатьШтаты вызывается только в первой строке.
Определения функций должны трактоваться как изолированные острова кода;ни
переходов в них,ни переходов из них с помощью оператора GOTO,GOSUB или
RETURN не существует.Однако в пределах самих определений такие операторы су-
ществуют .
Следует заметить ,что определения функций и процедур нельзя гнездо-
вать,т.е. незаконно определять процедуру или функцию внутри процедуры или
функции(кажд-е определение процедуры или функции может содержать вызовы дру-
гих процедур).
Заявления локальных переменных(только многострочные функции)
------------------------------------------------------------
Чтобы заявить локольные переменные в пределах функции,перед любыми исполь-
зуемыми операторами в определении используйте оператор LOCAL.Например
LOCAL a%,b#,БольшойМассив%()
создает три локальных переменных:a%,b#,(целое и двойной точности соответс-
твенно) и массив БольшойМассив%.Затем массив должен быть надлежащим образом
образмерен:
DIM DYNAMIC БольшойМассив%(1000)
Синтаксические и разделяемые переменные
---------------------------------------
По умолчанию,переменные которые используются в определении функций,имеют
атрибут SHARED(разделяемые);т.е. они являются глобольными для остальной
программы. Поскольку это умолчание может измениться ,вы обязаны затрачивать-
усилия на заявление каждой используемой в функции переменной.
Заявляйте переменные с атрибутом STATIC ,если важно чтобы переменная не
теряла своего значения прикаждом возбуждении ,но еще могла быть изменена
только внутри функции.
Определение многострочной функции обычно включает в себя назначение иден-
тификатору функции и должно завершатся END DEF.Если вы делаете выбор не
включать назначение идентификатору функции ,то значение возвращаемое из фун-
кции неопределенно.
Используйте для возвращения из функции где-то в ином месте,чем в конце
ее,оператор EXIT DEF.
-103 -
См.также LOCAL
SHARED
STATIC
Пример $STACK &H&FFF
Всего=1
def fn факториал%(i%)
'Эта функция вычисляет факториал параметра i%
Всего=Всего*i%
if i%>1 then
Саб%=fnфакториал%(i%)
endif
fnфакториал%=Всего
end def 'конец функции fnфакториал
print "Ввести число,которое вы желаете обсчитать"
input "факториал:",j%
print fnфакториал%(j%)
end
Операторы DEFINT,DEFLNG,DEFSNG,DEFDBL,DEFSTR
--------------------------------------------
Функция Заявляют тип идентификаторов переменных по умолчанию.
--------
Синтаксис DEFтип буквенный диапазон[,буквенный диапазон]...
---------
Замечания Тип представляет один из пяти типов переменных Турбо-Бейси-
--------- ка:INT(целое),LNG(длинная целая),SNG(единичной точности),DBL
(двойной точности) и STR(строчная).Буквенный диапазон-это либо одна алфавитная
литера (от а до z,регистр безразличен),либо диапазон букв(две буквы,
разделенные тире;например ,А-М).
Оператор DEFтип сообщает компилятору ,что переменные и определяемые пользо-
вателем функции ,начинающиеся со специфицированных букв или диапазона
букв,будут определенного типа. Это дает вам возможность использовать перемен-
ные,иные ,чем с плавающей точкой единичной точности,в вашей программе без
включения идентификаторов типа (например, %,#)
По умолчанию,когда компилятором обнаруживается имя переменной без идентифи-
катора типа,оно предполагается переменной с плавающей точкой единичной точ-
ности.Например,в приведенном ниже операторе и n и m полагаются имеющими еди-
ничную точность:
n=m+16
Если ,однако,Этому оператору предшествовало DEFINT n,m ,то n,m должны быть
целыми,как и любая другая переменная 6имя которой начинается с n или m верх-
него или нижнего регистра.
Исполнение DEFтип в Турбо-Бейсике отдичается от исполнения в Интерпрет.Бей-
сике.Интерпретатор судит о типе соответственно тому,где появился оператор
DEFтип в порядке исполнения программы.Турбо-Бейсик,как компилятор,рассматри-
вает положение DEFтип в исходном файле.Например,при исполнении этой программы:
10 goto 30
20 defint a-m
30 j=45.3:print j
интерпрет.Бейсик никогда не заметит заявление типа в строке 20.Когда он
добирается до j в строке 30 это j становится переменной единичной точности и
не читается как 45.3.Турбо-Бейсик ,наоборот,принимает решение о типе пере-
менной во время компиляции вне зависимости от исполнительного прохода(о ко-
тором во время компилировании ничего не известно).Необходимо позаботится
только отом ,чтобы оператор DEFINT физически появился до появления j впервые
,в результате чего jоказывается целой переменной и распечатывается 45.
Ограничения Оператором DEFтип будет переопределяться тип любых соответствую-
----------- щих переменных ,которые уже используются в программе.Программа
следующего примера демонстрирует этот крайне важный момент.
-104 -
Пример i=39567.999
print "число ед.точности",i
defsng i
print "целое число",i
defdbl a-c
deflng j-z
a=32767.1
z=-1
i=&H8FFF
print "три разных типа",f,z,i
end
Оператор DEF SEG
----------------
Функция DEF SEG определяет сегмент данных,подлежащих использованию оператор
------- ами BLOAD,BSAVE,CALL,ABSOLUTE,PEEK и POKE.
Синтаксис DEF SEG [=числовое выражение]
---------
Замечания Числовое выражение может находится в диапазоне от 0 до 65535.
--------- DEF SEG определяет сегмент памяти в котором будут специфицировать-
ся ответвления последущими операторами
BLOAD,BSAVE,CALL,ABSOLUTE,PEEK,POKE.Сегмент -это адресующая конструкция,ис-
пользуемая процессорами семейства Интел 86.Адреса должны специфицироваться
двумя целыми,сегмент и ответвление в сегмент.
DEF SEG без аргумента возвращает значение сегмента к его значению по умоча-
нию на момент запуска.первые 256 байтов сегмента по умолчанию содержат ин-
формацию ,используемую системой поддержки времени прогона вашей программы.В
этом сегменте есть один интересный адрес при ответвлении &HF4E.Значения
вставленные командой POKE по этому адресу изменяют текст записанный на экра-
не в любом графическом режиме.Цвет зависит от того ,в каком режиме вы нахо-
дились.Другой полезный адрес в сегменте данных по умолчанию находится в
ячейке 0 и 1.Это слово содержит сегмент строк Турбо-Бейсика.
См.также COLOR
Пример 'Эта программа заполняет экран буквами А ,вставленными непосредстве
' нно в видео-память.определить функцию ,которая устанавливает адрес
'видео-памяти .Получить тип видео платы от пользователя
def fn ВидеоЭкран%
local ЭкранаТип%
print "тип экрана ?"
input "[1 для моно,2 для цветного]",ЭкранаТип%
select case ЭкранаТип%
case 1
fn ВидеоЭкран%=&HB000
case 2
fn ВидеоЭкран%=&HB800
end select
end def
def seg=fnВидеоЭкран%
for i%=0 to 4000 step 2
poke i%,asc("A")
next i%
end
Оператор DELAY
--------------
Функция DELAY вставляет паузу
-------
-105 -
Синтаксис DELAY секунды
---------
Замечания секунда-это числовое выражение,определяющее число секунд паузы,вы-
--------- полняемой Турбо-Бейсиком перед использованием следущего операто-
ра.Примечание:DELAY принимает аргументы с плавающей точкой,а дробные задерж-
ки можно специфицировать с разрешением примерно 0.054.
Использование DELAY ,а не программного цикла ничегонеделания,сказывается на
программах,которые прогоняются на машинах с разной скоростью обработки(т.е.
базирующихся на 8088 по сравнению с базирующимися на 80286,или 6Мгц по срав-
нению с 8Мгц).
Пример print "Нажмите любую кнопку для завершения программы"
while not instat
locate 10,30
print time$
delay 5
wend
end
Оператор DIM
------------
Функция DIM заявляет массив
-------
Синтаксис DIM{static!dynamic}переменная(подстрочный индекс)[,перемен-
--------- ная(подстрочный индекс )]...
DIM {static!dynamic}переменная(мин:макс)[,мин:макс]...)[,пере-
менная(мин:макс)[,мин:макс]...)]...
Замечание Переменная -это идентификатор,используемый для массива.Подстрочный
--------- индекс- это разделяемый запятыми список одного или более целых вы-
ражений,определяющий размеры массива.DIM заявляет массивные переменные и оп-
ределяет их размер и число измерений.В порядке улучшения синтаксиса интерп-
ретаторного Бейсика,Турбо-Бейсик дает вам возможность определять диапазон
значений подстпрочных индексов(мин:макс),а не только верхний предел,например:
DIM B(50:60)
создает массив из 11 элементов единичной точности,нумеруемых от 50 до
60.Оператором
DIM C(50:60,25:45)
создается двумерный массив с общим числом элементов 11*21.
Синтаксис диапазона можно расширять на многомерные массивы:
DIM рождения(1800:1899,1:12)
Для определения наименьшего элемента в массиве можно также использовать
связанные операторы OPTION BASE,хотя диапазонный механизм более мощное и
предпочтительное средство.
Когда программа используется впервые,Турбо-Бейсик устанавливает каждый
элемент числового массива в 0,а строчные массивы-в нуль-строку(длина=0).Если
программа запускается вновь с помощью оператора RUN,числовые массивы повтор-
но устанавливаются в ноль ,а строчные массивы в ноль-строку.
Если массивная переменная используется без предшествующего оператора
DIM,максимальным подстрочным индексом является значение 10 по умолчанию,как
если бы включили (10) в ваш оператор DIM.Однако предпочтительно в практичес-
кой работе заявлять каждый массив явно.
Минимальное значение ,которое можно использовать в качестве подстрочного
индекса в амссивах,есть 0,если не специфицируется иное с помощью команды
OPTION BASE.
Опциональные аргументы STATIC и DYNAMIC управляют ,соответственно,тем
,будет ли пространство для массива заранее распределяться компилятором,или
подлежит распределению динамически.Если этот аргумент опускается ,массивы по
умолчанию размещаются как статические,если уже не задан метаоператор
$DYNAMIC,если в заявлении DIM не используется какое-либо выражение,если имя
-106 -
массива не появляется в двух операторах DIM или если массив не заявлен ло-
кальным в процедуре либо функции.
Переключатель проверки границ ,доступный через меню опций,вызывает созда-
ние компилятором кода,которым проверяется приемлемость подстрочных индексов
при всякой ссылке на массив.
Различия Турбо-Бейсик_ дает возможность программисту специфицировать началь-
ный и конечный индексы массива.Интерпретаторный Бейсик размещает все массивы
динамически,но Турбо-Бейсик будет пытаться разместить их статически(во время
компилирования),что делает их более быстродоступными.Вы можете явно преодо-
левать тип используемого размещения.
См.также $DYNAMIC
FRE
$STATIC
Пример %МаксРазм=20
%МинРазм=1
dim Массив%(%МинРазм:%МаксРазм)
for счетчикi%=%МинРазм TO %МаксРазм
Массив%(счетчикi%=%Минразм to %МаксРазм
Массив%(счетчикi%)=int(rnd*10)
next счетчикi%
end
Оператор DO/LOOP
----------------
Функция DO/LOOP -это цикл с текстом TRUE (истинно) или FALSE (ложно) в верх
------- ней и/или нижней части цикла.
Синтаксис DO[{WHILE!UNTIL}выражение]
--------- .
. операторы [EXIT LOOP]
.
[LOOP!WEND][{WHILE!UNTIL}выражение]
Замечания Выражение-это числовое выражение ,в котором ненулевые значения
--------- представляют TRUE,а нулевые-FALSE.
DO и LOOP представляют собой строительные элементы циклов для всех случа-
ев.Они позволяют вам создавать циклы с тестированием условия завершения в
верхней части цикла ,в нижней его части и в обоих местах.Оператор DO всегда
должен быть в паре с оператором LOOP в нижней части цикла.Несоврадение DO и
LOOP приводит к ошибкам периода компилирования.
Используйте WHILE и UNTIL для добавления какого-то теста к DO/LOOP .Исполь-
зование резервированного слова WHILE удобно при необходимости повторения
цикла ,если выражение ИСТИННО и его прекращении ,если выражение ЛОЖНО.UNTIL
вызывает противоположный эффект,т.е. цикл будет прекращаться ,если условие
ИСТИННО,и будет повторятся ,если оно ЛОЖНО.
Например: DO WHILE a=13
.
.ОПЕРАТОРЫ
.
LOOP
исполняет операторы между DO и LOOP,пока а равно 13.
DO UNTIL a=13 -
.
.ОПЕРАТОРЫ
.
LOOP
исполняет операторы между DO и LOOP ,пока а не равно 13.
В любой точке DO/ LOOP вы можете включать оператор EXIT/LOOP.Это эквивалент-
но GOTO к оператору ,которое выполняется после завершения LOOP.(Более под-
-107 -
робно см.в описании оператора EXIT).
Обратите внимание на то ,что это DO/LOOP:
DO WHILE A<B
.
.
.
LOOP
имеет тот же эффект ,что и цикл WHILE/WEND:
WHILE A<B
.
.
.
WEND
Хотя компилятором не реализуется забота о подобных вещах,делайте отступ для
операторов между DO и LOOP на пару пробелов.Это помогает яснее представить
структуру цикла.
Пример DO 'Эта программа ждет нажатия клавиши
LOOP UNTIL INSTAT
END
Оператор DRAW
-------------
Функция DRAW обеспечивает вычерчивание контуров на графическом экране.
-------
Синтаксис DRAW строчное выражение
---------
Замечания DRAW дает графику обьектов на графическом экране в соответствии с
--------- командами,заключенными в строчный аргумент ,который в него подается.
В действительности " строчное выражение" есть программа для интерпретаторного
"языка" DRAW.Оператор DRAW обеспечивает исполнение командных строк для полу-
чения изображений на экране во многом также как и PLAY исполняет командные
строки для создания музыки.
-----------------------------------------------
Перемещение Команды
-----------------------------------------------
Un Переместить вверх
Dn Переместить вниз
Ln Переместить влево
Rn переместить вправо
En Переместить вверх и вправо
Fn Переместить вниз и вправо
Cn Переместить вниз и влево
Hn Переместить вверх и влево
-----------------------------------------------
n -расстояние перемещения(см.Sn,масштабный коэффициент,обсуждае-
мый ниже).
Перемещение всегда начинается в LRP и соответственно регулирует LRP(LRP оз-
начает "точка последней посылки") и определяе последнюю точку ,на которую
ссылались определенные чертежные операторы.Более детальную информацию см. в
разделе графики ГЛАВЫ 4).
Например:
DRAW "D10R5"
обеспечивает вычерчивание L-образной формы (вниз 10,вправо
5),начиная с LPR.При этом LPR устанавливается в последнем задействованном
пикселе.
Мx,y обеспечивает перемещение в координату x,y.Если перед x стоит знак
плюс или минус ,перемещение относительное,иначе оно абсолютное,например:
DRAW "D10R5 M30,50"
обеспечивает вычерчивание L-формы ,а затем доводит ее линией до
-108 -
пиксела(30,50).
Любой команде перемещения могут предшествовать следующие префиксы:
В -обеспечивает перемещение без графического изображения
N -обеспечивает перемещение ,но также возврат в исходное положе-
ние по окончании.
Например:
DRAW "BM180,20NU10ND101L10NR10"
обеспечивает перемещение без вычерчивания в пиксел (180,20),а
затем вычерчивание знака плюс
Другие команды
--------------
An- обеспечивает установку угла n.Значение n может лежать в диапазоне от 0
до 3,где 0 соответствует 0 градусов,1-90 градусам,2-180 градусам и
3-270 градусам.
TAn-обеспечивает поворот на n градусов.Значение n может находится в диапа-
зоне от -360 до +360 градусов.Если n положительно ,поворот осуществляется
против часовой стрелки,а если n-отрицательно ,то по часовой стрелке.Значения
вне законного диапазона вызывают ошибку 5 периода прогона.
Cn-обеспечивает вычерчивание в цвете n.Относительно диапазона n 6сверяй-
тесь с оператором PALETTE в каждом режиме отображения.Цветом по умолчанию
является наивысший законный атрибут.
Sn-обеспечивает установку масштабного коэффициента как n/4,где n может ле-
жать в диапазоне от 0 дл 255.Например,если n=8,масштабный коэффициент равен
2.В операторе DRAW осуществляется умножение масштабного коэффициента на ар-
гументы при U,D,L,R,E,F,G,H и относящихся к ним командам М для определения
крайнего размера обьектов.По умолчанию n равно 4,что дает масштабный коэффи-
циент равный 1(т.е. без мастабирования).Видовое отношение дисплея которым вы
пользуетесь определяется взаимосвязью X и Y.На идеальном ,несуществующим
дисплее с видовым отношением 1/1 точка в направлении X имеет ту же длинну
,что и в направлении Y.Однако дисплеи для IBM-компьютеров имеют следущие ви-
довые отношения:
----------------------------------------------------------------
Монитор-адаптер Экран 1 Экран 2 Экран 7/8/9 Экран 10
----------------------------------------------------------------
Цветной 5/6 5/12 нет нет
Улучшенный 5/6 5/12 8.76/12 нет
Улучшенный моно нет нет нет 9.57/12
----------------------------------------------------------------
X VARPRT$(переменная) обеспечивает исполнение субстроки,т.е.ис-
полняет вторую командную строку из первичной DRAW строки.X-команда в чем-то
подобна GOSUB;например:
DRAW "X"+VARPRT$(x$)
P цвет ,граница стартует на текущей (x,y) координате и обеспечивает за-
полнение цветом ЦВЕТ,останавливаясь на зонах цвета ГРАНИЦА.
В каждом случае аргумент n,x или y может быть либо константой либо пере-
менной в форме
=VARPRT$(переменная);
Например:
DRAW "e15"
то же ,что и
а=15
DRAW "e="+VARPRT$(a)
DRAW игнорирует пробелы в своей командной строке-вы можете пожелать ис-
пользовать их ,чтобы сделать вашу DRAW-программу более читабельной.
Ограничения Турбо-Бейсик не распознает имена переменных в DRAW строках.Поэ-
тому вы должны для доступа к содержимому переменных в пределах DRAW-строки
во время прогона пользоваться VARPRT$(n).Вместо DRAW "U=I%"
используйте DRAW "U="+VARPRT$(I%)
Пример screen 1
домик$="u20 c5 e20 h5 d20 l30
draw домик$
draw "be3"
draw "p1,3"
-109 -
for i%=1 to 280 step 40
draw "m="+varprt$(i%)+",40"
draw домик$
next i%
end
Оператор END
------------
Функция END завершает исполнение программы или определяет конкц структурного
------- блока.
Синтаксис END[{DEF!IF!SELECT!SUB}]
---------
Замечания END без аргументов завершает исполнение программы.Оператор END
--------- можно размещать где угодно в программе и их может быть более одного.
Обнаружение END вызывает закрытие прораммой всех открытых файлов и возврат в
DOS (или в Турбо-Бейсик,в зависимости от того откуда была запущена программа
в работу).END компилятором строго не требуется,хотя практически его исполь-
зовать рекомендуется.Если программа выходит ,исполнив все операторы,достига-
ется тот же эффект.
END ,за которым следуют резервированные слова DEF,IF,SUB,SELECT,определяют
конец структурного блока.
См.также DEF
IF
SELECT
STOP
SUB
Пример sub ПустаяПроц
print "алло"
endsub
def fn ПустаяФункц$
end def
input "Исполнить процедуру или функцию[1или2]";Который%
if Который%>0 then
select case Который%
case 1
call ПустаяПроц
end
case 2
print fnПустаяФункц$
end
case else
print "Был сделан незаконный выбор"
end select
end if
end
Оператор ENDMEM
---------------
Функция ENDMEM возвращает адрес конца физической памяти.
-------
Синтаксис y=ENDMEM
---------
Замечания ENDMEM возвращает длинное целое ,представляющего адрес последнего
--------- байта физической памяти.ENDMEM в сочетании с MEMSET можно исполь-
зовать для размещения пространства в высокой памяти для программ на языке
ассемблера.Пока используется программа ,находящаяся в памяти,ENDMEM в дейст-
вительности возврващает конец физической памяти минус размер символьной таб-
-110 -
лицы.Когда Турбо-Бейсик осуществляет компилирование в память ,он обеспечива-
ет хранение символьной таблицы по наивысшему адресу памяти.
См.также MEMSET
Пример PRINT "Конец адресуемой памяти равен:",endmem
end
Оператор ENVIRON
----------------
Функция ENVIRON модифицирует информацию в таблице среды.
-------
Синтаксис ENVIRON строчное выражение
---------
Замечания Строчное выражение определяет имя параметра,подлежащего измене-
--------- нию,добавлению или стиранию,и собственно информацию о новом
параметре.Эти две части должны разделятся знаком равенства(=).
ENVIRON и родственная ему функция ENVIRON$ используютяс для конфигурации
среды,подлежащей подаче в программы,исполняемые через оператор SHELL.(Под-
робную информацию см. в описании оператора SHELL и команды SET в справочном
руководстве по DOS) .
Например:ENVIRON "PATH=\TURBOBAS"
устанавливает DOS-параметр PATH на "TURBOBAS".Следовательно про-
пущенная через SHELL копия COMMAND.COM будет автоматически искать справочник
\TURBOBAS для нахождения файлов,которых нетв текущем справочнике.Чтобы стереть
параметр из таблицы среды ,после знака рквенства ставится только двоеточие
(:):
ENVIRON "PATH=:"
стирает из таблицы среды параметр прохода(PATH)
Ограничения Вы не можете расширять пространство среды.Чтобы добавлять новые
----------- входы вы должны освободить пространство,стирая существующие вхо-
ды.
См.также ENVIRON$
SHELL
Пример PRINT ENVIRON$("PATH")
ENVIRON "PATH=\"
Функция ENVIRON$
----------------
Функция ENVIRON$ выдает параметр таблицы среды
-------
Синтаксис s$=ENVIRON$(строка параметров)
--------- s$=ENVIRON$(n)
Замечания Строка параметров -это строчное выражение,содержащее пара-
--------- метр,подлежащий выдаче. n- целое выражение в диапазоне от 1 до
255.ENVIRON$ и родственный ей оператор ENVIRON используются для конфигуриро-
вании среды,подлежащей подаче в программы,используемые через оператор
SHELL.Если используется строчный аргумент ,ENVIRON$ возвращает текст,который
следует за строкой параметров в таблице среды.Следует заметить ENVIRON$ де-
лает различие букв верхнего и нижнего регистров.Если строка параметров не
обнаруживается или за знаком равенства никакой текст не следует,возврашается
нуль-строка.Если используется числовая форма ,ENVIRON$ возвращает строку,со-
держащую n-ый параметр,считая от начала таблицы.Если n-го параметра нет,воз-
вращается нуль-строка.
-111 -
Функция EOF
-----------
Функция EOF возвращает состояние конца файла.
-------
Синтаксис y=EOF(ФайлНом)
---------
Замечания ФайлНом-это значение,специфицированное при открытии файла.
---------- EOF возвращает TRUE (-1) ,если на специфицированном файле был
достигнут конец файла;иначе возвращается FALSE (0).EОF законна только для
дисковых файлов,открытых для последовательного доступа и для коммуникацион-
ных файлов .Возвращение функцией EOF (-1) для коммуникационных файлов озна-
чает ,что буфер пуст.
Пример OPEN "TEXT.DTA" FOR INPUT AS #1
верх:
IF EOF(1) THEN
PRINT C"записей (строк) в файле TEXT.DTA"
ENDIF
INPUT#1,пусто$
C=C+1
GOTO верх
'или ,более элегантно
OPEN "TEXT.DTA" FOR INPUT AS #1
WHILE NOT EOF(1)
INPUT#1 пусто$
INCR c
WEND
PRINT c" записей (строк в файле TEXT.DTA":END
Функция ERADR
-------------
Функция ERADR возвращает адрес самой последней ошибки.
-------
Синтаксис y=ERADR
---------
Замечания ERADR возвращает значение длинного целого ,представляющего положе-
--------- ние самой последней ошибки .ERADR есть некоторое значение програм-
много счетчика ,которое выводилось бы ,но не выведено ,поскольку не включи-
лось отслеживание ошибок(т.е. его можно можно использовать посредством вклю-
чения выбора ошибок из меню опций для нахождения положения в исходной прог-
рамме того оператора,которое генерирует ошибку).
ERADR предназначена в качестве функции некоторой последней пересортировки в
подпрограммах обработки ошибок.Если какая-то подпрограмма ошибок не распола-
гает схемой обработки конкретной ошибки,вы ,по крайней мере ,можете вывести
код ошибки(ERR) и ERADR на экран,и таким образом сообщить вашим пользовате-
лям о необходимости отчитаться о случившимся.
См.также ERL
ERR
ERROR
ON ERROR
Пример ON ERROR GOTO ЛОВУШКА
DIM X%(10)
FOR I%=1 TO 10
READ X%(I%) 'СЧИТАТЬ X 10 РАЗ
PRINT X%(I%) '
-112 -
NEXT I%
'В ПАМЯТИ НЕДОСТАТОЧНОЕ ЧИСЛО ЭЛЕМЕНТОВ ДАННЫХ
DATA 1,2,3,4,5,6,7
END 'СЛЕДУЮЩИЙ ОБРАБОТЧИК ОШИБОК ВЫВОДИТ НОМЕР И АДРЕС ОШИБКИ
ЛОВУШКА :
LOCATE 10,15
'ВЫВЕСТИ СООбЩЕНИЕ В СЕРЕДИНЕ эКРАНА
PRINT "ОШИбКА ТИПА "ERR" ПРОИЗОШЛА ПО АДРЕСУ "ERADR
LOCATE 11,15
PRINT "ПОжАЛУЙСТА ,ОТМЕТЬТЕ ЭТИ ЗНАЧЕНИЯ И СВЕРТЕСЬ С РУКОВОДСТ-
ВОМ"
END
Оператор ERASE
--------------
Функция ERASE стирает динамические массивы и повторно устанавливает статиче
-------- ские.
Синтаксис ERASE имя массива[,имя массива]...
---------
Замечания Имя массива -это имя того массива(вов),который вы желаете повторно
--------- установить или исключить из размещения .Следует заметить,что пус-
тые скобки не должны входить в ИМЯ МАССИВА.Если ИМЯ МАССИВА относится к ди-
намическому массиву,его пространство в памяти освобождается и это имя масси-
ва в дальнейшем можно образмерить вновь с помощью другого оператора DIM.Если
ИМЯ МАССИВА относится к статическому массиву ,при стирании с помощью ERASE
его элементы просто очищаются в 0(или в нуль-строку ,для строчных массивов).
Ограничения Вы не можете стереть массив ,который никогда не существовал,или
----------- в случае динамических массивов уже был стерт.
Различия Турбо-Бейсик дает возможность создания статических массивов ,кото-
-------- рые быстрее динамических массивов.Интерпретаторный Бейсик допускает
только динамические массивы.
См.также CLEAR
DIM
$DYNAMIC
FRE
$STATIC
Пример ON ERROE GOTO ОшибокОбработчик
PRINT FRE(-1)
DIM DYNAMIC БольщойМассив(10000)
БольшойМассив(6666)=66
PRINT FRE9-10
ERASE БольшойМассив
PRINT FRE(-1)
'этот оператор будет возвращать ошибку ,если программа будет
'прогоняться с включенной проверкой границ
PRINT БольшойМассив(6666)
END
ОшибокОбработчик:
PRINT "ошибка типа "ERR
PRINT "произошла по адресу "ERADR
END
Функции ERDEV,ERDEV$
--------------------
Функция ERDEV,ERDEV$ возвращают информацию о приводном устройстве.
-113 -
-------
Синтаксис y=ERDEV
--------- y=ERDEV$
Замечания Когда возникает ошибка устройства ,целая функция ERDEV возвращает
--------- информацию об ошибке в своем младшем байте .Этот байт представляет
код ошибки INT24.Старший байт содержит биты 15,14,13,3,2,1 и 0 атрибутного
слова устройства.ERDEV$ содержит имя устройства :8 байтор для литерных уст-
ройств и 2-для блочных устройств.(См.более детальную информацию в техничес-
ком справочном руководстве по IBM DOS).
Пример ON ERROR GOTO ОшибокОбработчик
PRINT "Открыть путь на устройство А и нажать любую клавишу..."
WHILE NOT INSTAT:WEND
FILES "A:\"." "
END
ОбработчикОшибок:
PRINT USING "Угрожающая ошибка ## имела место на & ":ERDEV,ERDEV$
RESUME NEXT
Функции ERL,ERR
---------------
Функция ERL И ERR возврашают строку и код самой последней ошибки.
-------
Синтаксис y=ERL
--------- y=ERR
Замечания ERL возврашает номер строки самой последней ошибки.Если ошибка
--------- произошла в операторе без номера строки ,ERL возвращает номер
ближайшей нумерованной строки в направлении к началу программы.Если между
точкой ошибки и началом программы нумерованных строк нет,ERL возвращает 0.
ERR возвращает номер самой последней ошибки периода прогона.Тестируйте ее
в подпрограммах отслеживания ошибок с целью исполнения кода,подходящего для
произошедшей ошибки по типу.
Примечание: Операторы ERL RESUME и RESUME NEXT приводят к генерированию
компилятором 4-байтового указателя для каждого оператора в программе.Следо-
вательно программисты,имеющие дело с размером генерируемых ими кодов,должны
принимать это во внимание.При использовании RESUME [строка#] генерируется
единственная инструкция перехода.ERL обычно используется в отладочных целях
,поэтому все это ,вероятно имеет небольшое значение.
Различия Правила ,касающиеся того ,с какой стороны относительного оператора
--------- сравниваемый по ERL номер должен находится,неприемлемы для Тур-
бо-Бейсика.Это связано с тем ,что в Турбо-Бейсике нет инструкции RENUM.Кроме
того,В Турбо- Бейсике неприемлен результат ERL Интерпретаторного Бейсика,по-
лучающийся при возникновении ошибки во время исполнения оператора DIRECT MODE.
См.также ERADR
ERROR
ON ERROR
Пример ON ERROR GOTO Ловушка
DIM X%(10)
FOR I%=1 TO 10
40 READ X%(I%)
PRINT X%(I%)
NEXT I%
'имеется недостаточное число элементов данных
70 DATA 1,2,3,4,5,6,7
80 END
90 Ловушка:
IF ERL=40 THEN
-114 -
RESTORE
RESUME
ELSE
PRINT "Неизветсная ошибка":END
ENDIF
Оператор ERROR
-------------
Функция ERROR вынуждает ошибку периода прогона.
-------
Синтаксис ERROR ОшибкиКод
---------
Замечания ОшибкиКод-это целое выражение от 0 до 255.Если ОшибкиКод-заранее
--------- определенный код ошибки (см.приложение Е),то ERROR вызывает такое
поведение вашей программы,как если бы произошла ошибка.Это предусмотрено
для отладки подпрограмм отслеживания ошибок .
Чтобы определить ваши собственные коды ошибок,используйте в ОшибкиКод такие
значения ,которые не используются Турбо-Бейсиком.Если вы не определяете про-
цедуру обработки ошибок для этих новых потребительских кодов ошибок,Тур-
бо-Бейсик отображает сообщение:
Ошибка n в программном счетчике:адрес
(Error n at pgm-ct :адрес)
где n-код ошибки,адрес-значение из программного счетчика процес-
сора во время обнаружения ошибки .
Пример DEF FN функ%=(x%)
IF x%>65 THEN
ERROR 5 'ошибка вызова незаконной функции
ELSE
FNфунк%=x%+100
ENDIF
END DEF
PRINT FNфунк(65) 'вызвать ошибку незаконного вызова функции
Оператор EXIT
-------------
Функция EXIT преждевременно оставляет какую либо структуру.
-------
Синтаксис EXIT{SELECT!DEF!FOR!IF!LOOP!SUB!WHILE}
---------
Замечания Оператор EXIT позволяет вам оставлять структурный оператор или
--------- определение процедуры и функции в каком-то ином месте,чем ее ко-
нец.Тип структуры,подвергаемой действию оператора EXIT,должен включать в се-
бя,как составную часть,оператора EXIT в соответствии со следущим списком:
--------------------------------------------------
EXIT-опция Подвергаемая EXIT структура
--------------------------------------------------
SELECT Оператор SELECT
DEF Определение функции
FOR Цикл FOR/NEXT
IF IF-блок
LOOP Цикл DO/LOOP
SUB Определение процедуры
WHILE Цикл WHILE/WEND
--------------------------------------------------
При использовании EXIT можно сэкономить на беспорядочных GOTO.
-115 -
Ограничения Когда EXIT используется для выхода из функции,вы должны назна-
----------- чать функции результат до исполнения EXIT.
Пример 'Эта программа демонстрирует все операторы EXIT.Для прекращения исп
'олнения используются и процедура и функция.
SUB Управление (Выб%,Пусто%)
SELECT CASE Выб%
CASE 1
' использовать оператор CASE для сообщения пользователю чего-то о
'вводимом числе
SELECT CASE Пусто%
CASE<0
PRINT "Число меньше нуля"
'выити из оператора SELECT CASE
EXIT SELECT
CASE >0
PRINT "Число больше нуля"
EXIT SELECT
CASE ELSE
PRINT "Число равно нулю"
END SELECT
EXIT SUB
CASE 2
IF Пусто%<0 THEN
PRINT "Число меньше нуля"
EXIT IF
ELSEIF Пусто%>0 THEN
PRINT "Число больше нуля"
EXIT IF
ELSE
PRINT "Число равно нулю"
ENDIF
END SELECT PRINT "Вы выбрали число 2"
END SUB
DEF FN Циклы(Выб%)
'Параметр подаваемый в функцию ,указывает какое EXIT будет ис-
'полняться .Каждая цикловая структура делает одно и то же,чтобы
'продемонстрировать как может использоваться EXIT для завершения
'исполнения цикла.Мы также демонстрируем как можно использовать
'EXIT для выхода из функции.EXIT DEF используется для выхода из
'первых двух случаев выбора.Это предотвращает исполнение опера-
'торов вывода на экран.
'назначить значение результату функции
FNциклы=-1
SELECT CASE Выб%
CASE 1
'использовать EXIT ,чтобы оставить этот цикл,вместо того,чтобы
'позволить ему завершится нормально
FOR I%=1 TO 32767
PRINT RND(Пусто%)
EXIT FOR
NEXT I%
EXIT DEF
CASE 2
DO
PRINT RND(Пусто%)
EXIT LOOP
LOOP
EXIT DEF
CASE 3
WHILE 1
PRINT RND(пусто%)
EXIT LOOP
WEND
END SELECT
-116 -
PRINT "Вы исполнили выбор случая 3"
END DEF
'начать главную программу
'сделать три вызова циклов , выбирая каждый раз иной из имеющихся
PRINT FNЦиклы(1)
PRINT FNЦиклы(2)
PRINT FNЦиклы(3)
INPUT "Введите число:"Пусто%
FOR Счетчик%=1 to 2
CALL Управление(Счетчик%,Пусто%)
CALL Управление(Счетчик%,Пусто%)
NEXT Счетчик%
END
Функции EXP,EXP2,EXP10
----------------------
x x x
Функция EXP возвращает e ;EXP10- 10 ;EXP2- 2 .
------
Синтаксис EXP:
--------- y=EXP(x)
EXP2:
y=EXP2(x)
EXP10:
y=EXP10(x)
Замечания EXP возвращает e встепени x,где x-числовое выражение ,а e-основа-
--------- ние натуральных логарифмов,равное приблизительно 2.718252.Тот же
результат вы получите с помощью оператора e^x.Только с помощью EXP вы можете
вычислить само e :e=EXP(1)
EXP2 возвращает 2 в степени x ,где x -числовая переменная или
выражение.Тот же результат вы можете получить с помощью выражения 2^x.
EXP10 возвращает 10 в степени x ,где x числовая переменная или
выражение.Тот же результат вы можете получить с помощью выражения 10^x.
EXP,EXP2,EXP10 возвращают результат двойной точности.
Пример FOR I=1 TO 10
PRINT USING "Экспонента ##=####^^^^":I,EXP(I)
NEXT I
END
Оператор FIELD
--------------
Функция FIELD определяет переменные поля в буфере файла произвольного досту
------- па.
Синтаксис FIELD [#]Файланом,ширина AS строчная переменная.
---------
Замечания Файланом-это номер,используемый ,когда файл открывается,ширина-это
--------- число байтов, распределяемой для переменной поля,а строчная пере-
менная-это сама переменная поля.
Однажды используемые в операторе FIELD строчные переменные приобретают ста-
тус "переменная поля".Они должны назначаться при подготовке записи в указан-
ный файл произвольного доступа только с использованием RSET и LSET.
Ограничения Идентификатор ,используемый в операторе FIELD,никогда не должен
----------- применяться с левлй стороны в оперпторе присваивания.Если это
происходит,то данный идеттификатор более не идентифицируется с определени-
яим полей файла произвольного доступа.
-117 -
См.также LSET
RSET
Пример OPEN "FIELD.DTA" FOR OUTPUT AS #1 LEN=18
FIELD #1,2 AS Целое$,4 AS ДлинноеЦелое$,4 AS ЕдиничнаяТоч-
ность$,8 AS ДвойнаяТочность$
FIELD #1,2 AS A$,4 AS B$,4 AS C$,8 AS D$
МаксЦелое%=32767
FOR I%=1 TO 5
LSET Целое;=MKI$(I%)
LSET ДлинноеЦелое$=MKL$(I%+CLNG(МаксЦелое%))
LSET ЕдиничнаяТочность$=MKS$(CSNG(I%*CSNG(МаксЦелое%)))
LSET ДвойнаяТочность$=MKD$(МаксЦелое%-I%)
PUT #1,I%
NEXT I%
FOR I% TO 5
GET #1,I%
PRINT CVI(A$),CVL(B$),CVS(C$),CVD(D$)
NEXT I%
CLOSE #1
END
Оператор FILES
--------------
Функция FILES отображает содержание справочника (подобно DIR -команде DOS).
-------
Синтаксис FILES [файласпец]
---------
Замечания Файласпец-это строчное выражение ,следующее соглашениям DOS об
--------- именовании файлов,и может опционально включать в себя специфика-
тор привода и информацию о проходе.Если файласпец опускается,отображаются
все файлы текущего справочника.
Файласпец может содержать свободно определяемые литеры:?,*,аналогично
DIR-команде из DOS.
FILES *.*
дает перечень всех файлов текущего справочника.
FILES *.BAS
дает перечень исходных файлов Турбо-Бейсика.
В конце FILES ,отображается число свободных байтов на устройстве ,содержа-
щем текущий справочник.Файлы субсправочника указуваются суффиксом DIR.
Ограничения Спецификация несуществующего привода или справочника в операто-
----------- ре FILES будет вызывать ошибку периода прогона.
Пример INPUT "Введите привод и справочник ,по которому вы желаете иметь п
еречень":Спр$
FILES Спр$
END
Функция FIX
-----------
Функция FIX дает усечение целого.
-------
Синтаксис y=FIX(числовое выражение)
---------
Замечания FIX отсекает дробную часть аргумента и возвращает целую (в отличии
-118 -
--------- от CINT и INT ,которые выполняют округление).
См.также CEIL
CINT
INT
Пример FOR I=50 TO 52 STEP RND
PRINT USING "Целая часть ##.##=##":x,FIX(x)
NEXT I
END
Операторы FOR/NEXT
------------------
Функция FOR и NEXT определяют цикл с автоматическим наращиванием (или умень-
------- шением).
Синтаксис FOR переменная=x TO y [STEP z]
--------- .
.
.
NEXT [переменная[,переменная]...]
Замечания Переменная-это числовая переменная,служащее счетчиком цикла,тогда
--------- как x,y,z-это числовые выражения,определяющие условия начала и ос-
тановки цикла.X-начальное значение счетчика,y-конечное значение счетчика
счетчика,а z-опциональное значение наращивания.
Операторы между FOR и NEXT используются в режиме повторения.при каждом
проходе через цикл переменная наращивается на z .Если z опускается,то шаго-
вое значение по умолчанию равно 1.Цикл завершается ,когда значение счетчика
больше или равно y (или ,для отрицательного z ,меньше или равно y)7
Циклы FOR/NEXT прогоняются быстрее всего прицелых переменных,как перемен-
ной счетчика,так и константах x,y,z.Корпус цикла пропускается полностью,если
начальное значение x меньше y.Циклы FOR/NEXT могут гнездоваться в других
циклах FOR/NEXT.убедитесь в том ,что используются уникальные переменные
счетчиков и обеспечиваете гарантию появления оператора NEXT внутреннего цик-
ла ранее NEXT внешнего цикла.
Этот цикл имеет пересечение циклов и не будет компилироваться:
FOR n=1 TO 10
FOR m=1 TO 20
.
.
.
NEXT n
NEXT m
Если множество циклов оканчивается в одной и той же точке,достаточно един-
ственного оператора NEXT,содержащего каждую переменную счетчика:
FOR n=1 TO 10
FOR m=1 TO 20
.
.
.
NEXT m,n
Переменная счетчика в операторе NEXT может опускаться вовсе,но если вы
включаете ее,она должна быть правильной.
Например:
FOR n=1 TO 10
.
.
.
NEXT
Хотя компилятор не заботится о таких вещах,делайте уступ в операторах
FOR/NEXT на два или три пробела для разметки структуры цикла.Используйте
оператор EXIT FOR с целью покинуть цикл FOR/NEXT до его завершения.
Если обнаруживается NEXT без соответствующего FOR ,возникает ошибка 1 .
-119 -
Пример FOR I%=1 TO 10
PRINT "Для цикловой итерации "I%
NEXT I%
PRINT "Нажмите любую клавишу ..."
WHILE NOT INSTAT
WEND
FOR I% TO 50 STEP -5
PRINT "Для цикловой итерации"(45-I%)\5
NEXT
END
Функция FRE
-----------
Функция FRE возвращает величину свободной памяти ,имеющейся для вашей прог-
------- раммы .
Синтаксис y=FRE({строчное выражение!-1!-2})
---------
Замечания FRE со строчным аргументом возвращает длинное целое,представляю-
--------- щее число байтов свободной RAM( с помощью произвольного доступа)
в строчной памяти.FRE(-1) возвращает свободную RAM в пространстве массивов
вашей прораммы.FRE(-2) говорит как много места осталось в стеке.
Различия Функция FRE Турбо-Бейсика дает больше информации,чем аналогичная
-------- функция Интерпретаторного Бейсика.Оператор FRE в Интерпретаторном
Бейсике возвращает величину наличной памяти в сегментах данных Бейсика;сле-
довательно вызов FRE (S$) и FRE(0) возвращают одно и то же число.
Однако,поскольку Турбо-Бейсик обеспечивает больше памяти ,в которой рабо-
тает,его оператор FRE имеет больше функций.Турбо-Бейсик имеет отдельный
строчный сегмент ;следовательно FRE(S$) возвращает наличное строчное прост-
ранство.Турбо-Бейсик имеет большое (64К) массивное пространство,поэтому
FRE(-1) возврашает наличную память для массивов.И Турбо-Бейсик поддерживает
процедуры и реккурсивность,поэтому FRE(-2) возвращает наличное стековое
пространство.
Пример ON ERROR GOTO ОшибкиОбработчик
PRINT FRE ("Строчное Пространство"),FRE(-1),FRE(-2)
DIM DYNAMIC БольшойМассив(10000)
БольшойМассив(6666)=66
'отобразить память,имеющуюся в сегментах строк,данных и стека
s$="abc...z"
PRINT FRE("Строчное пространство"),FRE(-1),FRE(-2)
'эта программа дает ошибку ,если прогоняется с включенной при-
вязкой границ
PRINT БольшойМассив(6666)
END
ОшибкиОбработчик:
PRINT "Ошибка типа "ERR"произошла по адресу "ERADR
END
Оператор GET (файлы)
--------------------
Функция GET обеспечивает считывание записи из произвольного файла.
-------
Синтаксис GET [#]файланом[,записином]
---------
Замечания Файланом-это номер файла ,под которым он был открыт,а записином-
--------- запись подлежащая считыванию от 1 до 16777215 ---------
-120 -
Если записином опускается,то считывается следущая по порядку запись (после
специфицированной самым последним GET или PUT).
Пример OPEN "GET.DTA" AS #1 LEN 18
FIELD #1,2 AS Целое$,4 AS ДлинноеЦелое$,4 as ЕдиничнаяТочность$,8 as
ДвойнаяТочность$
FIELD #1,2 AS a$,4 AS B$,4 AS C$,8 AS D$
МаксЦелое%=32767
FOR I% TO 5
LSET Целое$=MKI$(I%)
LSET ДлинноеЦелое$=MKL$(I%+CLNG(МаксЦелое%))
LSET ЕдиничнаяТочность$=MKS$(CSNG(I%*CSNG(МаксЦелое%)))
LSET ДвойноеЦелое$=MKD$(МаксЦелое%^I%)
PUT #1,I%
NEXT I%
FOR I%=1 TO 5
GET #1,I%
PRINT CVI(A$),CVL(B$),CVS(C$),CVD(D$)
NEXT I%
CLOSE #1
END
Оператор GET (графика)
----------------------
Функция GET обеспечивает считывание всего или части графического экрана в м
------- ассив.
Синтаксис GET (x1,y1)-(x2,y2),Массив
----------
Замечания (x1,y1) и (x2,y2) специфицируют верхнюю левую и нижнюю правую гра-
--------- ницы зоны графического экрана,подлежащей обработке оператором
GET.Массив -это числовой массив.
GET и его дополнительная команда PUT исползуются сначала для считывания ,а
затем для записи графических изображений на экран.Единственное ограничение
накладываемое на числовой массив,который используется для хранения считывае-
мых с экрана данных,состоит в том ,что он должен быть достаточно большим для
этого.Для расчета размера массива ,необходимого для хранения заданной доли
экрана,используйте следующую формулу:
Необходимо байтов:4+INT((x*битов на пиксел+7/8)*y,где y и x-горизонталь-
ный и вертикальный размеры захватываемой зоны.
Битов на пиксель-константа,относящееся к режиму :
2-для средней
1-для высокой разрешающей способности.
--------------------------------------
Экран Битов на пиксель
--------------------------------------
1 2
2 1
7 4
8 4
9 4
10 2
--------------------------------------
Например для хранении изображения при средней разрешающей способности 35
пикселей шириной и 45 высотой вам необходим массив
4+int((32*2+7)/8)*45 байтов или 409 байтов.409 байтов представля-
ют собой целый массив из 205 элементов,следовательно массив заявляемый с по-
мощью оператора размера DIM буфер%(204),примет проделанную работу.Помните
,что по умолчанию каждый массив имеет нулевой элемент;так что в массиве бу-
фер% имеется 205 двухбайтовых элементов,от 0 до 204,т.е всего 410 байтов).
Турбо-Бейсик хранит графические данные в следущем формате:
буфер%(0): число битов по горизонтали
-121 -
буфер%(1)%число битов по вертикали
буфер%(2)
.
. Собственно графическая информация
.
буфер%(204)
В силу особенности организации дисплейной памяти,оживление работы на базе
GET и PUT идет быстрее ,если вы выбираете зоны экрана,выровненные по байто-
вым границам.Для средней разрешающей способности используйте значения x
кратное 4;для высокой разреш.способности -кратное 8.
Базисная стратегия использования GET и PUT для живой обработки обьекта от
точки А до точки В состоит в следущем:
Чертить обьект
GET обьект в массив
позиция=старая ячейка=точка А
DO UNTIL позиция =точка В
PUT XOR обьект в старой ячейке
позиция=позиция + приращение
PUT XOR обьект в позиции
задержать,если необходимо
старая позиция=позиция
LOOP
Пример 'разместить буфер для хранения графического образа
DIM Буфер%(143)
'Переключить на графический режим среднего разрешения
SCREEN 1
CIRCLE (16,16),8,2 'чертить окружность
GET (0,0)-(31,31),Буфер% 'получить окружность
'копировать все на экран
FOR I%=0 TO 9
PUT (I%*32,100),Буфер%
NEXT I%
END
Функция GET$
------------
Функция GET$ считывает строку из файла,открытого в режиме BINARY (двоичном).
-------
Синтаксис GET$ [#]файланом,счетчик,строчная переменная
---------
Замечания Счетчик -это целое выражение в диапазоне от 0 до 32767.
--------- GET$ считывает счетчик байтов,начиная с текущей файловой пози-
ции(которая может быть установлена оператором SEEK),из файла номер файланом
и назначает считанное строчной переменной. файл файлном должен быть открыт в
режиме BINARY.После обработки GET$ текущая файловая позиция будет продвинута
вперед на счетчик байтов.
GET$,PUT$ и SEEK обеспечивают низкоуровневую альтернативу приемов обработ-
ки последовательных и произвольных файлов,которая дает вам возможность иметь
с файлами дело на байтовой основе.
См.также OPEN
PUT$
SEEK
Пример SUB создатьФайл
'GET$ открывает файл и записывает в него 256 литер
LOCAL I%
OPEN "GET.DTA" FOR BINARY AS #1
FOR I%=0 TO 256
-122 -
PUT$ #1,I%,CHR$(I%)
NEXT I%
END SUB
DEF FNЧитатьЭл$(Начало%,Размер%)
LOCAL времСтр$,Лит$,I%
SEEK 1,Начало%
GET$ #1,Размер%,ВремСтр$
FNЧитатьЭл$=ВремСтр$
END DEF
CALL Создатьфайл
PRINT "Введите строчную точку [0...255] и сколько"
PRINT "байтов данных [0...255] вы желаете
PRINT "считать из файла ",Ст%,Рз%
PRINT FNчитать Эл$(Ст%,Рз%)
END
Оператор GOSUB
--------------
Функция GOSUB возбуждает подпрограмму
-------
Синтаксис GOSUB метка
---------
Замечания Оператор GOSUB вызывает переход Турбо-Бейсика к оператору ,имеюще-
--------- му перед собой метку ,после предварительного обеспечения хранения
текущего адреса в стеке.Использование RETURN возвращает управление к опера-
тору ,следущему за GOSUB .Процедуры и функции Турбо-Бейсика могут выполнять
работу подпрограмм с добавлением выигрыша в реккурсивности,подачи параметров
и локальных и статических переменных.
См.также DEF FN
SUB
RETURN
Пример PI#=ATN(1)*4
радиус =55
GOSUB РасчетПлощади
радиус=13
GOSUB РасчетПлощади
END
РасчетПлощади:
Площадь=PI#*радиус^2
PRINT Площадь
RETURN
Оператор GOTO
-------------
Функция GOTO направляет программный поток к оператору идентифицируемуму мет-
------- кой .
Синтаксис GOTO метка
---------
Замечания GOTO вызывает безусловное смещение программного потока к коду
--------- идентифицирумому меткой.При умеренном использовании операторы GOTO
представляют собой быстрое и эффективное средство программирования.При без-
заботном использовании они загромождают программу переплетениями,в которых
невозможно разобраться( особенно через месяц и годы после написания ).В сов-
ременной практике программирования стремятся минимизировать применение GOTO
с помощью подпрограмм,процедур и функций,а также структурных операторов ,та-
-123 -
ких как FOR/NEXT,WHILE/WEND,DO/LOOP,IF BLOCK и SELECT.Уменьшению применения
GOTO также способствует оператор EXIT.
См.также EXIT
Пример x=0
Начало:
x=x+1
IF x<20 THEN
GOTO Распечатать
END IF
END
Распечатать:
PRINT "Переменная x="x
GOTO Начало
Функция HEX$
------------
Функция HEX$ преобразует число в его шестнадцптиричный строчный эквивалент.
-------
Синтаксис s$=HEX$(числовое выражение)
---------
Замечания числовое выражение может находиться в диапазоне от -32768 до
--------- 65535.Любая дробная часть числового выражения округляется перед
созданием строки.Если аргумент HEX$ отрицателен ,то эта функция возвращает
двоичное дополнение числа.
См.также BIN$
OCT$
Пример PRINT HEX$(65535)
PRINT HEX$(-1)
Оператор IF
-----------
Функция IF тестирует условие и изменяет программный поток,если условие удовл
------- етворяется.
Синтаксис IF целое выражение[,] THEN оператор(ы)
--------- [ELSE оператор(ы)]
Замечания Если целое выражение TRUE используются операторы следущие после
--------- THEN и любого опционального ELSE.Если выражение FALSE ,то исполня-
ются операторы после ELSE.Если опциональная статья ELSE опускается ,исполне-
ние продолжается со следущей строки программы.
Обычно целое выражение будет результатом,возвращаемым оператором отноше-
ния,хотя и не всегда,как показано ниже:
IF ПринтерВкл THEN LPRINT Ответ$
Здесь оператор lprint используется только ,"флаговая переменная Принтервкл
имеет ненулевое значение.Перед ключевым словом ELSE не должно появляться
двоеточие;например,следущий оператор компилироваться не будет:
IF a<b THEN c=d:ELSE e=f
Оператор IF и всеассоциируемые с ним операторы ,включая следущие после ELSE
должны появляться в одной и той же логической строке.Поэтому следущее неза-
конно:
IF a<b THEN t=15:w=13:v=23
ELSE t=17:w=16:v=15
поскольку компилятор трактует вторую строку как совершенно новый оператор,не
связанный с находящимся выше него .Если количество выших операторов больше
,чем можно разместить в одной строке,вы должны воспользоваться литерой ука-
-124 -
зания непрерывности строки,подчеркиванием (_) ,применяемой для разделения
единой логической строки на нескоько физических строк.Например:
IF a<b THEN t=15:w=16:v=23_
ELSE t=17:w=16:v=15
однако лучшая альтернатива состоит в использовании блокового оператора IF
. Вы можете использовать блоковый оператор IF такжк для формирования многост-
рочного ряда IF -операторов.
Различия Турбо-Бейсик имеет расширенный оператор IF THEN ELSE для обеспечи-
вания множества строк кода в структцре IF THEN ELSE .Турбо-Бейсик обеспечи-
вает также операторы ELSEIF ,ENDIF для блокового IF -оператора.
См.также IF блок
SELECT
Пример INPUT "Введите число",x
IF x>100 THEN PRINT "Большое число" ELSE_
PRINT "Малое число"
END
Блоковый оператор IF
--------------------
Функция IF блок создает ряд IF-операторов
-------
Синтаксис IF целое выражение [,] THEN
.
.
.Операторы
[ELSEIF целое выражение [,] THEN
.
.
. Операторы]
[ELSE
.
.
.Операторы]
ENDIF
Замечания IF блок -это расширение Интерпретаторного Бейсика ,позволяющее
--------- осуществлять множество тестов на множестве строк.
При исполнении операторов IF блока проежде всего проверяется истинность вы-
ражения в операторе IF.Если FALSE проверяется по порядку кождый следущий
оператор ELSEIF.Как только находится TRUE ,Турбо-Бейсик исполняющий операто-
ры следующие за соответствующим THEN ,осуществляет переход к оператору сле-
дующему за оператором ENDIF без проведения дальнейших тестов.Операторы после
опциональной статьи ELSE исполняются,если ни один из ранее проведенных тес-
тов не оказался успешным.
Следует заметить ,что в первой строке IF блока после ключевого слова THEN
ничего не может быть ,таким образом компилятору сообщается ,что это IF блок
,а не обычный оператор IF.
Операторы IF блока могут гнездоваться,т.е. любые операторыпосле любого
THEN могут содержать IF блоки.(Полезно делать отступ операторов,находящихся
под управлением каждого теста на пару пробелов,как показано в следущем ниже
примере.
Блоковые операторы IF должны оканчиваться END IF.Заметьте,что END IF запи-
сывается с пробелом ,а ELSEIF без пробела.
См.также SELECT
Пример: RANDOMIZE TIMER
БанкРулетки=100:Ставка=5:ЗначЗадержки=.5
-125 -
WHILE NOT INSTAT 'нажать клавишу останова
Рулетка=INT(RND(1)*6)+INT(RND(1)*6)+2
PRINT STRING$ (30."_")
PRINT Рулетка:DELAY ЗначениеЗадержки
IF Рулетка=2 OR Рулетка=3 OR Рулетка=12 THEN PRINT "вы проиграли"
БанкРулетки=БанкРулетки+Ставка
ELSE
PRINT "ваша точка есть" Рулетка
Неточка=-1
WHILE Неточка
СледРулетка=INT(RND(1)*6)+INT(RND(1)*6)+2
PRINT СледРулетка:DELAY ЗначениеЗадержки
IF Рулетка=СледРулетка THEN
PRINT "Вы проиграли"
БанкРулетки=БанкРулетки+Ставка
Неточка=0
ELSEIF СледРулетка=7 THEN
PRINT "Вы проиграли"
БанкРулетка=БанкРулетка-Ставка
Неточка=0
'закончить IF рулетка=блок СледРулетка
END IF
WEND
END IF
WEND
Оператор INCR
-------------
Функция INCR наращивает значение.
-------
Синтаксис INCR числовая переменная[,размер]
----------
Замечания Размер-это опциональное числовое выражение,которым указывается
--------- значение добавляемое к специфицированной переменной.Если размер
опускается,используется 1.
INCR - это быстрый способ приращения переменной без применения оператора
присваивания.
Различия Этого оператора в Интерпретаторном Бейсике не существует.
--------
См.также DECR
Пример I%=-15
J%=-500
WHILE I%<0
PRINT I%,J%
INCR I%
INCR J%,5
WEND
END
Функция INKEY$
--------------
Функция INKEY$ считывает клавиатуру без эхо-обработки литеры.
--------
-126 -
Синтаксис s$=INKEY$
---------
Замечания INKEY$ возвращает строку из 0,1 или 2 литер,отражающую состояние
--------- буфера клавиатуры.
Нуль-строка (LEN(s$)=0) означает ,что буфер пуст.Строка длиной (LEN(s$)=1)
означает ,что строка содержит ASCII- значение клавиши нажатой самой послед-
ней;например ,13 для Enter(ввод),65 для A.
Двумерная строка (LEN(s$)=2) означает ,что была нажата не ASCII -клави-
ша.Первая литера в этой строке имеет значение 0,а вторая-код расширенной
клавиатуры-представляет одну из клавиш не ASCII -клавиатуры,такую как
Home(исходное),PgDn(страница вниз) или клавиши стрелки (см.диаграмму кодов
расширенной клавиатуры в приложении F).
Если нажимается определенная функциональная клавиша (см.оператор KEY),то
INKEY$ возврашает последовательность литер (по одной на каждое возбуждение
INKEY$),которая содержит литеры,которые получились бы при их независимом на-
боре.INKEY$ как пуленепробиваемое устройство для получения пользовательского
ввода в вашу программу без ограничений оператора INPUT .Поскольку INKEY$ не
ожидает литеру,подлежащую нажатию до возвращения результата ,вы в большинст-
ве случаев будете использовать ее внутри цикла низкоуровневой подпрограм-
мы,непрерывно проверяющей и строящей строку ввода,подлежащую проверке подп-
рограммами более высокого уровня.
INKEY$ подает все удары по клавиатуре включая клавиши управления,такие как
Таб,Enter,Backspace в вашу программу без их отображения или обработки ,но
при следующих исключениях :
- Ctrl-Break (управление-разрыв) завершает программу ,если опция разрыва
клавиатуры не была выключена во время компилирования программы.
- Ctrl-Alt-Del (управление-изменить-стереть) вызывает повторную установку
системы.
- Shift-PrtSc (сдвиг-вывод на экран)выполняет сброс экрана.
См.также INSTAT
--------
Пример PRINT "Введите несколько литер,за которыми следует <Enter>:"
WHILE лит$<>CHAR$(13)
лит$=INKEY$
ВводаСтрока$=ВводаСтрока+лит$
WEND
PRINT ВводаСтрока
END
Функция INP
-----------
Функция INP считывает с внешнего устройства ввода/вывода.
-------
Синтаксис y=INP(портаном)
---------
Замечания INP возврашает байт ,считываемый с устройства внешнего ввода/выво-
--------- да портаном ,где портаном указывает аппаратное устройство внешнего
ввода и должен иметь значение в диапазоне от 0 до 65635.
INP полезна для считывания информации о состоянии,представляемой различными
аппаратными подсистемами,такими как коммуникационные устройства(См.техничес-
кое справочное руководство по Вашему компьютеру о назначении внешних устрой-
ств).
Для записи на внешний ввод/вывод используйте оператор OUT.
См. также OUT
Пример 'эта программа издает вопль посредством считывания регистра сост
'ояния и тумблерного переключения (включения и выключения ) би-
тов,которыми управляется звукогенератор.
'считать значение внешнего ввода 61 шестнадцатиричное
-127 -
СостояниеРег%=INP(&61)
СостояниеРег%=СостояниеРег% AND H00FC
'маскировать считанное значение
' сделать длину тона достаточной для слуха
FOR I=1 TO 1000
СостояниеРег%=СостояниеРег% XOR 2
OUT &H61,СостояниеРег%
Задержка .001
NEXT I
END
Оператор INPUT
--------------
Функция INPUT дает пользовательскую подсказку о необходимости назначить зна-
------- чения одной или более переменных.
Синтаксис INPUT[;][строка-подсказка{;!,}]список переменных.
---------
Замечания Строка-подсказка-это опциональная строчная константа.Список пере-
--------- менных-это разделенная запятыми последовательность из одной или
более строчных либо числовых переменных.
INPUT ожидает пользовательского ввода данных с клавиатуры и назначает эти
данные одной или более переменных.
Если после строки-подсказки вы включаете точку с запятой ,Турбо_Бейсик вы-
водит после строки знак вопроса.Использованием вместо этого запятой вызывает
подавление знака вопроса.
Ваш ввод должен совпадать с типом переменных в операторе INPUT ;т.е. нечис-
ловые литеры неприемлемы для числовых переменных.Если ввод не совпадает
,Турбо-Бейсик будет требовать повторного ввода информации.Например,введение
нечисловых литер в числовую приводит к сообщению
?Redo from start (Переделать с начала)
Если дается подсказка на более ,чем одну переменную в единственном операто-
ре INPUT,ваш ответ на каждую из них должен отделяться запятыми.
Если точка с запятой появляется сразу после ключевого слова INPUT,курсор
будет оставаться в той же самой строке после нажатия вами Enter для заверше-
ния ответа.Иначе на дисплей посылается пара возврат каретки/подача строки.
Различия Турбо-Бейсик допускает разделение вводимой информации в ответ на
оператор INPUT либо пробелами,либо запятыми.Интерпретаторный Бейсик требу-
ет,чтобы весь ввод разделялся запятыми.
Пример INPUT "Ведите ваш возраст и вес:",Возраст,Вес
PRINT USING "Вам ### лет и ваш вес ###";_
Возраст,Вес
END
Оператор INPUT #
---------------
Функция INPUT # загружает переменные данные из файла последовательного дос-
------- тупа.
Синтаксис INPUT #файланом,список переменных
---------
Замечания Файланом-это номер ,который дается при открывании файла ,а список
--------- переменных-это разделяемая запятыми последовательность из одной
или более строчных либо числовых переменных.
Файл может быть дисковым,последовательного входного устройства (COM n) или
клавиатурным (KYBD).
Данные в файле должны совпадать по типу с переменными 6определяемыми в опе-
раторе INPUT #.Переменная должна появляться сразу ,как только была набрана
-128 -
вами в ответ на оператор INPUT;т.е. она должна отделяться запятыми с возвра-
том каретки в конце.Это тот путь,которым оператором WRITE # создаются файлы.
См.также WRITE #
Пример SUB Сделатьфайл
OPEN "INPUT#.DTA" FOR OUTPUT AS #1
Строчнаяпеременная$="я вернусь"
Целая%=1000
Плавающаяточка!=30000.1234
WRITE #1
CLOSE 1
END SUB
SUB Читатьфайл
OPEN "INPUT#.DTA" FOR INPUT AS #1
Строчнаяпеременная$=" "
Целая%=0
Плавающаяточка!=0
'читать одну строку текста из файла последовательного доступа
INPUT #1,Строчнаяпеременная$,Целая%,Плавающаяточка!
PRINT Строчнаяпеременная$,Целая%,Плавающаяточка!
CLOSE #1
END SUB
CALL Сделатьфайл
CALL Читатьфайл
END
Функция INPUT$
--------------
Функция INPUT$ считывает специфицированное число литер с клавиатуры или из
------- файла.
Синтаксис s$=INPUT$(n)[,[#]файланом])
---------
Замечания n-это число литер,подлежащих считыванию,а файланом-файл,из которого
--------- должно происходить считывание.Если файланом опускается,считывается
клавиатура.
Если используется клавиатура,литеры на экране не появляются и все они пода-
ются в строку назначения.Главным достоинством INPUT # по отношению к другим
приемам считывания файла или клавиатуры является то ,что она позволяет вам
принимать все литеры ,включая литеры управления.
Режим двоичного файла дает этот аттрибут несколько более гибким способом.
Примечание: Определение клавиши и комбинации клавиш (например,клавиши функ-
ций и управления курсором ) не возвращают значение ASCII .Когда нажимается
такая клавиша ,INPUT$ обеспечивает простановку CHAR$(0);INKEY$ не имеет это-
го ограничения.
См.также INKEY$
Пример OPEN "INPUT#.DTA" FOR INPUT AS #1
s$=INPUT$(15,#1);
print s$
close #1
end
Функция INSTAT
--------------
-129 -
Функция INSTAT возвращает состояние клавиатуры.
-------
Синтаксис y=INSTAT
---------
Замечания INSTAT возвращает информацию о состоянии клавиатуры.Если какая-то
--------- клавиша уже нажата, INSTAT возвращает -1;иначе она возвращает
0.INSTAT не реализует перемещение клавишного удара из буфера,т.ч. если даже
она возвращает TRUE(-1),она будет продолжать возвращать TRUE до тех пор ,по-
ка клавишный удар не будет перемещен с помощью INKEY$ или другой команды
считывания клавиатуры.
См.также INKEY$
Пример WHILE NOT INSTAT
LOCATE 1,1
PRINT "Ожидание клавиши..."
WEND
PRINT INKEY$
END
Функция INSTR
-------------
Функция INSTR осуществляет поиск по строке некоего образчика.
-------
Синтаксис y=INSTR([n,]целевая строка,строка-образчик)
---------
Замечания n-это целое выражение в диапазоне от 1 до 32767,целевая строка и
--------- строка-образчик любые строчные переменные,выражения или константы.
INSTR$ возвращает позицию строки-образчика в целевой строке.Если стро-
ки-образчика в целевой строке нет INSTR возвращает 0.Если включается опцио-
нальный параметр n ,поиск начинается с позиции n в целевой строке.Если стро-
ка-образчик есть нуль(длина 0),INSTR DJPDHFOFTN 1 (или n ,если этот параметр
специфицировался).
INSTR чувствительна к регистру.
Пример 'получить пользовательский ввод
LINE INPUT "Пожалуйста введите строку:";ПустаяСтр$
PRINT "Теперь введите субстроку,которая существует в ";
INPUT "Первая строка: ";СубСтр$
PRINT USING "Строка "&" существует,начиная с ";СубСтр$:
PRINT USING "Местоположение ### в &":_
INSTR (1,ПустаяСтр$,СубСтр$),ПустаяСтр$
END
Функция INT
-----------
Функция INT преобразует числовое выражение в целое.
-------
Синтаксис y=INT(числовое выражение)
---------
Замечания INT возвращает наибольшее целое,меньше или равно числовому выраже-
--------- нию .
См.также CEIL
CINT
FIX
Пример PRINT "X","INT(X)"
-130 -
FOR N=1 TO 6
READ X#
PRINT X#,INT(X#)
NEXT N
DATA 3.1,-3.1,3.5,-3.5,3.6,-3.6
END
Оператор IOCTL,функция IOCTL$
-----------------------------
Функция IOCTL и IOCTL$ обеспечивают коммуникацию с возбудителем устройства.
-------
Синтаксис IOCTL[#]файланом,строчное выражение
---------
s$=IOCTL$[#]файланом
Замечания файланом- это номер файла желаемого возбудителя устройства.Строчное
--------- выражение содержит информацию,подлежащую посылке на
возбудитель.Формат строчной информации,посылаемой на возбудитель устройства
или принимаемой с него,является функцией самого возбудителя.
IOCTL посылает данные на возбудитель устройства.IOCTL$ считывает данные с
возбудителя устройства.
При необходимости более подробной информации консультируйтесь с разделом о
возбудителях устройств технического справочного руководства по IBM DOS.
Оператор KEY
------------
Функция KEY устанавливает и отображает содержимое клавиши функций и опре-
------- деляет значения отслеживающих ловушек клавиш.
Синтаксис KEY{ON!OFF!LIST}
--------- KEY n,строчное выражение
KEY n,CHR$(сдвигасостояние)+CHR$(сканкод)
Замечания KEY ON и KEY OFF включают и выключают отображение функциональных
---------- клавиши в нижней части экрана.Заметьте ,что включение отображения
не оказывает действия на определения функциональных клавиш.KEY LIST на экран
текущие определения функциональных клавиш.Когда отображаются функциональные
клавиши ,25-ая строка никогда не прокручивается и попытка разместить в этой
строке курсор приводит к ошибке 5.
KEY n,строчное выражение посылает в строчное выражение функциональную кла-
вишу n,где строчное выражение имеет длину 15 литер или менее (в строке сос-
тояний появляются только первые 6),чтобы закрыть доступ к функциональной
клавише,назначайте ей нуль-строку.Возврат каретки в строке (CHR$(13)) отоб-
ражается как маленькая стрелка влево.
KEY n,CHR$(сдвигасостояние)+CHR$(сканкод) ассоциирует клавишу (или комби-
нацию клавиш с некоторым числом (n,от 15 до 20) для отслеживания клавиш с
помощью последующих операторов ON KEY и KEY (n) ON.Формат определяется сле-
дущим образом:
-сдвигасостояние-это целое выражение в диапазоне от 0 до 255
,которое управляет ответной реакцией на слежение за состоянием клавиш Ctrl
,Caps Lock,Num Lock,Alt и обеих Shift.
-сканкод-числовое выражение от 1 до 83 ,которым определяется
клавиша для отслеживания в соответствии с таблицей кодов сканирования из
приложения F.Заметьте,что клавиши 59-68,72,75,77 и 80 уже отслеживаются (это
функциональные клавиши и клавиши управления курсором),так что их определение
не оказывает действия.
Для построения значения сдвигасостояния пользуйтесь следущей таблицей:
----------------------------------------------------
Клавиша-модификатор Двоичное значение Гекс-значение
-131 -
----------------------------------------------------
Right Shift 0000 0001 01
Left Shift 0000 0010 02
Ctrl 0000 0100 04
Alt 0000 1000 08
Num Lock 0010 0000 20
Caps Lock 0100 0000 40
----------------------------------------------------
Предположим в качестве примера,что мы желаем отследить
"Shift-Escape";т.е. мыхотим иметь определенную подпрограмму дляполучения уп-
равления всякий раз ,когда клавиша Escape нажимается вместе с одной из кла-
виш Shift.Прежде всего мы должны построить маску сдвига -состояния.Вы хотите
распознавать обе клавиши Shift,поэтому должны сложить маски для обе-
их:01H+02H=03H.Далее вы можете проконсультироваться по таблице кодов скани-
рования приложения F и обнаружить ,чтo клавиша Escape имеет код сканирования
1.О вашем плане Турбо-Бейсику сообщает следущий оператор
KEY 15,CHR$(&03)+CHR$(1)
Вы обязаны использовать значение клавиши 15,поскольку первые 14 ранее оп-
ределены для представления функциональных клавиш и клавиш управления курсо-
ром.Теперь вы определяете подпрограмму отслеживания ,которая Будет вызывать-
ся при всяком нажатии Shift-Esc:
ON KEY(15) GOSUB ShiftEscape
где ShiftEscape-это метка в начале отслеживающей подпрограммы.Наконец,вы
включаете отслеживание для клавиши 15 с помощью оператора:
KEY(15) ON
См.также KEY(n)
ON KEY
Пример FOR N%=1 TO 10
READ A$
KEY N%,A$+CHR$(13)
NEXT N%
KEY LIST
KEY ON
WHILE NOT INSTAT
WEND
DATA Help,Enter,Edit,Change,Report,Print,Setup
DATA DOS Copy,Quit
END
Оператор KEY(n)
---------------
Функция KEY(n) включает или выключает отслеживание отдельной клавиши.
--------
Синтаксис KEY(n){ON!OFF!STOP}
----------
Замечания n-это отслеживаемая клавиша,целое выражение от 1 до 20 в соответ-
--------- ствии со следущей таблицей:
--------------------------------------------------
n Клавиша
--------------------------------------------------
1-10 Функциональные клавиши 1-10
11 Курсор вверх
12 Курсор влево
13 Курсор вправо
14 Курсор вниз
15-20 Клавиши,отслеживаемые оператором KEY
--------------------------------------------------
KEY(n) ON включает отслеживание клавиши n.Это означает,что между всеми опе-
раторами делается проверка с целью посмотреть,не была ли нажата клавиша n;и
-132 -
если это имело место ,исполнение программы отклоняется на подпрограмму,специ-
фицированную в операторе ON KEY для этой клавиши.
KEY(n) OFF запрещает отслеживание клавиши n.
KEY(n) STOP также запрещает отслеживание клавиши n ,но обеспечивает запоми-
нание случая нажатия данной клавиши 6так что,если далее используется оператор
KEY ON,захват в ловушку возникает немедленно.
См.также $EVENT
ON KEY
Пример: KEY ON
KEY 1,"Алло"+CHR$(13)
KEY 2,"Досвидания"+CHR$(13)
KEY 10,CHR$(13)
'НАСТРОИТЬ ОТСЛЕЖИВАНИЕ ДЛЯ F10
ON KEY(10) GOSUB Досвидания
'включить отображение F10
KEY(10) ON
INPUT "Нажать F1:";Пусто$
INPUT "Нажать F2:";Пусто$
Print "Теперь нажать F10..."
WHILE NOT INSTAT:WEND
END
Досвидания:
KEY(10) OFF
' теперь литерная строка назначенная для F10 будет воспроизво-
'диться
PRINT "Нажмите F10 для ухода из программы..."
RETURN
Оператор KILL
-------------
Функция KILL стираетфаил (подобно DOS-команде DEL)
--------
Синтаксис KILL файлспец
---------
Замечания Файлспец-это строчное выражение,представляющее файл или файлы,под-
--------- лежащие стиранию,которое может опционально включать в себя имя
прохода и/или свободно определяемой литеры.KILL аналогично DOS-команде DEL
(ERASE).
Подобно DEL,оператором KILL нельзя стирать справочник.Используйте вместо
него RMDIR после предварительного стирания всех файлов справочника.
Пример : ON ERROR GOTO ФайлаОшибка
INPUT "Ведите файл для стирания",Файлаимя$
IF Файлаимя$ <>" " THEN
KILL Файлаимя$
END IF
END
ФайлаОшибка:
PRINT "ошибка";
PRINT Ошб "произошла при стирании файла"
END
Функция LBOUND
--------------
Функция LBOUND возвращает наинизшую возможную границу (наименьший подстрочн
------- ый индекс для специфицированного размера массива.
Синтаксис LBOUND (массив[,размерность])
---------
-133 -
Замечания Массив -это имя массива ,подлежащего образмериванию.Размерность
--------- представляет целое от 1 до числа измерений массива .Вы можете оп-
ределять размер массива,используя LBOUND и UBOUND.Чтобы определить верхнюю
границу какой-то размерности массива,применяйте UBOUND.
Если вы не специфицируете диапазон подстрочных индексов(см.оператор
DIM), нижней границей по умолчанию является 0.Вы можете преодолевать нижнюю
границу по умолчанию,применяя оператор OPTION BASE.
См.также DIM
OPTION BASE
UNBOUND
Пример DIM Массив%(1900:2000,10:20)
PRINT "Нижняя граница массива по
размерности 2 есть";LBOUND(Массив%,2)
Функция LCASE$
--------------
Функция LCASE$ возвращает строку только в нижнем регистре.
-------
Синтаксис s$=LCASE$(строчное выражение)
---------
Замечания LCASE$ возвращает строку равную строчному выражению,за исключением
--------- того,что все буквы верхнего регистра строчного выражения будут
преобразованы в нижний регистр.
См.также UCASE$
Пример PRINT LCASE$("Для чего этот АРБУЗ?")
Функция LEFT$
-------------
Функция LEFT$ возвращает самые левые n литер строки.
-------
Синтаксис s$=LEFT$(строчное выражение)
---------
Замечания n- это целое выражение,которым специфицируется число литер строч-
--------- ного выражения,которые должны быть возвращены.n должно находится
в диапазоне от 0 до 32767.
LEFT$ возвращает строку ,содержащую n самых левых литер ее строчного выра-
жения.Если n больше или равно длине строчного выражения,возвращается все
строчное выражение.Если n=0 ,LEFT$ возвращает нуль-строку.
См.также MID$
RIGHT$
Пример PRINT LEFT$ ("Hello out there in the universal",5)
Функция LEN
-----------
Функция LEN возвращает длинну строки.
-------
Синтаксис y=LEN(строчное выражение)
---------
Замечания LEN возвращает значение от 0 до 32767,представляющее число литер
--------- в строчном выражении.Следует отметить ,что этот диапазон значи-
-134 -
тельно расширен по сравнению с максимальной длинной строки 255 литер в Интер-
претаторном Бейсике.
Пример INPUT USING "Длина строки =###";LEN(ПустаяСтр$)
END
Оператор LET
------------
Функция LET назначает значение переменной.
-------
Синтаксис [LET] переменная=выражение
----------
Замечания Переменная-это строчная или числовая переменная ,а выражение
--------- должно быть соответствующего типа (т.е. строчная для строчных пе-
ременных и числовая для числовых переменных.)
LET в операторах назначения проставляется опционально и практически обычно
опускается.
Пример INPUT "Ввести строку :",ПустаяСтр$
LET темпстр$=ПустаяСтр$
PRINT темпстр$,ПустаяСтр$
END
Оператор LINE
-------------
Функция LINE обеспечивает вычерчивание линии или опционально заполненной ра
------- мки.
Синтаксис LINE [(X1,Y1)]-(X2,Y2)[,[цвет[,B[F]][,образчик]]
---------
Замечания (X1,Y1) и (X2,Y2)-это координаты двух точек на графическом экране
--------- которые могут специфицироваться в абсолютной или относительной
форме .(Более подробно об абсолютных и относительных координатах см.главу
4).Цвет -это целое выражение ,описывающее цвет,в котором должнавычерчиваться
линия или рамка.Образчик-целая маска,управляющая тем,как вычерчивается линия
или рамка.
Чтобы вычертить линию до точки (x,y) от LPR в цвете по умолчанию,набирайте
LINE -(x,y)
Чтобы вычертить ту же линию в другом цвете ,набирайте
LINE -(x,y),2
Чтобы вычертить линию от точки (x1,y1) до (x2,y2)
LINE (x1,y1)-(x2,y2)
Чтобы вычертить рамку с верхним левым углом (x1,y1) и нижним в (x2,y2)
LINE (x1,y1)-(x2,y2),,B
Чтобы заполнить рамку атрибутом 2
LINE (x1,y1)-(x2,y2),2,BF
Чтобы вычартить несплошную линию ,включайте аргумент образчик.
--------
Точечная линия ,образчик &HAAAA(двоичное число 1010 1010 1010 1010)Необхо-
димо заметить ,что образчик не оказывает действия на заполняемые рамки.
LINE (x1,y1)-(x2,y2),,,маскированияслово
После оператора LINE ,LPR оказывается во второй из двух точек в операторе.
См.также FILL
Пример 'вычертить на экране диагональную линию
SCREEN 1,0
LINE (0,0)-(319,199)
'вычертить горизонтальную пунктирную линию
LINE (0,100)-(319,100),,,&HCCCC
'вычертить 50-пиксельный квадрат ,заполненный цветом 2,с вер-
-135 -
'хним левым углом в (10,20)
LINE (10,20)-(60,70),2,BF
'поиграйте в соединение точек
READ X,Y
PSET (X,Y)
FOR N=1 TO 11
READ X,Y
LINE -(X,Y)
NEXT N
LOCATE 9.9
PRINT "ORLAND"
END
DATA 10,20,50,20,55,25,55,40,50,45,10,45
DATA 50,45,55,50,55,65,50,70,10,10,10,20
Оператор LINE INPUT
-------------------
Функция LINE INPUT считывает строку с клавиатуры в строчную переменную,игнор
------- ируя разделители.
Синтаксис LINE INPUT [;][строка-подсказка;]строчная переменная
---------
Замечания Строка-подсказка -это опциональная строчная подсказка подлежащая
--------- посылке на экран перед ожиданием вашего ответа. Строчная переменная
это переменная ,которая будет загружаться данными ,которые вы вводите на
клавиатуре .Используйте LINE INPUT вместо INPUT ,когда вы намереваетесь вво-
дить строчную информацию,которая содержит разделители(например запятые),кото-
рые иначе создали бы путаницу в операторе INPUT.Например:
INPUT "Введите адрес пациента:";a$
будет давать сбой ,если адрес содержит запятую
LINE INPUT принимает запятые без проблем.
Если за оператором LINE INPUT следует точка с запятой,то когда нажимается
Enter в конце вводимой строки ,на дисплей не посылается возврат каретки(т.е7
курсор остается в той же строке).
Пример PRINT "Ведите несколько полей ввода в которых вы не нуждаетесь"
LINE INPUT "позаботтесь об их разделении";ПустаяСтр$
print ПустаяСтр$
END
Оператор LINE INPUT#
--------------------
Функция LINE INPUT# считывает строку из последовательного файла в строчную
------- переменную ,игнорируя разделители.
Синтаксис LINE INPUT#файланом,строчная переменная
---------
Замечания ФайлаНом-это номер файла для считывания,а строчная переменная-
--------- это строчная переменная, в которую осуществляется загрузка.
LINE INPUT# подобна LINE INPUT за тем исключением ,что данные считываются
не с клавиатуры а из последовательного файла.Из файла считывается текущая за-
пись,которая загружается в строчную переменную.Так же как LINE INPUT ,исполь-
зуйте LINE INPUT# для собирания данних которые имеют разделительные лите-
ры(запятые)вперемежку с данными.
Если данные файла были записаны с помощью оператора WRITE#,они уже правиль-
но разделены и лучшим способом их считывания является оператор INPUT#
Пример SUB СделатьФайл
OPEN "LINEINP#.DTA" FOR OUTPUT AS #1
СтрочнаяПеременная$="Не спокойно в Ривер-Сити"
-136 -
Целое%=1000
Плавающаяточка!=30000.1234
PRINT #1,Строчнаяпеременная$,Целое%,Плавающаяточка!
CLOSE #1
END SUB
SUB Читатьфайл
'открывается последовательный файл для ввода
'используются LINE INPUT# и INPUT$ для считывания
'из файла строк различных типов данных
OPEN "LINEINP#.DTA" FOR INPUT AS #1
СтрочнаяПеременная=""
LINE INPUT#1,СтрочнаяПеременная$
PRINT СтрочнаяПеременная$
CLOSE #1
END SUB
CALL СделатьФайл
CALL Читатьфайл
END
Функция LOC
-----------
Функция LOC возвращает текущую позицию в файле.
-------
Синтаксис y=LOC(файланом)
---------
Замечания Файланом-это значение ,под которым был открыт файл.Поведение LOC
--------- зависит от режима ,в котором был открыт файл.
Если файланом-это файл произвольного доступа ,то LOC возвращает номер пос-
ледней записанной или считанной записи.
Если файланом-это файл последовательного доступа ,то LOC возвращает число
128 байтовых блоков,записанных или считанных с момента открытия файла.Как
обычно ,LOC возвращает один блок для файлов ,которые уже открыты,но еще не
записывались и не считывались.
Если файланом-это двоичный файл,LOC возвращает SEEK-файловую позицию.
Для коммуникационных файлов LOC возвращае число литер в буфере ввода.
Пример OPEN "LOC.DTA" FOR BINARY AS #1
PUT$ #1 "ТурбоБейсик"
PRINT LOC(1)
CLOSE
END
Оператор LOCAL
--------------
Функция LOCAL определяет локальные переменные в процедуре или функции.
--------
Синтаксис LOCAL список переменных
---------
Замечания Оператор LOCAL законен только в определениях процедур и функций и
--------- должен появляться для любых исполнительных операторов в ассоции-
руемом с ними определении .LOCAL определяет одну или более переменных как "ло-
кальные" в рамках процедуры или функции.Локальная переменная может иметь то же
имя,что и другие переменные в других частях программы,а также имя ,одинаковое
с другими локольными переменными в определении других процедур или функций
без какого-то бы ни было их отрицательного взаимовлияния;они являются отдель-
ными переменными.
Чтобы заявить локальный массив ,включайте в заявлении его идентификатор и
-137 -
пустой комплект скобок в список переменных,а затем в следущем DIM операторе
образмеривайте массив.Локальные переменные размещаются в стеке и возбуждаются
в ноль(для строчных переменных используется нуль-строка) прикаждом вызове
включающей их в себя процедуры или функции.Незаявленным переменным процедур
по умолчанию дается статический атрибут,тем неменее мы рекомендуем явно опре-
делять каждую переменную.
См.также DIM
SHARED
STATIC
Пример SUB Локальные
LOCAL a(),i%
DIM DYNAMIC a(10:20)
FOR i%=10 to 20
a(i%)=i%
NEXT i%
END SUB
Заявление LOCATE
Функция LOCATE позиционирует курсор и/или определяет форму курсора.
----------
Синтаксис LOCATE [ред] [,[колонка] [,[курсор][,пуск][,останов]]]
----------
Замечания Ряд - это целое выражение, определяющеестроку экрана, в ко-
--------- торой должен позиционироваться курсор (1-25). Колонка специ-
фицирует колонку (1-80). Курсор - числовое значение, которое управля-
ет тем, будет или нет курсор видимым(0-означает невидимый;1-видимый). 25-ая
строка недоступна, если не выведено из активного состояния отображение фун-
кциональных клавиш (см.о заявлении KEY OFF).
Пуск и останов - это целые выражение, которые управляют размером кур-
сора и представляют сколь много строк сканирования будет занимать кур-
сор.Верхней строкой сканирования является строка 0; нижней - строка 7 для
цветных/графических Адаптеров и строка 13 для монохромных адаптеров.
LOCATE наиболее часто используется перед заявлением PRINT для управле-
ния прохождением вывода на экран.
См. также KEY OFF
-----------
Пример CLS
-------
CRSLIN и POS
INPUT "Ввести координаты X и Y:", X%, Y%
'позиционировать курсор и изменить его форму
LOCATE X%,Y%,1,4,5
PRINT "Hi";
WHILE NOT INSTAT: WEND "ждать клавишу
END ' конец программы
Функция LOF возвращает длину файла.
--------
Синтаксис y =LOF(файланом)
-----------
Замечания файланом - это номер, под которым был открыт файл.
-----------
LOF возвращает длину указанного файла в байтах.Для комму-
никационных файлов LOF возвращаетт размер наличного пространства в коммуни-
кационном буфере.
Пример OPEN"TB.EXE" FOR BINARY AS#1
--------
PRINT "Размер турбо-Бейсика равен";LOF(1)
CLOSE #1
END
Функция LOG,LOG2 и LOG10
-----------------------------
Функция LOG возвращает натуральный (с основанием е) логарифм;LOG2 воз-
вращает логарифм основания 2; LOG10 - логарифм основания 10.
Синтаксис LOG:
-----------
y=LOG (числовое выражение)
LOG2:
y=LOG2(числовое выражение)
LOG10:
y=LOG10(числовое выражение)
Замечания LOG возвращает натуральный логарифм (с основанием е, где
е=2,718282..... )своего аргумента.Если числовое выражение меньше или равно
0, это дает ошибку 5 пер. прогона, вызов незаконной функции. Натуральный
-139 -
логарифм x есть показатель степени, в которую должно быть возведено основа-
ние е для получения значения x.
LOG,LOG2 и LOG10 возвращают результат двойной точности.
Пример FOR I!=1 TO 50 STEP 2.5
-------- PRINT USING "Натуральный логарифм ##=## : I!, LOG(I!)
NEXT I!
END 'конец программы
Функция LPOS
-------------
Функция LPOS возвращает "курсорную позицию" буфера печатающего устрой-
ства.
Синтаксис y=LPOS (печатающее устройство)
-----------
Замечание
---------
Печатающее устройство - это целое выражение от 0 до 3, обес-
печивающее выбор печатающего устройства из следующего списка:
0,1 LPT1
2 LPT2
3 LPT3
LPOS сообщает сколько литер уже послано на печатающее устроцство с мо-
мента вывода последней литеры возврата каретки.
См.также POS
Пример 'назначить ширину печатающего устройства
-------- 'для именованных констант
%Шир = 80
'отобразить литеры ASCII и расширенного ASCII
'на экране и печатающем устройстве.
FOR I%=0 TO 255
IF (I%>32) THEN
PRINT USING "1"; CHRS(I%);
END IF
' передвинуться на следующую строку, если имеет место выход за
отведенное пространство IF LPOS(0)=%Шир THEN
LPRINT CHRS(13)+CHRS(10)
END IF
NEXT I%
END конец программы
Заявления LPRINT,LPRINT USING
---------------------------------
Функция LPRINT и LPRINT USING посылает данные на печатающее устройство
(LPT1:).
Синтаксис LPRINT [список выражений [;] ]
----------- LPRINT USING формат строка; список выражений
Замечания Список выражений - это ряд числовых и/или строчных выраже-
ний разделяемых запятыми либо точкой с запятой.Формат-строка содержит ин-
формацию о формате печати.
LPRINT и LPRINT USING выполняют те-же действия что PRINT и PRINT
USING, за исключением того, что список выражений посылается на печатающее
устройство, а не на экран.
Примечание: По умолчанию Турбо-Бэйсик вставляет пару возврат карет-
ки/подача строки после распечатки в одной строке 80 литер.
Эта характеристика может быть изменена с помощью заявления WIDTH(ширина)
См.также LPOS
PRINT USING
WIDTH
-140 -
Пример LPRINT USING"## -это мое счастливое число"; 7
--------
END
Заявление LSET
-----------------
Функция LSET перемещает срочные данные в буфер произвольного файла.
--------
Синтакси LSET переменная поля = строчное выражение
----------
Замечания LSET и родственное ему заявление RSET перемещают строчную ин-
формацию в переменные поля, определяемые как принадлежащие буферу произ-
вольного файла.
Если длина строчного выражения меньше размера переменной поля, специ-
фицированной в заявлении FIELD, LSET выравнивает его в левую сторону этого
поля, заполняя оставшуюся часть пробелами.
Это означает, что пробелы добавляются после последней литеры строчного
выражения, так что послеLSET- назначения LEN (переменной поля) становится
равной ширине, определенной в соответствующем заявлении FIELD.
RSET осуществляет выравнивание с помощью пробелов вправо ( пробелы до-
бавляются перед первой литерой строчного выражения).
LSET и RSET могут также использоваться для форматообразования вывода
на экран или печатающее устройство.
а $=$ (20)
RSET a$="Правое выравнивание"
PRINT a$
См. также FIELD
LEN
RSET
Пример OPEN "LSET.DTA" AS#1 LEN=18
--------
Определить имена и размеры полей файла FIELD1,2 AS Файл цел $, 4ASФайл
Длин $, - 4AS Файл Един $, & AS Файл Двойн $
'назначить переменные полей и осуществить запись в файл произвольного
доступа FOR Счетчик% =1 TO S
LSET Файл Цел $=MX1$ (счетчик %)
LSET Файлдлин$=MXL $(счетчик %^2)
LSET Файлtlby$=MXS $(счетчик %^2.1)
lset ФайлДвойн$=MXD $ (счетчик %^4.4)
PUT 1,счетчик %
NEXT счетчик %
CLOSE 1 'закрыт файл
END 'конец главной программы
Заявление MEMSET заявляет верхнее ограничение памяти
----------
Синтаксис MEMSET адрес
----------
Замечание Адрес - это длинное целое выражение, определяющее абсолютный
адрес верхней границы памяти Турбо-Бейсика.Адрес должен быть меньше коли-
чества памяти, установленной в системе.Практически адрес обычно вычисляется
путем вычитания некоторой константы из значения, возвращаемого функцией
ENDMEN.
MEMSET сконструировано для установки отдельной памяти для подпрограммы
на языке ассемблера. Если Турбо-Бейсик не в состоянии удолетворить запрос в
силу либо неподходящего аргумента, либо недостаточности памяти, возникает
ошибка 7 периода прогона, вне памяти.
См. также ENDMEN
Пример PRINT FRE (-1) 'отобразить наличное пространство для массивoв
-141 -
--------
'хранить 128 байтов в верхней части памяти
MEMSET ENDMEN - &H80
PRINT FRE (-1) 'отобразить наличную память
END 'конец программы
Заявление MID$
--------------
Функция MID$ возвращает литерную строку.
------------
Синтаксис S$=MID$ (строчное выражение, n[,m] )
----------
Замечания n и m - это числовые переменные или выражения, которые могут
лежать в диапазоне от 1 до 32767 и от щ до 32767 соответственно.
MID$ как функция, возвращает m-литерную строку, начиная с n-ой литеры
строчного выражения. Если m опускается или справа от n-ой литеры строчного
выражения менее m литер, выдаются остальные литеры строчного выражения
вплоть до n-ой и включая ее.Если n больше длины строчного выражения ,MID$
возвращает нуль-строку.
См. также LEFT$
Заявление MID$
RIGHT$
Пример INPUT 'Ввести строку:", Пустая стр$
-------- Врем.Стр$ = Пустая Стр$
PRINT Пустая Стр $
'резервировать порядок литер, используя функцию и заявление
MID$ одновременно.
FOR I% = 1 TO LEN (Пустая стр%)
MIDS (Пустая Стр %, I%,1) = MIDS (Врем Стр $,- (LEN (ВремСтр
$)- I%) + 1,1)
NEXT I%
PRINT Пустая Стр%
END 'конец программы
Заявление MID$
-----------------
Функция MIDS замена литеры строки
------------
Синтаксис MID$ (строчнаая переменная, n[,m] )= строка-замена
---------------
Замечание n и m - это числовые переменные или выражения, которые могут
находиться в диапазоне от 1 до 32767 и от 0 до 32767,соответственно.
Как заявление, MID$ заменяет m литер строчной переменной, начиная с
литерной позиции n, сожержимым строки-замены.
Если m включается, оно определяет сколько литер строки-замены вставля-
ется в строчную переменную. Если опускается, используется вся строка-заме-
на.MID$ никогда не изменяет длину строки.
См. также LEFT$
Функция MID$
RIGHT$
Пример 'MID$, заявление
в $ = "Ураган Камилла"
MID$ (в $,8) = "Карла--" 'опущен опциональный параметр m
PRINT в $
Заявление MKDIR
-----------------
Функция MKDIR создает субсправочник (подобно DOS-команде MKDIR)
Синтаксис MKDIR проход
--------
-142 -
Замечания Проход - это строчное выражение, описывающий подлежащий соз-
---------- данию справочник (см. информацию об именах и проходах файло
в в главе 4)
MKDIR (делать справочник) создает субсправочник, специфици-
руемый проходом.Если вы пытаетесь создать справочник, который уже существу-
ет, возникает ошибка 5 периода прогона, вызов незаконной функции.
Пример 'построить обработчик ошибок
ON ERROR GOTO Спр ошибка
PRINT "Пожалуйста введите справочник который вам нравится";
INPUT "Создать:", Спр Имя $
MKDIR Спр Имя $ 'создать справочник
END 'конец программы
СпрОщибка:
------------- PRINT "Возникла проблема в создании справочника"
END
Функции MKI$, MKL$, MKS$, MKD$
-------------------------------
Функция MKI$,MKL$,MKS$,MKD$ преобразуют числовые данные в строки (для
вывода в произвольные файлы)
Синтаксис S$=MKI$ (целое выражение)
---------
S$=MKL$ (длинное целое выражение)
S$=MKS$ (выражение единичной точности)
S$=MKD$ (выражение двойной точности)
Замечания Функция MK (делать) представляет собой часть процесса обра-
ботки получения числовых значений в файлы произвольного доступа.Поскольку
заявления, которые записывают информацию в буфер произвольного файла(LSET и
RSET) работают только со строками, числовые данные должны транслировать-
ся,перед их обработкой заявлением PUT в произвольный файл, в строчную фор-
му.MKI$(i) возвращает двухлитерную строку, состоящую из двух битовых значе-
ний, которые Турбо-Бейсик использует для внутреннего представления целого
значения i. Функция MKL$ возвращает 4-байтовый строчный эквивалент длинного
целого. MKS$ возвращает 4-байтовый эквивалент значения единичной точнос-
ти.MKD$ возвращает 8-байтовый строчный эквивалент значения двойной точнос-
ти. Дополнительные функции CVI, CVL, CVD используются, когда произвольные
файлы считываются. Не путайте эти функции с STR$ и VAL , которые соответст-
венно обращают числовые выражения в распечатываемые формы и наоборот:
i=123.45
a$=STR$(i): в$=MKS$(i)
'a$ содержит что-то, стоящее размещения на экране; в $ не содержит
PRINT a$, в$
См. также СVD
--------- CVI
CVL
CVS
Пример OPEN "MKILSD.DTA" AS#1 LEN=18
------- 'определить имена и размеры полей
FIELD 1, 2AS файла цел$, 4AS файла длин$, 4AS файла един$, 8AS
файла двойн$
'назначить значения полям и осуществить запись в файл произволь-
ного доступа
FOR счетчик% = 1TOS
LSET Файла Цел$= MKI$ (счетчик%)
LSET Файла Длин$= MKL$ (счетчик %^2)
LSET Файла Един$=MKS$ (счетчик %^2.1)
LSET Файла Един$=MKD$ (счетчик %^4.4)
PUT 1, счетчик %
NEXT счетчик %
CLOSE 1 'закрыть файл
END 'конец главной программы
-143 -
Функции MKMD$,MKMS$
--------------------
функция MKMD$ и MKMS$ преобразуют числовые данные в строки формата
Микрософт
Синтаксис S$=MKMS$ (выражение единичной точности)
---------- S$\MKMD$ (выражение двойной точности)
Замечания Функции MKM ( делать Микрософт) предусмотрены лишь для сов-
---------- местимости с существующими произвольными файлами, которые
содержат значения с плавающей точкой в формате Микрософт.
MKMS$ создает 4-байтовую строку формата Микрософт из значения единич-
ной точности; MKMD$ делает 8-байтовую Микрософт-форматную строку из задан-
ного значения двойной точности.
См.также CVMD
--------- CVMS
Пример
-------- 'открыть файл произвольного доступа
OPEN "CVMD.DTA" AS#1 LEN=12
FIELD#1, 4AS Единич.$, & AS Двойная $
МаксЦелое% =32767
FOR I%=1 TO 5 'записать данные в файл
LSET ДвойнаяS = MKMD$ (I%+МаксЦелое %)
PUT#1, I%
NEXT I%
FOR I% = 1TO 5 'читать данные из файла
GET#1, I% 'отобразить на экране
PRINT CVMS (Единичная$), CVMD (Двойная $)
NEXT I%
CLOSE#1 'закрыть файл
END 'конец программы
Функция и заявление MTIMER
------------------------------
Функция MTIMER считывает или повторно устанавливает микротаймер.
Синтаксис
---------- Функция:
y=MTIMER
Заявление
MTIMER
Замечания
---------- MTIMER сконструированы для измерения истекшего времени, гл
авным образом для очень коротких операций. Это дает значительное улучшение
разрешающей способности; однако точность резко падает по истечение 54 мил-
лисекунд.
Как функция MTIMER возвращает число микросекунд, истекших с момента
самого последнего заявления MTIMER. Точность MTIMER лежит в пределах при-
мерно двух микросекунд. Как заявление MTIMER повторно устанавливает микро-
таймер в ноль.
Ограничения Заявление и функция MTIMER используются в паре. Вы должны
выдать заявление MTIMER, а затем вызвать функцию для получения результата.
Последующие ссылки на зту функцию будут давать значение ноль, если вы вновь
не запустили микротаймер с помощью заявления MTIMER.
MTIMER и SOUND/PLAY используют канал 2 таймерного типа 8255 и яиляются
взаимоисключающими. Поэтому исполнения заявленной SOUND или PLAY между за-
-144 -
явлениями и функцией MTIMER вынудит повторную установку микротаймера на
ноль истекшего времени.
Пример
-------- 'возбудить таймер
MTIMER
PI#=ATN(1) * 4 'вычислить "пи"
'получить значение таймера
Истекшее Время % = MTIMER
PRINT USING "Израсходовано #### миллисекунд";
PRINT "на расчет значения "пи" "
END 'конец программы
Заявление NAME
----------------
Функция NAME
------------ Обеспечивает переименование файла (подобно DOS-функции
REN)
Синтаксис NAME файласпец1AS файласпец2
----------
Замечания Файласпец1 и файласпец2 - это строчные выражения, удолет-
---------- воряющие DOS-соглащениям об наименовании проходов и файлов.
Операция NAME обеспечивает передачу данных, представляющих файлспец1, файлу с
именем файлспец2. Так как файлспец2 может содержать имя прохода, существует
возможность перемещения данных из одного справочника в другой, но до тех
пор, пока вы не пытаетесь осуществить перенаименование с одного диска на
другой.
Пример
------- INPUT "Введите имя файла для перенаименования:",
Старое имя $
INPUT "Введите новое имя файла:", Новое имя $
выдаются старое имя $, Новое имя $
NAME Старое имя $ AS Новое имя $
END ' конец программы
Функция OCT$
-------------
Функция OCT$ возвращает строку , представляющую восьмеричную (с ос-
------------ нованием 8) форму числового выражения.
Синтаксис S$=OCT$ (числовое выражение)
----------
Замечания Числовое выражение находится в диапазоне от -32768 до 65535.
---------- OCT$ возвращает строку, представляющую восьмеричную форму
своего целого аргумента. Если числовое выражение имеет дробную часть, перед
преобразованием оно округляется. Для преобразования значений в шестнадцати-
ричные или двоичные строки применяйте функции HEX$ и BIN$, соответственно.
См.также BIN$
--------- HEX$
Пример PRINT OCT$(-1)
------- PRINT OCT$(65535)
-145 -
Заявление ON COM(n)
--------------------
Функция ON COM(n) заявляет подпрограмму отслеживания событий на
------------------- последовательном входном устройстве.
Синтаксис ON COM(n) GOSUB метка
----------
Замечания n-это номер (1 или 2) коммуникационного адаптера ( пос-
---------- ледовательного входного устройства), подлежащего считыванию
Метка идентифицирует подпрограмму отслеживания. Если метка есть номер О
особой строки, отслеживание запрещается.
Заявление ON COM(n) не оказывает действия до тех пор, пока коммуника-
ционные события не оказываются доступными данному последовательному входно-
му устройству, что обеспечивается подходящим заявлением COM ON. Если заяв-
ление COM ON однажды уже исполнено, проверка имеет место между исполнениями
каждого следующего заявления с целью установить, не поступила ли какая-либо
литера на специфицированное последовательное входное устройство. Если это
произошло, выполняется GOSUB к назначенной подпрограмме.
См. также Приложение В,"Отслеживание событий"
---------
Заявление ON ERROR
--------------------
Функция ON ERROR специфицирует стандартную программу обработки ошибок
------------------ и включает отслеживание ошибок.
Синтаксис ON ERROR GOTO метка
------------
Замечания Метка идентифицирует первую строку подпрограммы отслежива-
--------- ния ошибок. Однажды включенная обработка ошибок с помощью
этого заявления обеспечивает переход к вашему коду обработки ошибок при
возникновении любых ошибок периода прогона вместо обычного отображения со-
общения об ошибке и прекращения исполнения. Для продолжения исполнения ис-
пользуйте заявление RESUME (возобновить).
Чтобы запретить отслеживание ошибок используйте ON ERROR GOTO O. Вы
можете воспользоваться этим приемом если возникает ошибка, для которой у
вас нет определенного прохода на восстановление ; вы также можете остано-
вить свой выбор на отображении в этот момент содержимого ERL (строка пос-
ледней ошибки)
Если вы прогоняете EXE-программу из DOS с выключенным отслеживанием
ошибок, любая ошибка периода прогона вызывает выдачу сообщения о ее возник-
новении и прекращение исполнения программы. Сообщение имеет форму:
EROR ошибкином at pgm-ctr = адрес
(ошибка) (при программном счетчике)
Если программа запущена в рамках Турбо-Бейсика и происходит ошибка, вы
переводитесь в редактор на местоположение ошибки . В строке состояний будет
содержаться краткое описание ошибки периода прогона:
ERROR ошибкином : сообщение об ошибках
(ошибка)
См. также ERADR
---------- ERL
ERR
ERROR
RESUME
Пример 'настроить обработчик ошибок
-------- ON ERROR GOTO ошибок обработчик
WHILE I 'этот цикл оканчивается ошибкой
-146 -
I =10/0 'это вызывает ошибку периода прогона
WEND
Ошибок обработчик
------------------
PRINT "Обработчик захватил ошибку периода прогона"
PRINT ERR, "в строке" ERL
END
Заявление ON/GOSUB
-------------------
Функция ON/GOSUB вызывает одну из нескольких возможных подпрограмм
---------------- в соответствии со значением числового выражения.
Синтаксис ON n GOSUB метка [,метка]....
----------
Замечания n - это числовое выражение в диапазоне от 0 до 255, а метка
---------- идентифицирует заявление на ветвление к ней. n определяет к
какой из меток осуществляется переход (например если n=4, получает управле-
ние четвертая метка в списке). Если n равно 0 или больше, чем число меток в
списке, Турбо-Бейсик продолжает исполнение следующего по порядку заявления.
Каждая подпрограмма должна оканчиваться ключевым словом RETURN для
обеспечения возобнавления с того заявления, которое следует непосредственно
за заявлением ON/GOSUB.
Многопутевое ветвление может также реализоваться с помощью заявлений
SELECT и IF-блоковое, причем они более гибкие, чем ON/GOSUB.
Пример FOR I% = 1 TO 3
------ ON I% GOSUB обработчик один, обработчик два, обработчик три
NEXT I%
END 'конец главной программы
Обработчик один
----------------
PRINT "Обработчик номер" , I%
RETURN
Обработчик два
----------------
PRINT "Обработчик номер", I%
RETURN
Обработчик три
---------------
PRINT "Обработчик номер", I%
RETURN
Заявление ON/GOTO
------------------
Функция ON/ GOTO направляет программный поток по одному из нескольких
возможных мест назначения на основе значения числового выражения.
Синтаксис ON n GOTO метка [,метка]....
----------
Замечания n - это числовое выражение в диапазоне от 0 до 255, а метка
идентифицирует заявление программы на ветвление к ней.
n определяет к какой из меток осуществляется переход (например, если
n=4 то управление получает четвертая метка в списке).
Если n равно нулю или больше числа меток в списке , Турбо-Бейсик про-
должает исполнение следующего по порядку заявления.
-147 -
С большей гибкостью многопутевое ветвление может быть реализовано с
помощью заявлений SELECT и IF-блоковое.
Пример FOR I% =1 TO3
------- ON I% GOTO обработчик один,обработчик два, обработчик три
Обратно:
NEXT I%
END 'конец главной программы
Обработчик один
----------------
PRINT "Обработчик номер", I%
GOTO обратно:
Обработчик два
---------------
PRINT "Обработчик номер"
GOTO Обратно:
Обработчик три
----------------
PRINT "Обработчик номер", I%
GOTO Обратно
Заявление ON KEY (n)
---------------------
Функция ON KEY (n) заявляет подпрограмму отслеживания с целью получе-
------------------- ния его управления , если нажимается особая клавиша.
Синтаксис ON KEY (n) GJSUB метка
----------
Замечания Метка идентифицирует первое значение подпрограммы отслежива-
ния, а n - это целое выражение в диапазоне от 1 до 20, которым описывается
подлежащая отслеживанию клавиша в соответствии со следующей таблицей.
---------------------------------------------------------------
n Клавиша
---------------------------------------------------------------
1-10 Функциональные клавиши F1-F10
11 Курсор вверх
12 Курсор влево
13 Курсор вправо
14 Курсор вниз
15-25 Клавиши, определяемые заявлением KEY
30 Функциональная клавиша F11
31 Функциональная клавиша F12
-----------------------------------------------------------------
Заявление ON KEY не имеют действия до тех пор, пока клавишные события
не разрешаются заявлением KEY ON. Если заявление KEY ON однажды уже испол-
нено, Турбо-Бейсик осуществляет проверку между исполнениями каждого после-
дующего заявления с целью установить, имело ли место нажатие специфициро-
ванной клавиши. Если это произошло, Турбо-Бейсик выполняет GOSUB к назна-
ченной подпрограмме.
Проверка клавиши n выключается заявлением KEY(n) OFF. Используйте за-
явление KEY для определения отслеживания клавиши, которая не является функ-
циональной или клавишей управления курсором.
Для высококачественного управления генерированием Турбо-Бейсиком кода
проверки событий пользуйтесь метазаявлением $EVENT.
См. также $EVENT
---------- KEY (n)
-148 -
Пример 'Эта программа демонстрирует заявление KEY(n)
------- 'включить проверку клавиш
KEY ON
'назначить строки для клавищ
KEY 1, "Алло" + CHR$(13)
KEY 2, "Досвидание" + CHR$(13)
KEY 10, CHR$ (13)
' в дополнении к назначенной для этого строке
'построить отслеживание клавиши для F10
ON KEY(10) GOSUB Досвидание
'включить отслеживаниеF10
KEY(10) ON
'получить пользовательский ввод
INPUT "Нажмите F1:";Пусто$
INPUT "Нажмите F2:";Пусто$
PRINT "Теперь нажмите F10...."
' когда пользователь нажимает теперь F10 ,будет вызываться
подпрограмма Досвидание
WHILE NOT INSTAT:WEND 'ждать клавишу F10
END 'конец программы
Досвидание:
KEY LIST 'перечислить определенные в данный момент клавиши.
KEY(10) OFF 'выключить отслеживание
'теперь когда пользователь нажимает F10, будет
воспроизводиться литерная строка, назначенная клавише
PRINT "Нажмите теперь F10 для того, чтобы покинуть прог-
рамму ......"
RETURN
Заявление ON PEN
----------------
Функция ON PEN заявляет подпрограмму отслеживания с целью получения
---------------- его управления если задействуется световое перо
Синтаксис ON PEN GOSUB метка
----------
Замечания Метка идентифицирует новое заявление подпрограммы обработки
световогого пера. Заявление ON PEN не имеет действия до тех пор, по-
ка события светового пера не разрешаются заявлением PEN ON. Если заявление
PEN ON уже исполнено, осуществляется проверка между всеми последующими за-
явлениями с целью проверки, было ли задействовано световое перо. Если это
так, вызывается назначенная подпрограммая.
Проверка светового пера выключается заявлением PEN OFF. После захвата
светового пера, с целью удержать от повторного вызова подпрограммы отслежи-
вания из нее самой ( и переполнение стека), используется неявное заявление
PEN STOP . При закрытии подпрограммы обработки посредством RETURN автома
тически выполняется PEN ON , если стандартная подпрограмма не исполняет яв-
ное заявление PENN OFF.
Для более качественного управления генерированием Турбо-Бейсиком кода
проверки событий пользуйтесь метазаявлением $EVENT
См. также $EVENT
--------- PEN
Пример ON PEN GOSUB ПераОбработчик 'установить обработчик событий
-------
PEN ON 'включить отслеживание событий
PRINT "Нажмите для останова любую клавишу..."
WHILE NOT INSTAT
WEND
END 'конец программы
ПераОбработчик
-149 -
---------------
FOR I% = 1TO 9
PRINT PEN (I%)
NEXT 1
RETURN
Заявление ON PLAY
-----------------
Функция ON PLAY заявляет подпрограмму отслеживания с целью получения
---------------- его управления , если буфер фоновой музыки содержит
менее специфицированного числа нот.
Синтаксис ON PLAY (нотсчетчик) GOSUB метка.
----------
Замечания Нотсчетчик - это целое выражение , а метка идентифицирует
---------- первое заявление в подпрограмме музыкального сопровождения.
Заявление ON PLAY не имеет действия до тех пор, пока проверка нот не
разрешается заявлением PLAY ON. Если PLAY ON уже исполнено, Турбо-Бейсик
осуществляет проверку между исполнениями каждого последующего заявления с
целью проверить не меньше ли осталось нот в музыкальном буфере, чем значе-
ние нотсчетчика. Если это так, Турбо-Бейсик выполняет GOSUB к назначенной
подпрограмме.
Проверка музыкального буфера выключается заявлением PLAY OFF. После
музыкальной ловушки исполняется неявное заявление PLAY STOP с целью удер-
жать вызов подпрограммы отслеживания повторно из нее самой (и заполнения
стека). При закрытии подпрограммы обработки посредством RETURN автоматичес-
ки выполняется заявление PLAY ON, если ранее в подпрограмме не было испол-
нено явное заявление PLAY OFF.
Событие PLAY не отслеживается, если при исполнении PlAY ON буфер уже
пуст. Для управления генерированием кода проверки событий пользуйтесь мета-
заявлением $EVENT. Для установки размера буфера фоновой музыки пользуйтесь
метазаявлением $SOUND.
См.также $EVENT
-------- PLAY(заявление)
$SOUND
Пример Эта программа демонстрирует ON PLAY (n)
------- 'разместить 30 байтов пространства звукового буфера
$SOUND 100
'включите проверку звуковых событий
PLAY ON
настройке проверку буфера музыкального сопровождения
ON PLAY (S)GOSUB наполнить игры буфер
НотыS = "GEAFDCFECFEDGGG "
'играть октавы со 2 по 4
Игры СтрS ="MB"
FOR октава % =2 TO 4
Октава S ="0" + STR$(октава%)
Игры СтрS = ИгрыСтрS + ОктаваS + НотыS
NEXT Октава %
PLAY Игры СтрS
DO
LOOP UNTIL INSTAT
CLEAR
END 'конец программы
Наполнить игры буфер
---------------------
PRINT Игры СтрS
PLAY Игры cтрS
RETURN
-150 -
Заявление ON STRIG
-------------------
Функция ON STRIG заявляет подпрограмму отслеживания кнопки управления.
------------------
Синтаксис ON STRIG (n) GOSUB метка
---------
Замечания Метка идентифицирует первое заявление подпрограммы обработки
--------- "нажатой кнопки", а n - это целое выражение, указывающее
подлежащую отслеживанию кнопку в соответствии со следующей таблицей:
---------------------------------------------------------------
n Кнопка
---------------------------------------------------------------
0 Кнопка 1, ручка управления А
2 Кнопка 1, ручка управления В
4 Кнопка 2, ручка управления А
6 Кнопка 2, ручка управления В
----------------------------------------------------------------
Заявление ON STRIG не имеет действия до тех пор, пока события на кноп-
ках управления не разрешаются с помощью заявления STRIG ON. Если STRIG ON
уже выполнено, проверка осуществляется между исполнениями всех последующих
заявлений с целью проверить, не была ли нажата указанная кнопка. Если это
так, вызывается назначенная подпрограмма.
Для выключения проверки указанной кнопки управления используется заяв-
ление STRIG OFF.
После захвата события исполняется заявление STRIG STOP c целью пре
дотвратить повторный вызов подпрограммы отслеживания из нее самой (и запол-
нение стека). Закрытие подпрограммы обработки с помощью RETURN вызывает ав-
томатическое исполнения заявления STRIG ON, если ранее подпрограммой уже не
исполнено явное заявление STRIG OFF. Для качественного генерирования кода
проверки событий используйте метазаявление $EVENT.
См. также $EVENT
--------- STRING (n)
Пример Ноль X =1
-------- Ноль Y =1
Один Z
Два Y =1
ЧетыреХ=3
Четыре Y=1
ШестьХ=Y
ШестьY=1
'настроить обработчики событий
ON STRIG (0) GOSUB переключить ноль
ON STRIG (2) GOSUB переключить два
ON STRIG (4) GOSUB переключить четыре
ON STRIG (6) GOSUB переключить шесть
'включить проверку событий
STRIG (0) ON
STRIG (2) ON
STRIG (4) ON
STRIG (6) ON
'пока кнопка не нажимается , отображать текущие координа-
ты ручек управления
WHILE NOT INSTAT
LOGATE 15,15,0
PRINT STICK (0), STICK (1);
WEND
END 'конец программы
Переключить ноль:
LOGATE нольX,нольY
-151 -
PRINT "Кнопка 1"
LOGATE 15,15,0
RETURN
Переключить два:
LOGATE ДваХ, ДваY
PRINT "Кнопка2"
LOGATE 15,15,0
RETURN
Переключить четыре:
LOGATE четыре Х, четыре Y
PRINT "Кнопка 4 "
LOGATE 15,15,0
RETURN
Переключить шесть:
LOGATE шесть Х, шесть Y
PRINT "КНОПКА 4"
LOGATE 15,15,0
RETURN
Заявление ON TIMER
-------------------
Функция ON TIMER заявляет подпрограмму отслеживания с целью получения
----------------- управления каждые n секунд.
Синтаксис ON TIMER(n) GOSUB метка
----------
Замечания Метка указывает первое заявление подпрограммы обработки
--------- "истекшего времени", а n - целое выражение, указывающее ко-
личество секунд ожидания от 1 до 86400 (24 часа)
Заявление ON TIMER не имеет действия до тех пор, пока оно не разреша-
ется заявлением TIMER ON. Если TIMER ON уже исполнено начинается внутренний
отсчет секунд и между исполнениями каждого заявления делается проверка ис-
течения числа секунд, идентифицированного в заявлении. Если время истекло,
вызывается подпрограмма, назначенная меткой.
Заявление TIMER OFF включает проверку времени. После ловушки исполня-
ется неявное заявление TIMER STOP для предотвращения повторного вызова под-
программы отслеживания из нее самой (и заполнение стека). При закрывании
подпрограммы обработки посредством RETURN автоматически выполняется заявле-
ние TIMER ON , если подпрограмма ранее не исполняет явное заявление TIMER
OFF. Это означает, что счетчик секунд повторно устанавливается в ноль после
таймерной ловушки.
Для управления генерированием кода проверки событий используется мета-
заявление $EVENT.
См. также $EVENT
------------ TIMER
Пример ON TIMER(1) GOSUB отобразить время
------- настроить ловушку таймера
'включить проверку таймерного события
TIMER ON
'ожидать нажатия клавиши
WHILE NOT INSTAT: WEND
END 'конец программы
Отобразить время:
LOGATE 1,70
PRINT TIME$: RETURN
Заявление OPEN
---------------
Функция OPEN подготавливает файл или устройство считывания или зписи.
-------------
Синтаксис OPEN файлспец [FOR режим] AS[#]файланом [LEN=размерзаписи]
---------- или OPEN режимная строка,[#]файланом, файласпец [,размер
-152 -
записи]
Замечания Режим может быть одним из следующих:
---------- OUTRUT специфицируется последовательный файл для записи в
него;
INPUT - специфицируется последовательный файл для считывания из него;
APPEND- специфицируется последовательный файл для добавления к нему;
RANDON- специфицируется произвольный файл для считывания или записи;
BINARY- специфицируется двоичный файл для считывания или записи;
Режимная строка это строчное выражение, первая (и обычно единственная)
--------------- литера которого может быть одной из следующих:
0 специфицируется режим последовательного вывода
I специфицируется режим последовательного ввода
А специфицируется режим последовательного вывода в конец файла.
R специфицируется режим произвольного ввода/вывода
В специфицируется режим двоичного ввода/вывода
Файланом может быть любым целым числом. Для увеличения или уменьшения
этого значения используйте DOS - заявление FILES в файле CONFIG.SYS (см.бо-
лее подробную информацию в справочном руководстве по DOS)
Файланец - это строчное выражение специфицирующее имя файла, подлежа-
щего открыванию, и, опционально, спецификация привода и/или прохода.
Размер записи - это целое выражение, лежащее в диапазоне от 1 до 32767
и специфицирующее длину в байтах каждой записи файла произвольного досту-
па.По умолчанию, размер записи:128 байтов.
Главная функция OPEN состоит в привязке номера (файланом) к файлу или
физическому устройству и в подготовке устройства для считывания и/или запи-
си. Этот номер, а не имя файла, используется в каждом заявлении, имеющем
ссылку на файл. Содержимое заявление OPEN есть информация, указывающая "ре-
жим файла"; т.е. способы, посредством которых будет осуществляться доступ к
файлу: последовательный (для ввода, вывода в новый файл или вывода в сущес-
твцющий файл), произвольный и двоичный. Заявление OPEN обычно уравновешива-
ется согласованным с ним заявлением СLOSE (закрыть)
Две формы команды отличаются только степенью многословности:
OPEN "Мой файл.dta " FOR OUTRUT AS#1
имеет то-же действие,что и :
OPEN "0",#1 "мой файл.dta "
Попытка открыть для Ввода несуществующий файл вызывает ошибку 53 пери-
ода прогона, Файл не обнаружен. Если вы пытаетесь открыть несуществующий
файл для вывода , добавления, произвольного доступа или двоичных операций,
то он создается.
См. также OPEN COM
---------
Пример 'эта программа подразделяется на пять процедур. Различие между
процедурами состоит в режиме в котором открывается файл и способе манипу-
лирования данными файла.
DEF FN дать клавишу $ (сообщ$)
PRINT Сообщ $, " нажмите любую клавишу чтобы продолжить ..."
WHILE NOT INSTAT:WEND
FN дать клавишу $ =INKEY $
END DEF 'конец процедуры дать клавишу
SUB последовательный вывод
'этот файл открывается для последовательного вывода и в него записыва-
ются некоторые данные
КлавишиНаж $=FN Дать клавишу $ (теперь для последовательного вывода)
'открыть последовательный файл для вывода
OPEN "OPEN.DTA" FOR OUTRUT AS#1
Целое % =12345
Время стр$="История делается ночью"
'записать данные в последовательный файл
WRITE#1,Времстр$,целое%*2,врем стр$, целое %\2
CLOSE 1 закрыть файл
END SUB 'конец процедуры " последовательный вывод".
SUB последовательное добавление
'файл открывается для последовательного вывода. Однако данные в этом
случае добавляются в конце файла.
Клавиши Наж$ = FN дать клавишу $ (теперь немного добавим)
-153 -
'открыть последовательный файл для добавления данных
OPEN "OPEN.DTA"FOR APPEND AS#1
Целое %=32123
Врем Стр$ ="Наилучшее видение есть .... М.Форбе"
'добавить данные
WRITE#1,ВремСтр$, Целое%*0,2,Врем Стр$, Целое%\2
CLOSE 1 'закрыть файл
END SUB 'конец процедуры "последовательное добавление"
SUB Последовательный Ввод
-------------------------
Файл открывается для последовательного ввода, а данные которые считы-
ваются, отображаются на экране.
КлавишиНаж $=FN Дать клавишу $("теперь считаем обратно")
'открыть последовательный файл и читать из него
OPEN"OPEN.DTA" FOR INPUT AS#1
' читать первую строку используя LINE INPUT#
LINE INPUT #1,ВремСтр$
PRINT ВремСтр$
'использовать INPUT$ для считывания остальной части файла по одной ли-
тере
ВремСтр$=" "
WHILE NOT EOF(1) 'проверка конца файла
ВремСтр$ = ВремСтр$ + INPUT$(1,1)
WEND
PRINT ВремСтр $
CLOSE 1 'закрыть файл
КлавишиНаж $=FN Дать клавишу $(" ")
END SUB 'конец процедуры Последовательный ввод
SUB Двоичный ВВ
'файл открывается для двоичного ввода/вывода.
'данные считываются с использованием GET$.
'SEEK явно перемещает файловый показатель до конца файла и вы записы-
ваете те-же данные обратно в файл.
Клавиши Наж$ = FN ДатьКлавишу $ (теперь для двоичного ввода и вывода)
'открыть двоичный файл, читать из него
OPEN "OPEN.DTA" FOR BINARY AS#1
ВремСтр$=" "
Использовать GET$ для считывания данных и их хранения в строке
WHILE NOT EOF (1)
GET$ 1,1 Лит $
ВремСтр$ =ВремСтр $ + Лит$
WEND
PRINT ВремСтр $
'переместить файловый указатель в конец файла
SEEK 1, LOF (1)
'PUT$ копирует данные обратно в двоичный файл
FOR I% = 1 TO LEN (ВремСтр$)
PUT$ 1, MID$ (ВремСтр$,I%,1)
NEXT I%
CLOSE 1 'закрыть файл
КлавишиНаж$ = FN ДатьКлавишу $ (" ")
END SUB 'конец процедуры Двоичный ВВ
SUB Произвольный ВВ
'открыть файл для произвольного ввода/вывода.
'использовать FIELD для заявления буфера для утверждения данных, кото-
рые записываются и считываются.
GET и PUT считывают и записывают данные. Заметьте, что перед выполне-
нием GET для хранения данных в буфере в буфере файла используются 'LSET и
RSET.
КлавишиНаж$ = FNДатьКлавишу$ (теперь для произвольного ввода/вывода)
'открыть файл произвольного доступа
OPEN "OPEN.DTA" AS #1 LEN=1
FIELD 1,1 AS Лит$ 'определить 1-байтовый буфер
ВремСтр$ = " "
-154 -
ВремРазмер% =LOF (1) 'хранить размер файла
'используя GET, считать файл целиком
FOR I% = 1 TO ВремРазм%
GET 1, I%
ВремСтр$ = ВремСтр$ + Лит$ 'хранить данные
NEXT I%
'PUT копирует данные обратно в произвольный файл
FOR I% = LEN (ВремСтр$) TO1 STEP-1
LSET Лит$ = MID$ (ВремСтр$, I%,1)
PUT 1, LOF (1) 'вывод до конца файла
NEXT I%
CLOSE 1 'конец процедуры Произвольный файл
'печать главной программы
CALL Последовательный вывод
CALL Последовательное добавление
CALL Последовательный ввод
CALL Двоичный ВВ
CALL Произвольный ВВ
END 'конец программы
Заявление OPEN COM
-------------------
Функция OPEN COM открывает и конфигурирует коммуникационное высшее
------------------- устройство.
Смнтаксис OPEN " COM n [боды][,четность][,данные][,останов][опции]"
---------- AS [*] файланом [LEN кол]
Замечания n - указывает надлежащее открыванию последовательное внешнее
---------- устройство ввода/вывода. Боды-это целая константа, специфи-
цирующая скорость коммуникации: законными скоростями являются
75,110,150,300,600,1200,1800,2400,4800 и 9600 (по умолчанию 300)
Четность - это единственная литера, специфицирующая статус четности в
соответствии со следующими определениями:
S четность по пробелу (бит четности всегда 0)
О нечетный параллелизм
М маркированная четность(бит четности всегда 1)
Е четный параллелизм
N без четности (игнорируется на применяемых литерах и опускается на
передаваемых литерах)
По умолчанию - четный параллелизм.
Данные - это целая константа от 5 до 8, специфицирующая число битов
данных. По умолчанию 7.
Останов - это целая константа от 1 до 2, специфицирующая число битов
------- данных. о умолчанию бит останова 1(для бодовых скоростей 75 и
110 эта константа равна 2)
Файланом - это целое выражение, которым специфицируется числовая панель
--------- через которую вы осуществляете доступ к коммуникационному
внешнему устройству ввода/вывода.
Кол - это максимальное число байтов, котрое можно считывать с коммуни-
кационного устройства или записывать на него с помощью GET и PUT; по умол-
чанию - это 128. Данное значение не может быть больше размера буфера для
этого внешнего устройства, который устанавливается с помощью метазаявления
$COM.
Заявление OPEN COM включает в себя блок опций, который управляет обра-
боткой строки состояний, четностью и обработкой возврата каретки/подачи
строки.
Опции = [,RS][,CS[м сек]][,DS[м сек]][,CD[м сек]][,LF][,DF]
RS подавляет строку RTS. CS [м сек] управляет CTS. DS [м сек] управля-
ет DSR. CD [м сек] управляет CD. LF вызывает добавление литера подачи стро-
ки к каждой литере возврата каретки. PE включает проверку четности.
Аргумент м сек онций CS,DS,CD может лежать в диапазоне от 0 до 65535 и
специфицирует сколь долго ( в миллисекундах ) Турбо-Бейсик будет находиться
-155 -
в состоянии ожидания перед возвращением ошибки Устройство на Перерыве. Если
этот аргумент равен 0 или опускается, то проверка строки состояния не вы-
полняется. По умолчанию м сек равен 1000 для СS и DS и 0 для CD
См. также COM
--------- $COM
ON COM
Пример ' разместить строчный массив для хранения, ввода DIM КомПортВ-
вод$ (1)
$COM1 1024 'построить 1 К буфер ввода
OPEN "COM1" AS#1 LEN = 1
PRINT "нажмите любую клавишу для завершения программы ...."
WHILE NOT INSTAT 'пока клавиша еще не нажата
'если в наличии есть какой-либо ввод
IF LOF (1) > 0 THEM
'читать все что имеется в буфере ком. устройства
КомПортВвод$(0) = INPUT$ (1, LOF(1))
Отобразить ввод
PRINT "Ввод Ком-устройства:", КомПортВвод $(0)
END IF
WEND
END 'конец программы
Заявление OPTION BASE
----------------------
Функция OPTION BASE устанавливает минимальное значение для подстрочных
-------------------- индексов массивов .
Синтаксис OPTION BASE целое выражение
---------
Замечания Целое выражение может находиться в диапазоне от 0 до 32767.
---------- OPTION BASE управляет тем, какое значение подстрочного ин-
декса относится к первому элементу переменных массива.Нап-
ример, после OPTION BASE 1, заявляющее массив x с помощью
заявления DIM x(20) устанавливает отдельную память для 20
элементов (от1 до 20), а не 21, устанавливаемое по умолча-
нию(от 0 до 20).
Хотя вы можете использовать OPTION BASE для управления диапазонами
подстрочных индексов, Турбо-Бейсик предлагает более мощный способ че-
рез заявление DIM.
Ст. также DIM
--------------
Пример 'разместить массив из трех целых
------- DIM Первый массив % (2)
'установить начальный индекс любого заявленного массива
OPTION BASE 1
'разместить массив из двух целых
DIM Второй массив % (2)
FOR I% = 0 TO 2
'нет нулевого индекса; проверка на 0
IF I% > 0 THEN
Второй массив % (I%)=I%
END IF
Первый массив % (I%) =I%
NEXT I%
FOR I% =0 TO2
' нет нулевого индекса; проверка на ноль
IF I% >0 THEN
PRINT Второй массив
END IF
PRINT Первый массив% (I%)
NEXT I%
END ' конец программы
-156 -
Заявление OUT
--------------
Функция OUT обеспечивает запись на внешнее устройство ввода/вывода
------------
Синтаксис OUT портном, целое выражение
----------
Замечания OUT посылает байтовое значение (от 0 до 255) на аппаратное
--------- внешнее устройство вывода портном, где портном - это целое
выражение от 0 до 65535.
OUT необходимо для управления различными аппаратными подсистемами, та-
кими как коммуниеационный или видео-адаптер. Используемое неправильно
OUTможет легко разрушить систему.
Пример 'программа делает вопль звукоизлучателя посредством считывания
--------- регистра состояний и тумблерного переключения ( включить и
выключить) битов, которые управляют звукоизлучателем.
'считать значение в Порт 61 шестнадцатиричное
СостояниеРег % = INP (&H61)
СостояниеРег % = СостояниеРег % AND &HOOFC
'маскировать считываемое значение
'сделать тон достаточно длительным для слухового восприятия
FOR I = 1 TO 1000
СостояниеРег % = CостояниеРег% XOR 2 ' тумблерное переключение звуко-
излучателя
OUT &H61, СостояниеРег% 'вывод нового состояния
DELAY.001
NEXT I
END
Заявление PAINT
----------------
Функция PAINT обеспечивает заполнение замкнутой зоны экрана выбранным
------- цветом
Синтаксис PAINT(x,y) [I,цвет][I,граница][,фон]
---------
Замечания (x,y) - координаты исходной точки в замкнутой зоне, подлежа-
--------- щей заполнению. Если исходная точка в пределах замкнутой
зоны, то заполняется ее внутренняя часть. Если исходная точка вне
замкнутой зоны, то будет заполняться поверхность экрана с наружной
стороны замкнутой зоны. Цвет - может быть либо числовым, либо строч-
ным выражением. Если это числовое выражение, им специфицируется атт-
рибут (цвет) которым будет осуществляться заполнение.Если это строка,
то она содержит информацию маски, которая вызывает заполнение с по-
мощью какого-то графического образчика, а не сплошным цветом.Если вы
не специфицируете цвет, используется цвет нужного фона.
Граница - это цвет бордюра заполняемой вами фигуры. Действие PAINT
прекращается всякий раз, когда на пути встречается цвет границы.
Фон - это опциональная строчная маска, используемая когда вы желаете
перекрасить зоны. Фоновая маска представляет собой некий черепичный
пластик перехода при проверке уже закрашенных зон.
С помощью заявления PAINT можно заполнять любую замкнутую форму, вне
зависимости от ее сложности. Турбо-Бейсик выбирает байт, подлежащий
графической обработке, с использованием формулы y mod tike length (y
mod черепицы длина) . Обеспечивает уверенность в замкнутости подлежа-
щего заполнению режима, поскольку при "утечке" заполнителя может ока-
заться испорченной вся ваша картина.
Если аргумент цвет числовой, PAINT заполняет форму указанным
цветом, останавливаясь на пикселах с атрибутом граница или атрибутом
цвет. Если цвет - строчное выражение, то для определения образчика,
которым подлежит заполнению зона, используется принцип "черепицы".
Образчик, представляемый строчными значениями аргументов цвета, имеет
1-байтовую ширину(4 пиксела при средней и 8 пикселов при высокой сте-
пени разрешения) и от 1 до 64 байтов длину(т.е. от 1 до 64 строк ска-
-157 -
нирования по вертикали). При черепичной обработке цвет должен предс-
тавляться в таком формате:
CHR$(&Hnn) + CHR$(&Hnn) ...
Маска базируется на основных битовых значениях цвета, причем первая
литера представляет первую строку образчика, вторая литера - вторую
строку и т.д.
Например, следующий образчик представляет образчик в виде шахмат-
ной доски(50% серого) в режиме высокой разрешающей способности:
10101010 (первый байт)
01010101 (второй байт)
Чтобы заполнить какую-либо зону этой шахматной доской, строится стро-
ка с подходящей информацией маски. Прежде всего преобразуйте двоичную
флрму в шестнадцатиричную:
10101010 = &HAA
01010101 = &H55
Теперь конструируйте двухсимвольную строку, используя CHR$:
Образчик $=CHR$(&HAA) + CHR$ (&H55)
Далее заявление
PAINT (50,50), образчик $
Обеспечивает заполнение серой (шахматная доска) краской
Фон - используется для определения условия останова, когда заполня-
ется уже обработанная образчиком зона. Если операция заполнения попа-
дает на пиксел, который согласуется с соответствующим битом в фоне,
то заполнение не прекращается, даже этот пиксел имеет цвет границы.
При черепичной обработке число цветовых аттрибутов в каждом экр-
ранном режиме определяет каким образом конструируется экранный образ-
чик. Помните, что число битов на пиксел коррелируется с числом цвето-
вых аттрибутов в любом данном экранном режиме. Для вычисления коли-
чества битов на пиксел вы можете воспользоваться следующей формулой:
LOG (X) = Y,
2
где X равно сумме цветовых аттрибутов вашего экрана, а Y равно числу
битов на пиксел.
Черепичная обработка в Экране 1.
При средней разрешающей способности , используя приведенную выше
формулу, X равно 4 пикселам (которые представляются 1 черепичным бай-
том средней разрешающей способности), поэтому Y равно 2 битам на пик-
сел. Поскольку каждый пиксел имеет соответствующий цветовой аттрибут,
он будет занимать 2 бита черепичного байта для описания 1 вывода 4
аттрибутов.
В следующей таблице показаны десятичные и шестнадцатиричные значе-
ния, которые соответствуют каждому аттрибуту:
---------------------------------------------------------------------
Цветовая Аттрибут Образчик Образчик
палитра в двоичном в двоичном в шестнадцатиричном
---------------------------------------------------------------------
0
зеленый 01 01010101 &H55
красный 10 10101010 &HAA
коричневый 11 11111111 &HFF
----------------------------------------------------------------------
1
цинковый 01 01010101 &H55
анилиновый 10 10101010 &HAA
белый 11 11111111 &HFF
-----------------------------------------------------------------------
Черепичная обработка на Экране 2
Имеется 1 бит на пиксел при высокой разрешающей способности, позволя-
ющий каждую черепицу представлять &-пиксельным экраном. Где бы маска
не оценивалась значением 1, на графике появляется точка. Строка может
содержать до 64 байтов.
Образчик вызывается одинаковым образом по всей протяженности зоны,
-158 -
определяемой границей.Когда граница не определяетмя, обработанным об-
разчиком оказывается весь экран.
Черепичная обработка в Экранах 7,8,9,10
Для этих улучшенных экранных режимов черепичный образчик представ-
ляет собой изобретение некоторого приема хранения и интерпретации
строки, как стека 8-битовых блоков, известных в совокупности как
бит-плоскость. В каждом экранном режиме, за исключением режима 10,
для которого требуется 2 бит-плоскости, для определения 1 черепичного
байта необходимо 4 бит-плоскости.
Пример 'вот как используются черепичные образчики
------- SCREEN 1:CLS
'определить диагональный образчик для диагональных линий
TIL$ = CHR$(&H40)+CHR$(&H40)+CHR$(&H10)+CHR$(&H10)+CHR$(4)+
CHR$(4)+CHR$(1)+CHR$(1)
CIRCLE(100,100),50
PLANT(100,100),TIL$
'определить черепичный образчик-шахматная доска
TIL2$=CHR$(&HAA)+CHR$(&HAA)+CHR$(&H80)+CHR$(&H80)+CHR$(&H80)+
CHR$(&H80)+CHR$(&H80)+CHR$(&H80)
CIRCLE (225,100),50
PLANT (225,100),TIL2$
Заявление PALETTE, PALETTE USING
---------------------------------
Функция PALETTE и PALETTE USING позволяет вам менять один или более цв
------------------------------- етов в политре (чтобы воспольэоваться
этими заявлениями, у вас должен быть улучшенный графический
Адаптер)
Синтаксис PALETTE (атрибут, цвет)
---------- PALETTE USING имя целого массива( индекс в массиве)
Замечания Аттрибутом представляется цвет в палитре. Цвет - это факти-
чески отображаемый цвет, которым замещается аттрибут в па-
литре. Отображаемый на вашем экране цвет зависит от уста-
новки экранного режима и аппаратного дисплея(см.заявление
SCREEN). Заявление PALETTE дает вам возможность менять цвет
текста или графики имеющейся в данный момент на экране и
это изменение оказывает также действие на любые последующие
тексты или графику. Это подручное средство, освобождающее
вас от необходимости перечерчивать текст или графику, если
вы вдруг пожелаете изменить цвет(см. раздел примеров)
PALETTE позволяет вам также маннировать число цветов в палитре более
15. Вы даже можете отображать текст как невидимый на фоне,а
затем изменить палитру для цвета текста, чтобы сделать его
внезапно видимым.
Если в заявлении PALETTE аргументы не специфицируются, палитра уста-
навливается в заранее определенные цвета умолчания.
Заявления PALETTE USING позволяет вам модифицировать всю палитру в це-
лом посредством одного заявленияя. Имя целого массива име-
нует массив. При установке вашей палитры используйте индекс
в массиве для указания первого элемента массива ( в боль-
шинстве случаев вы будете специфицировать в качестве индек-
са в массиве 0). Добивайтесь уверенности в том, что размер
вашего целого массива достаточно велик для хранения всех
шестнадцати входов палитр после индекса в массиве. Любой
аттрибут в палитре находится в паре с цветом из целого мас-
сива. Использование в качестве цветового аргумента -1 в
массивном входе приводит к тому, что спаренный аттрибут не
изменяется: однако все другие отрицательные значения для
цвета незаконны. Ниже представлен список диапазонов аттри-
бутов и цветов для различных экранных режимов и мониторов:
-159 -
Таблица 5-1 Диапазоны цветов и аттрибутов
-----------------------------------------------------------------------
Режим Монитор Диапазон аттрибутов Диапазон цветов
-----------------------------------------------------------------------
0 Моно/EGA 0-15 0-2
0 Цветной/EGA 0-31 0-15
1 Цветной/EGA 0-3 0-15
2 Цветной/EGA 0-1 0-15
7 Цветной/EGA 0-15 0-15
8 Цветной/EGA 0-15 0-15
9 EGA(64 K) 0-3 0-15
9 EGA (>64K) 0-15 0-63
10 MONO/EGA 0-3 0-8
Моно - монохромный
EGA - Улучшенный графический адаптер /ВМ
-----------------------------------------------------------------------
Ограничения Для заявлений PALETTE и PALETTE USING требуется улучшенный
----------- Графический Адаптер (EGA)
Cм. также COLOR
--------- DRAW
SCREEN
Пример 'ниже показано как применить PALETTE для изменения цвета
------- графики ( и текста) без перечеркивания или повторного отобра-
жения графики.
SCREEN 8 'установить 16-цветный режим ECA 640x200
PALETTE 'установить цвета палитры EGA по умолчанию
LINE (10,10) -(630,190),1,BF 'чертить рамку, заполнить ее го-
лубым
DO
FOR I% = 2 TO 14
PALETTE 1, I% 'изменить цвет рамки с голубого
DELAY,2 'задержать чтобы видеть изменения
NEXT I%
LOOP UNTIL INSTAT 'производятся изменения до нажатия клавиши
END
Функция PEEK
-------------
Функция PEEK возвращает байт, хранимый в специфицированной ячейке
------------- памяти
Синтаксис y=PEEK(отступ)
----------
Замечания Отступ - это числовое выражение от 0 до 65535, представляю-
---------- щее 16-битовый отступ в текущем сегменте, установленном са-
мым последним заявлением DEF SEG. Возвращаемое значение мо-
жет быть в диапазоне от 0 до 255. PEEK и дополняющее его
заявление POKE представляют собой низкоуровневые уходы из
определяемого в Турбо-Бейсике использования памяти. Одной
из областей применения PEEK и POKE является формирование
массивов байтов для такого применения, где не трубуется
полного, от -32768 до 32767 диапазона целых массивов.
См. также DEF SEG
--------- POKE
Пример DIM массивов % (5) 'разместить массив из 6 целых
------- DEF SEG =ПЕРСЕГ (массив%(0) )
'используйте POKE, возбудить массив
-160 -
FOR I% = 0 TO 11
POKE I%, &HFF
NEXT I%
'используйте PEEK, отобразить состояние массива
FOR I% = 0 TO 11
PRINT HEX$ (PEEK (I%) _
NEXT I%
END
Фуцнкция PEN
--------------
Функция PEN считывает состояние светового пера.
------------
Синтаксис y=PEN (опция)
----------
Замечания Опция - это числовая опция, которая управляет информацией,
--------- возвращаемой PEN, в соответствии со следующей таблицей:
---------------------------------------------------------------------
Опция Действие
----------------------------------------------------------------------
0 Перо вниз с момента последней проверки?
(-1= до; 0=нет)
1 X-координаты, при которой последний раз задействовалось перо
2 Y-координата, при которой последний раз задействовалось перо
3 Текущее значение переключателя (-1=вниз; 0=вверх)
4 Самая последняя X-координата
5 Самая последняя Y-координата
6 Ряд в котором последний раз задействовалось перо
7 Колонка, в которой последний раз задействовалось перо (1-80)
8 Самый последний ряд (1-24)
9 Самая последняя колонка (1-80)
-----------------------------------------------------------------------
Перед выполнением любого запроса функции PEN световое перо должно быть
включено с помощью заявления PEN ON.
Пример ON PEN GOSUB Пераобработчик 'построить обработчик событий
------ PEN ON 'включить отслеживание событий
PRINT 'нажмите для останова любую клавишу
WHILE NOT INSTAT
WEND
END
Пераобработчик:
FOR I% = 1 TO 9
PRINT PEN (I%)
NEXT I%
RETURN
Заявление PEN
--------------
Функция PEN управляет проверкой событий светового пера.
-161 -
--------
Синтаксис PEN (ON [OFF] STOP)
----------
Замечания Заявление PEN управляет проверкой событий светового пера.
--------- Перед выполнением любых запросов функций пера световое перо
длжно быть включено с помощью PEN ON. Исполнение PEN ON
также обеспечивает доступ к отслеживанию событий светового
пера с помощью подпрограммы, указываемой в заявлении ON PEN.
PEN ON запрещает функцию PEN и включает проверку событий пера.
PEN STOP отключает отслеживание событий пера, но события пера запоми-
наются, что если позднее выдается PEN ON, немедленно проис-
ходит захват события в ловушку.
См. также ON PEN
----------
Пример 'эта программа демонстрирует заявление PEN ON
------- ON PEN GOSUB Пераобработчик
'настроить обработчик событий
PEN ON 'включить отслеживание событий
PRINT 'нажмите для останова любую клавишу
WHILE NOT INSTAT
WEND
END
Пераобработчик
FOR I% = 1 TO 9
PRINT PEN (I%)
NEXT I%
RETURN
Функция PLAY
------------
Функция PLAY возвращает число нот, содержащихся в буфере фоновой музы-
----------- ки
Синтаксис y=PLAY (x)
----------
Замечания X- это пустой числовой аргумент.
PLAY возвращает число нот,
---------- имеющееся в буфере фоновой музыки в ожидании исполнения.
Если музыка должна исполняться на переднем фоне или не должна
исполняться вовсе, PLAY возвращает 0.
См. также $SOUND
---------
Пример 'играть до-ре-ми-фа и считать оставшиеся ноты
------- PLAY " MB CDEFG "
Вновь:
-----
n=PLAY (1) 'можно играть(что-нибудь)
PRINT n "нот осталось в буфере"
IF n=0 THEN PRINT "Буфер пуст": END
GOTO вновь
Заявление PLAY
-------------------
Функция PLAY создает музыку
----------------
Синтаксис PLAY строчное выражение
---------------
Замечания PLAY представляет собой интерпретаторный мини-язык, который
------------- делает для музыки то же самое, что DRAW для графики. PLAY
дает вам возможность определять музыкальные пассажи, как последо-
вательность литер в строчном выражении, и исполнять их через звукоизлу-
-162 -
чатель компьютера.
Имеется $4 ноты, соответствующие большинству клавиш пианино в ди-
апазоне тремя октавами ниже среднего С но одной нотой меньше , чем че-
тыре октавы выше среднего С. Ноты могут представляться их числовым зна-
чением (1-84) или в письменной нотации ( т.е. от А до G с диезами и бе-
молями, а также с информацией об октаве)
Например, PLAY N44" играет ноту 44, т.е. G выше среднего С, PLAY
"036" играет С в третьей октаве(ту же ноту).
Заявления музыкального определения можно группировать в длинные
составные последовательности:
PLAY "03FGA"
играет три ноты (F,C,A) в октаве 3.
Пробелы музыкальным интерпретатором игнорируются и могут использо-
ваться для обеспечения четкого представления структуры командной строки.
Команды
Следуюшие одно и двухлитерные команды образуют язык заявления PLAY.
нота-буква [(# 1+1 - )]
Играть ноту нота-буква: нота-буква - это буква от А до G (регистр
безразличен). Включением опционального диеза (# или +) либо бекара (-)
после нота-буквы осуществляется выбор эквивалента черной клавиши пиани-
но.Вы не можете полутонировать ноту для получения какой-то белой клави-
ши; например, "F-" незаконно.
Nn
Играть ноту n, где n-числовое представление ноты от 1 до 84. Нота
1 это самое низкое с на пианино; 84 - самое высокое в. Среднее с это
нота 37. Нота О не дает звука и может использоваться в качестве паузы.
Оn
Выбирается октава n, где n может быть 0-6. Каждая октава начина-
ется с С и оканчивается В. Среднее С есть первая нота октавы 3. По
умолчанию - октава 4.
>n
Перемещение текущей октавы вперед на 1 и играть ноту n. Если те-
кущая октава 6 (наивысшая октава) то остается шестая октава.
<n
Понижение текущей октавы и играть ноту n. Если октава О (наиниз-
шая октава) то остается нулевая октава.
Ln
Установить продолжительность нот, следующих далее, в соответствии
с таблицей:
L1 целая нота
L2 половинная нота
L4 четвертная нота
L8 одна восьмая
L64 одна шестьдесят четвертая
Приемлмы и промежуточные значения (L5 это законное заявление про-
должительности звучания). Наибольшее допустимое значение для n есть 64.
Рn
Паузы для n ударов (где n представляется в периодах времени, спе-
цифицированных в последней команде L)
Помещение точки после ноты вызывает ее исполнение в полтора раза
дольше ее нормального значения. Например, снабженная точкой четвертная
нота имеет общую продолжительность звучания в четвертную и восьмую доли
ноты.
Может использоваться более чем одна точка.
Вторая точка действует
на пару нота- точка как нечто целое; например, снабженная двумя точками
четвертная нота играется на 1.5 (1.5 * 1/4) удара. Точками также можно
регулировать длину паузы.
Tn
Устанавливается тема, где n - число четвертных нот в минуту, ко-
торое может находиться в диапазоне от 32 до 255. По умолчанию - 120.
MF
-163 -
"Музыкальный передний фон" приводит к тому что музыка, создавае-
мая заявлением PLAY прогоняется на переднем фоне (т.е. следующее заяв-
ление вашей программы не будет исполняться пока не завершится исполне-
ние музыкального сопровождения).
МВ
" Музыка заднего фона" приводит к тому, что исполнение музыки сох-
раняется, даже если ваша программа не делает ничего другого. По умолча-
нию Турбо-Бейсик имеет 32-нотный буфер для игры на заднем фоне, который
может быть удлинен с помощью заявления $SOUND. См. также заявление PLAY
ON и ON PLAY с помощью которых можно периодически инспектировать испол-
нение музыки заднего фона и при необходимости добавлять новые ноты.
MN/MI/MS
В зависимости от этой установки ноты могут выдерживаться либо тремя
четвертями времени, специфиуируемого L (MS : "Музыкальное стокатто), либо
семью восьмыми времени специфиуируемого L (MN "Нормальная музыка"), либо
полным временем, специфицируемым L (ML : "Музыкальное легато")
X VARPTR$ (строчная переменная) (исполнить субстроку)
X (исполнить) - команда дает вам возможность вставлять субстроку в
заявление PLAY как музыкальную подпрограмму; например в:
aS = "CDE " PLAY "EDEX" + VARPTR$ (aS)
играются ноты EDECD и E в указанном порядке.
Переменные аргументы
В каждой команде PLAY аргумент может быть постоянным значением или
специфицироваться в форме = VARPTR$ (переменная), где переменная - это
числовая переменная. Примечание: Интерпретаторный Бэйсик позволяет специ-
фицировать в игровой строке имена переменных. Например, PLAY "T =x; уста-
навливает темы для содержимого переменной x. Хотя было бы прекрасно, если
бы это делалось, но в Турбо-Бейсике такая возможность не реализуется, пос-
колько именная информация, ассоциируемая с переменной x во время прогона
нет. Вместо этого вы должны пользоваться описанным выше приемом VARPTR$ .
См. также ON PLAY
PLAY ON
$SOUND
Пример первая строка $ = 0314cl2ee18el4eedcfl1<A"
------- вторая строка $ = 03l8cccl4edl2<Al4Al1 <1>c"
третья строка $ = l4cl10ff.fl1e"
PLAY "T150" скорость до темпа
FOR n = 1 TO4
PLAY первая строка $
NEXT n
PLAY вторая строка $ + третья строка $
Функция PMAP
------------
Функция PMAP транслирует физические координаты в мировые и наоборот.
Синтаксис y = PMAP (x, опция)
-----------
Замечания x -это координата точки подлежащей маппированию, а опция -
это целое выражение от 0 до 3, которое управляет функцией PMAP следующим
образом.
--------------------------------------------------------------------
Опция Действие
--------------------------------------------------------------------
0 Маппировать мировую координату x в физическую координату x
1 Маппировать мировую координату y в физическую координату y
2 Маппировать физическую координату x в мировую координату x
3 Маппировать физическую координату y в мировую координату y
-164 -
--------------------------------------------------------------------
PMAP осуществляет масштабирование, специфицируемое самым последним
заявлением WINDOW без размещения чего-либо на экране.
См. также WINDOW
---------
Пример "Переключить на графический экран средней размещающей способ-
ности
SCREEN 1
"определить декартово начало в средине экрана с исходным диапазоном
значений x и y, которые получаются больше при перемещении вверх, а не вниз.
WINDOW (-1000, 1000) - (1000, -1000)
PMAP может теперь осуществлять масштабирование между декартовым эк-
раном и физическими пикселами
PSET (PMAP (0,0), PMAP (0,1),2
PSET (PMAP (50,2),PMAP (50,3)),2
PEINT PMAP (0,0),PMAP(0,1),PMAP(50,2),PMAP(50,3)
END
Функция POINT
--------------
Функция POINT возвращает цвет пиксела или информацию об LPR.
Синтаксис Первая форма
--------- цвет = POINT (x,y)
Вторая форма:
y= POINT (опция)
Замечания В первой форме (x,y) специфицирует координаты графического
пиксела средней или высокой разрешающей способности. POINT возвращает атт-
рибутное значение (цвет) пиксела в точке (X,Y). Если либо x, либо y лежат
вне диапазона, POINT возвращает 1.
Во второй форме опция - это числовые переменная или выражение, кото-
рое управляет действием POINT в соответствии со следующей таблицей:
-------------------------------------------------------------------
Опция Действие
-------------------------------------------------------------------
0 Возвращается текущая физическая x- координата
1 Возвращается текущая физическая y-координата
2 Возвращается текущая мировая x-координата
3 Возвращается текущая мировая y-координата
----------------------------------------------------------------------
Первая форма POINT полезна просто для оживления пиксела вовремя. Ис-
пользуйте POINT для считывания цветафонового окружения пиксела, подлежаще-
го перезаписи во временную память. Затем с помощью PSET устанавливайте
точку в цвет перемещающегося обьекта. И наконец , для стирания точки, воз-
вращайте ее в первоначальный цвет.
См. также PSET
---------
Пример "включить графический режим среднего разрешения SCREEN1
-------- CIRCLE (160,100),50,2 " отобразить окружность
поставить точку в центре окружности
PSET (160,100),1
"отобразить цвет точки и ее положение
PRINT POINT (160,100)
PRINT POINT (0),POINT (1)
END
Заявление POKE
----------------
Функция POKE записывает байт по специфицируемому адресу
-------------
Синтаксис POKE отступ, значение
----------
-165 -
Замечания Отступ - это адрес в диапазоне числовых значений от 0 до 65535.
---------- Значение - это значение байта , подлежащего записи по адресу
в диапазоне от 0 до 255. Отступ относится к сегменту, определенному
самым последним заявлением DEF SEG.
POKE записывает значения байтового размера по указанному адресу и
является низкоуровневым уходом из нормального использования памяти в Тур-
бо-Бейсике. POKE не выполняет проверку ошибок, поэтому при неправильном при-
менении этой команды не трудно разрушать DOS и иливашу прграмму.
См. также PEEK
---------
Пример DIM Массив % (5) разместить массив из 6 целых
------ DEF SEG = VARSEG (Массив %(0) )
возбудить массив используя POKE
FOK I% = 0 TO 11
POKE I%, &HFF
NEXT I%
отобразить содержимое массива, используя PEEK
FOR I% = 0 TO 11
PRINT HEX$ (PEEK (I%) )
NEXT I%
END
Функция POS
------------
Функция POS возвращает горизонтальное положение курсора (номер ко-
лонки)
Синтаксис y = POS (x)
----------
Замечания x - это пустой числовой аттрибут. Возвращаемое POS значе-
ние лежит в диапазоне от 1 до 80 и представляет собой горизонтальное (но-
мер колонки) положение курсора. Для получения положения курсора по верти-
кали пользуйтесь функцией CSRLIN
Для перемещения и сокрытия курсора пользуйтесь заявлением LOGATE.
См. также CSRLIN
---------- LOGATE
LPOS
Пример " пострить обработчик событий
------- ON TIMER (1) GOSUB отобразить часы
" включить отслеживание событий
TIMER ON
" пока не нажата клавиша
PRINT "Нажмите для останова любую клавишу"
WHILE NOT INSTAT
WEND
END
Отобразить часы
----------------
Старое X%=POS
Старое Y%=CSRLIN
LOGATE 1,72,1
PRINT TIME$
LOGATE старое Y%, старое X%,1
RETURN
Заявление PRESET
-------------------
Функция PRESET обеспечивает представление точки на графическом экра-
не.
Синтаксис PRESET (x,y) [,цвет]
----------
Замечания (x,y) - это координаты точки, изображаемой на графическом
экране, которые могут задаваться как в абсолютной, так и в относительной
-166 -
форме. Цвет - это целое выражение, определяющее цвет, который должна иметь
точка. На цветной атрибут распространяются обычные ограничения режима.О
законных диапазонах аттрибута в каждом экранном режиме см. в описании за-
явления PALETTE. Если цвет специфицируется, PEESET и дополняющая его ко-
манда PSET работает идентично. Различие между ними состоит в том, что
PRESET имеет значение 0 цвета по умолчанию (цвет заднего фона), тогда как
умолчанием для PSET является максимально возможное значение аттрибута того
режима, в котором вы находитесь. Другими словами без цветовых аргументов
PSET включает пикселы, а PRESET их выключает.
См. также PSET
----------
Пример "включить графический режим среднего разрешения
-------- SCREEN1
FOR I% = 0 TO 359
FOR I% = 0 TO 199
DELAY 0.01
PSET (I% ,I%)
NEXT J%
NEXT I%
FOR I% = 0 TO 359
FOR J% = 0 TO 199
DELAY 0.01
PRESET (I%,J%)
NEXT J%
NEXT I%
END
Заявление PRINT
----------------
Функция PRINT посылает данные на экран
-------
Синтаксис PRINT [список выражений ] [;]
---------
Замечания Список выражений - это ряд числовых и/или строчных выраже-
ний, разделяемые точками с запятой, пробелами или запятыми. Если список
выражений не оканчивается точкой с запятой, Турбо-Бейсик после информации
списка выражений выводит возврат каретки. Если список выражений опускает-
ся, PRINT выводит только возврат каретки.
PRINT использует пунктуацию, разделяющую элементы списка выражений,
для определения того, как осуществлять размещение на экране.
Зоны экранного вывода
Для быстрого и аккуратного вывода Турбо-Бейсик подразделяет экран на
"зоны экранного вывода" (принт-зоны) по 14 колонок каждая. Использование
запятой между элементами списка выражений вызывает экранный вывод каждого
из них с начала следующей зоны. Точкк с запятой или пробел между элемента-
ми вызывает вывод каждого последующего элемента непосредственно за преды-
дущим вне зависимости от принт-зон.
Если заявление PRINT оканчивается запятой, точкой с запятой или фун-
кциями SPC либоTAB, следующее заявление PRINT будет осуществлять вывод в
ту-же строку. Иначе следующее заявление PRINT начинает вывод с самой левой
колонки следующей строки. За числовым значением всегда следует пробел. По-
ложительным числам также предшествует пробел; отрицательным числам пред-
шествует знак минус.
Заявление PRINT можно представлять аббревиатурно, как знак вопроса
( набора признака сомнения, появление которого относится ко временам ин-
терпретаторов времен оно):
?" Алло "
означает то-же самое, что PRINT "Алло"
См. также LPRINT
----------- LPRINT USING
PRINT USING
SPC
TAB
-167 -
Пример М=2
-------- PRINT "Строки и числа - это "М" возможности того,";
"запятые в качестве разделителей дают размещение данных в
14-колонных принт-зонах
A=1
B=2
C=3
PRINT A,B,C, "текст"
" пробелами и точками с запятыми в качестве разделителей
обеспечивается вывод данных потоком
PRINT A;B;C; "текст"
END
Заявление PRINTA и PRINT USING
--------------------------------
Функция PRINT и PRINT USING записывают форматную информацию в файл
---------------------------
Синтаксис PRINT# файланом, [ USING форматная строка;] список выраже-
ний [;]
Замечания Файланом - это значение под которым был открыт файл. Фор-
матная строка- это опциональная последовательность форматизующих литер (
описанная в заявлении PRINT USING). Список выражений - это ряд числовых
и/или строчных выражений , подлежащих выводу в файл.
PRINT# посылает данные в файл точно так, как PRINT посылает их на
экран. Поэтому если вы не проявете специальную заботу, можно бесполезно
потерять массу дискового пространства на пробелы, в которых нет необходи-
мости, либо, что еще хуже, установить поля так тесно друг к другу, что не
сможете разобрать их по отдельности, когда позднее будет осуществляться их
обработка заявлением INPUT#.
PRINT#1 1,2,3
посылает
1 --------- 2-------- 3
в файл #1. Вследствии существования 14-колонной принт-зоны между ли-
терами в файл посылаются избыточные пробелы. С другой стороны,
PRINT#1 1;2;3
посылает в файл 1 - 2 - 3 и вы не можете считывать отдельные число-
вые значения из это записи, посколько для INPUT# требуются в качестве раз-
делителей запятые. Самым верным способом разделения полей являются помеще-
ние между ними запятых; например PRINT#1, 1","2","3 обеспечивает запись в
файл 1,2,3 в виде пакета, в котором теряется наименьшее пространство, и
который легко читается заявлением INPUT#.
Заявлением WRITE# поля разделяются запятыми автоматически.
Пример SUB делать файл
------- INPUT# открывает последовательный файл для вывода
" с использованием WRITE# он записывается строками различно-
го типа данных.
" назначить файловую переменную #1
OPEN "INPUT#.DTA" FOR OUTPUT AS #1
"определить несколько переменных и возбудить их
Строчная переменная $="Я вернусь"
Целая % = 1000
Плавающая точка. = 30000.1234
" записать строку текста в последовательный файл
WRITEN1, строчная переменная $, цела%, плавающая точка.
CLOSE 1 " закрыть файловую переменную
END SUB " конец процедуры делать файл
SUB читать файл
Зта процедура открывает последовательный файл для ввода.С
использованием INPUT из файла читаются строки различного типа данных.
"назначить файловую переменную #1
OPEN INPUT#.DTA" FOR INPUT AS #1
-168 -
Строчная переменная $ =" " определить несколько переменных и
возбудить их
Целое % = 0
Плавающая точка = 0
" читать строку текста из последовательного файла
INPUT# 1, строчная переменная $, целая %, плавающая точка.
PRINT строчная переменная $,целая%, плавающая точка.
CLOSE#1 "закрыть файловую переменную
END SUB "конец процедуры читать файл
CALL делать файл
СALL читать файл
END
Заявление PRINT USING
----------------------
Функция PRINT USING посылает на экран форматную информацию
-------------------
Синтаксис PRINT USING форматная строка; список выражений [;]
---------------------
Замечания Форматная строка - это строчная константа или переменная
----------- которой описывается как образуется формат информации, со
держащейся в списке выражений. Список выражений - это строчная или числовая
информация, подлежащая выводу на экран, разделяемая запятыми, пробелами
или точками с запятыми. PRINT USING игнорирует пунктуацию в списке выраже-
ний.
Форматизация строчных полей .
Чтобы вывести на экран первые n литер строки: если форматная строка
состоит из обратных косых черт (\), заключающих в себе 0 или более пробелов,
то Турбо-Бейсик выводит на экран столько литер строки вывода, сколько оп-
ределяет длину форматной строки ( включая обратные косые черты). Например,
если форматная строка имеет вид "\" (нет пробелов, длина=2), то выводятся
две литеры; для "\--\" (два пробела, длина =4) выводится четыре литеры.
a$ = "кошки и собаки"
PRINT USING '\ --\"; a$; PRINT USING "\ \";a$
Форматная строка "!" вызывает вывод заявлением
PRINT USING точно по одной литере в строке вывода:
a$ = "кошки и собаки"
PRINT USING "!";a$
Чтобы распечатать всю строку в качестве форматной строки используйте
амперсанд (&)
a$ = "кошки и собаки"
PRINT USING "&'; a$
Форматизация чисел
Знаками номера (#) в форматной строке представляются цифры числа.
Затем, для указания форматообразования, такого как число цифр справа от
десятичной точки, соответствующим образом размещаются десятичные точки и
другие специальные литеры ( например, знаки доллара) Например:
PRINT USING "##.##"; 3.14159, .01032
PRINT USING "+##.##; 12.0101, -6.2
(включается знак перед числом)
PRINT USING "##.##-";12.0101, -6.2
(включается знак минус после числа, если оно отрицательно)
PRINT USING "$$##.##"; 12.0101
(выводится знак доллара вместе с числом)
PRINT USING "**##.##"; 12.0101
(заполняются передние пределы звездочками)
PRINT USING "**$##.##"; 12.0101
(комбинация двух выше упомянутых)
PRINT USING "#.#### ^^^^ "; 34567.12
(4 знака вставки означают использование научной натации)
-169 -
PRINT USING "-###.##"; 12.1010
(подчеркивание, предшествующее заранее определяемой формообразующей
литеры, вызывает дословный вывод литеры, а не ее использование для целей
форматообразования)
Если значение слишком велико для вывода на экран в специфицированном
формате, впереди вывода проставляется знак процента(%):
PRINT USING "#.#;27.4
Заявление PSET
---------------
Функция PSET обеспечивает построение точки на графическом экране.
------------
Синтаксис PSET (x,y) [,цвет]
--------------
Замечания (x,y) -это координаты точки, появляющейся на графическом
экране, которые можно заявлять в абсолютной и относительной форме. Цвет -
это целое выражение, которым определяется цвет точки. Для атрибута цвет
применимы нормальные режимные ограничения.При средней разрешающей способ-
ности приемлемы цветовые значения от 0 до 3; при высокой разрешающей спо-
собности возможны цветовые значения только 0 и 1.
Если цвет специфицируется, PSET и дополняющее его заявление PRESET
работают идентично. Различие между ними состоит в том, что PRESET имеет
цветовое значение по умолчанию 0 ( цвет заднего фона), тогда как PSET по
умолчанию дает максимально допустимое значение этого аттрибута (т.е. 3 в
режиме средней разрешающей способности и 1 в высокой). Другими словами,
без цветовых аттрибутов PSET включает пикселы, а PRESET их выключает.
См. также POINT
---------- PRESET
Пример " включить графический режим средней разрешающей способности
------- SCREEN 1
FOR I% = 0 ТО 359
FOR J% = 0 ТО 199
DELAY 0,01
PSET (I%,J%)
NEXT J%
NEXT I%
FOR I% = 0 ТО 359
FOR J% = 0 ТО 199
DELAY 0.01
PRESET (I%,J%)
NEXT J%
NEXT I%
END
Заявление PUT
--------------
Функция PUT записывает одну запись в произвольный файл.
-----------
Синтаксис PUT [#] файланом [, записи номер]
-----------
Замечания Файланом - это значение, специфицируемое при обработке фай
ла заявлением OPEN. Записи номер - числовое выражение, описывающее подлежа-
щую выяснению в файл запись, которое может находиться в диапазоне от 1 до
16777216.
PUT представляет собой дополнение заявления GET и обеспечивает поме-
щение в файл произвольного доступа одной записи. Запись номер является оп-
циональным аттрибутом. Если он опускается, Турбо-Бейсик использует значе-
ние, использовавшееся в последнем заявлении PUt или GET, добавляя 1.
Пример "открыть файл произвольного доступа
OPEN "GET.DTA" AS#1 LEN=18
"сделать по два определения поля для каждого элемента поля
-170 -
FIELD #1, 2AS Целое$, 4AS Длинное Целое $,4AS Единичная
точность $, 8AS Двойная точность $
FIELD#1,2AS A$, 4AS B$, 4AS C$, 8AS D$
Макс. целое % = 32767
FOR I% = 1 ТО 5 " записать несколько данных в файл
"перед записыванием в файл данные преобразовать и назначить
в буфер
LSET Целое $ = MKI$ (I%)
LSET Длинное Целое $ = MKI$(I%=CLNG (макс целое %))
LSET Единичная точность$=MKS$ (CSNG(I%*CSNG(максцелое %)))
LSET Двойная точность$ = MKD$(максцелое% ^ I%)
PUT#1,I%
NEXT I%
FOR I% = ! ТО 5 читать данные из файла
GET #1,I% отобразить их на экране
PRINT CVI (A$),CVL(B$), CVS(C$), CVD(D$)
NEXT I%
CLOSE#1 закрыть файл
END
Заявление PUT (графика)
-----------------------
Функция PUT обеспечивает отображение на графическом экране содержи-
мого числового массива.
Синтаксис PUT(x,y), массив [,опция]
----------
Замечания ( x,y ) - это координаты верхнего левого уровня угла пря-
моугольника, в который будет передаваться массив; они могут специфициро-
ваться либо в абсолютной, либо в относительной форме . Массив - это число-
вой массив, который содержит графические данные для размещения на экране.
Опция - это одно из резервированных слов, перечисляемых ниже, с по-
мощью которых осуществляется управление тем, как содержащаяся в массиве
информация будет прилагаться к уже имеющейся на экране:
----------------------------------------------------------------------
Опции PUT Действие
----------------------------------------------------------------------
PSET Карта точной копии образа в массиве
PRESET Карта копии заполнения образа в массштабе
XOR Выполнение операции XOR между образом в массиве и экраном
OR Выполнение операции OR между образом в массиве и на экране
AND Выполнение операции AND между образом в массиве и на экране
----------------------------------------------------------------------
Опция PSET вызывает помещение данных массива на экран точно в том
виде, в котором они первоначально заложены заявлением GET вне зависимости
от того, что есть в данный момент на экране. PRESET картографирует на эк-
ране образ дополнения. Например, если в каком-то пикселе оригинальные дан-
ные имели аттрибут 3, копирование через PUT на экране с атрибутом PRESET
будет давать для этого пиксела аттрибут 0 и наоборот. Точно также аттрибут
1 будет преобразовываться в аттрибут 2 и наоборот.
Опции AND,OR,XOR обеспечивают выполнение логических операций между
каждым пикселом в регионе назначения до PUT и данными в буферном масси-
ве.Когда перемещающиеся обьекты пересекают сложные задние фоны, особенно
полезна операция XOR; фактически это делается по умолчанию. Первый PUT XOR
обеспечивает вычерчивание обьекта на экране. Второе применение в том же
месте восстанавливает фон в его предыдущее состояние.
Базисная стратегия всех оживлений, основанная на GET и PUT состоит в
следующем:
DRAW обьект в прямоугольной зоне
GET обьект в массив
DO
ERASE обьект с его старого места
PUT обьект на новое место
LOOP
-171 -
Пример: " разместить буфер для хранения образа графики
DIM Буфер % (143)
"включить графический режим среднего разрешения
SCREEN 1
CIRCLE (16,16),8,2 "чертить окружность
GET(0,0) - (31,31), Буфер% "получить окружность
"копировать все это на экран
FOR I% = 0 TO 9
PUT (I%*32,100), Буфер %
NEXT I%
END
Функция PUT$
-------------
Функция PUT$ записывает строку в файл двоичного режима.
------------
Замечания PUT$ записывает содержимое строчного выражения в файл,оп-
ределяемый как файланом на позиции, определяемый заявлением SEEK для этого
файла. Файл должен быть открыт в режиме BINARY.
См. также GET
---------- OPEN
SEEK
Пример OPEN "BASIC.DOC" FOR BINARY AS1
------- PUT$ #1,BASIC - компиляторы- это 99% работы
PUT$#1, "в поте лица и 1% вдохновения"
CLOSE#1
END
Заявление RANDOMIZE
--------------------
Функция RANDOMIZE задает генератор случайных чисел.
------------------
Синтаксис RANDOMIZE [числовое выражение]
--------------------
Замечания Если числовое выражение опускается, исполнение программы о
станавливается и пользователь получает подсказкус на значение задания при
встрече с заявлением RANDOMIZE.
RANDOMIZE NUMBER SEED?
(Зададите начальное число генерирования случайных чисел)
О случайных числах.
Без повторного задания значения. возвращаемые функцией RND, случай-
ными не являются вовсе; для данного начального значения функция RND всегда
возвращает одну и ту-же последовательность значений.
Без повторного зада-
ния моделирование игры в кости будет воспроизводиться одним и тем-же спо-
собом при каждом новом прогоне программы.
Удобный способ обеспечивать уникальным каждый прогон (полагая,что
ваша программа не прогоняется каждый день в одно и то-же время) состоит в
использовании функции TIMER для обеспечения значения задания:
RANDOMIZE TIMER
Другой прием состоит в использовании заявления микротаймера с тонкой
разрешающей способностью (MTIMER) для задания времени задержки, ассоцииру-
емой с нажатием на клавишу при запуске программы. Ею далее используется
это значение для задания генератора случайных чисел:
MTIMER
PRINT "Чтобы начать нажмите любую клавишу ..."
WHILE NOT INSTAT: WEND
RANDOMIZE MTIMER
См. также RND
-------------
Пример возбудить микротаймер
------ MTIMER
-172 -
PRINT "Чтобы начать нажмите любую клавишу...."
WHILE NOT INSTAT
WEND
ПУСТО $ = INKEY$
"задать генератор случайных чисел
RANDOMIZE MTIMER
FOR I% = 1 TO 5 STEP RND (1.5)
PRINT I%
IF INSTAT THEN STOP
NEXT I%
END
Заявление READ
----------------
Функция READ загружает переменные из содержимого заявления DATA.
------------
Синтаксис READ переменная[,переменная]....
---------------
Замечания Переменная - это числовая или строчная переменная.
---------- READ загружает указанные переменные из констант, появляю-
щихся после заявления DATA. Во время прогона READ осуществляет доступ к
константам заявлений DATA в том порядке, в котором они появляются. Боль-
шинство обычных ошибок, ассоциируемых с заявлениями DATA и их считыванием,
получается из-за нарушения синхронности и попыток загрузить строку в чис-
ловую переменную. Если это случается, выдается синтаксическая ошибка
(ошибка 2 периода прогона).
Вы не получите информацию об ошибке, если ваша программа ошибается в
другом направлении, т.е. когда она загружает числовую константу в строчную
переменную.
Если вы пытаетесь обрабатывать заявлением READ большее число раз,
чем имеет констант ваша программа, Турбо-Бейсик выдает ошибку 4 периода
прогона , Вне Данных.
Заявление RESTORE позволяет вам повторно считывать константы из пер-
вого или любого специфицированного заявления DATA.
См.также RESTORE
---------
Пример " эта программа демонстрирует заявление READ
------- SUB обработки результата (студента имя $, студента средний %)
LOCAL Итог%, Значение%,,I%
Итог % = 0
READ студента имя $
FOR I% = 1 TO 10
READ значение %
Итог % = Итог% + значение %
NEXT I%
Студента средний % = итог%\10
END SUB
FOR студент% = 1 TO 3
CALL обработка результата (С имя $,средний %)
PRINT USING "& средний равен ###";Cимя $,средний %
NEXT студент%
END
Функция и заявление RFG
------------------------
Функция REG устанавливает значение в буфере регистров или возвращает
его.
Синтаксис Функция y=REG(регистр), регистр y=REG регистр, значение
----------
Замечания Регистр указывает процессорный регистр в соответствии со
--------- следующей таблицей
-173 -
---------------------------------------------------------------------
Номер Регистр
---------------------------------------------------------------------
0 Флаги
1 Ax
2 Bx
3 Cx
4 Dx
5 SI
6 DI
7 BP
8 DS
9 ES
--------------------------------------------------------------------
Если регистр вне диапазона 0-9, генерируется ошибка 5 периода прого-
на,вызов незаконной функции.
Значение - это числовое переменное или числовое выражение в диапазо-
не от 0 до 65535. REG как функция возвращает значение выбранного эле-
мента в "буфере регистров". REG как заявление вызывает загрузку указан-
ным целым значением выбранного элемента буфера регистров.
Используйте REG для подачи информации в подпрограммы на языке ассем-
блера и для получения ее из этих подпрограмм. Буфер регистров загружа-
ется в процессорные регистры непосредственно перед вызовом ABSOLUTE или
INTERRUPT. Они возвращаются на хранение сразу-же после прогона. В любое
данное время буфер содержит состояние процессорных регистров в том ви-
де, в каком они находились по завершению самой последней внешней подп-
рограммы.
Пример DEFINT a-z
------- DIM a (100)
DIM заполнение подпрограммы (10)
Заполнение подпрограммы (0)=&HF2FC
Заполнение подпрограммы (1) = &HCBAA
REG 1,-1
REG3,101^2
REG9,VARSEG [a(0)]
REG6, VARPTR [a(0)]
DEF SEG = VARSEG (заполнение подпрограммв (0) )
PRINT a(1)
WHILE NOT INSTAT:WEND
Заполнение адр. = VARPTK (заполнения подпрограмма(0))
CALL ABSOLUTE заполнение адр "(REG)
PRINT a (1)
END
Заявление REM
--------------
Функция REM отделяет замечания (комментарии)программиста
-----------
Синтаксис REM комментарий
----------
Замечания Комментарий - это любая последовательность литер. В отли-
чие от трактовки комментариев в Турбо-Бейсике, REM замечания появляются
только в исходной версии программы и следовательно ни коим образом не
воздействуют на исполнение.
Примечание: Комментарий может позволяться в строке, не содержащий
других заявлений, но он должен быть последней составляющей этой строки.
Например, следующая строка не работает:
REM теперь сложить числа:а = b+c
Посколько компилятор не может отделить где кончается комментарий и
начинается заявление.Правильно так:
a = b+c: REM теперь складываются числа.....
-174 -
Альтернативным разделителем комментария является одинарный знак ка-
вычки("). Когда используется единичная кавычка, для отделения замечаний
от других заявлений в той-же строке двоеточие не требуется.
Не пользуйтесь единичной кавычкой для отделения комментариев после
заявления DATE. Вместо этого используйте :REM.
Комментарии компилятором игнорируются и не занимают места в обьект-
ных программах, поэтому щедро ими пользуйтесь.
Пример REM эта программа демонстрирует заявление REM
------- PRINT "эта программа демонстрирует заявление REM
REM "END"
END
DATA 1,2,3,Я вернусь! :REM комментарий
Заметьте,что единичная кавычка не трактуется как комментари,й.
Заявление RESET.----------------
Функция RESET закрывает и убирает все дисковые файлы.
--------------
Синтаксис RESET
---------------
Замечания RESET - это то-же, что заявление CLOSE без аргументов.
Заявление RESTORE
------------------
Функция RESTORE позволяет вновь считывать константы заявлений DATA.
---------------
Синтаксис RESTORE [метка]
------------------
Замечания Метка - опциональный аргумент, указывающий заявление DATA,
к которому будет иметь доступ следующее заявление READ. RESTORE вы-
зывает повторную установку Турбо-Бейсиком его счетчика заявлений DATA
таким образом, что когда встречается следующее заявление READ, вновь
используйте первый элемент первого (или указанного) заявления.
См. также READ
----------
Пример "считать несколько данных и восстановить указатель данных
------ READ A$,B$
RESTORE
"считать еще несколько данных
READ C$,D$
"отобразить данные
PRINT A$,B$,C$,D$
"поставит указатель данных на первые данные после метки
RESTORE еще данные
" считать и отобразить данные
READ A$,B$
PRINT A$,B$
END
"определить несколько данных
DATA Кошка Собака
Еще данные:
DATA Обезьяна Гну
Заявление RESUME
-----------------
Функция RESUME повторно запускает исполнение после обработки ошибки.
---------------
Синтаксис RESUME [(0INEXTIметка)]
------------------
Замечания RESUME и RESUME O вызывает возобновление исполнения с за-
явления, которое вызвало ошибку. RESUME NEXT вызывает возобновление ис-
-175 -
полнения с заявления, непосредственно следующего за вызвавшим ошибку.
RESUME метка вызывает возобновление исполнения с кода идентифицируе-
мого меткой.
Если заявление RESUME встречается когда программа не находится в
подпрограмме отслеживания ошибок, это приводит к возникновению ошибки
20 периода прогона. Возобновление без ошибки.
Примечание: Заявление ERL, RESUME,RESUME NEXT вызывает генерирование
компилятором 4-байтового указателя для каждого заявления программы. По-
этому программисты, интересующиеся размером генерируемого или кода,
должны принимать это во внимание. Использование заявления RESUME [стро-
ка#] генерирует инструкцию перехода. ERRL обычно используется для от-
ладки, поэтому сказанное имеет к нему, вероятно, малое отношение.
Пример " установить ловушку ошибок
------- ON ERROR GOTO Ошибкиобработчик
"это заявление вызывает ошибку периода прогона
I# = LOG (-1)
PRINT "Была отслежена ошибка...."
END
Ошибкиобработчик
-----------------
PRINT "Ошибка" FRR "при" ERL
RESUME NEXT
Заявление RETURN
-----------------
Функция RETURN обемпечивает возврат из подпрограммы в вызывающую
программу.
Синтаксис RETURN [метка]
----------
Замечания Метка идентифицирует строку, к которой вы опционально мо-
жете направить поток программных кодов.
RETURN прекращает выполнение подпрограммы и передает управление за-
явлению, следующему непосредственно за вызовом GOSUB.
Опциональная метка конструируется для облегчения возврата из подп-
рограмм отслеживания и обработки ошибок. RETURN метка отбрасывает адрес
верхней части стека и выполняет заявление GOTO к заявлению, идентифицируе-
мому меткой. В некоторых версиях Бейсика эта операция выполняется с по-
мощью POP и GOTO.
При RETURN без GOSUB, ему предшествующего, будут вызываться неожи-
данные и трудно прослеживаемые ошибки.
Мы настоятельно рекомендуем для вы-
явления подобных ошибок включать тестирование стека в вытягиваемых вниз
меню опций.
См. также GOSUB
---------- GOTO
Пример См. пример в описании GOSUB
-------
Функция RIGHT$
--------------
Функция RIGHT$ возвращает n самых правых литер целевой строки.
--------------
Синтаксис s$=RIGHT$ (строчное выражение,n)
----------
Замечания n- это целое выражение, специфицирующее число литер в
строчном выражении, подлежащих возврату, оно может находиться в диапазоне
от 0 до 32767.
RIGHT$ возвращает указанное число литер из ее строчного аргумента,
начиная с правой стороны и работая влево. Если n больше длины строчного
выражения, возвращается все строчное выражение.Если n равно 0, RIGHT$ воз-
вращает ноль-строку.
-176 -
См. также LEFT$
--------- MID$
Пример RIGHT$ ("ДЖОН ДЖОНС",5)
Заявление RMDIR
---------------
ФУНКЦИЯ RMDIR снимает справочник (подобно DOS команде RMDIR)
--------------
Синтаксис RMDIR проход
---------
Замечания Проход - это строка стандартного описания прохода. RMDIR
снимает справочник указываемый проходом. Зто заявление эквивалентно
DOS-команде RMDIR (за исключением того, что оно не может представляться
аббревиатурно). К нему применимы те-же ограничения, а именно то, что проход
специфицирует законный, пустой справочник.
Если справочник не пуст, возникает ошибка 75 периода прогона, ошибка
доступа к прходу/файлу.
Пример "настроить обработчик ошибок
------ ON ERROR GOTO ошибкообработчик
INPUT "Вводимое имя снимаемого справочника:",D$
RMDIR D$ " снимается справочник
END
Ошибкообработчик:
PRINT "Ошибка" ERR "при" ERADR
RESUME NEXT
Функция RND
------------
Функция RND возвращает случайное число
--------
Синтаксис y=RND (числовое выражение)
Замечания RND возвращает случайное значение двойной точности между 0
и 1 . Числа, генерируемые RND, в действительности случайными не являются,
а представляют собой результат применения алгоритма псевдослучайного пре-
образования начального или задающего значения. При одном и том-же задающем
значении RND алгоритм Турбо-Бейсика всегда дает одну и ту-же цепочку "слу-
чайных" чисел.
Качество работы RND зависит от опционального числового значения, ко-
торое вы обеспечиваете в качестве аргумента. При отсутствии аргумента или
с положительным аргументом RND генерирует следующее число последователь-
ности, базирующееся на ее начальном задающем значении.
При аргументе равном 0 функция RND повторит число, генерированное
последним.
Отрицательный аргумент вызывает перезадание генератора случайных чи-
сел таким образом, что последующее использование RND без аргумента или с
положительным аргументом дает новую последовательность значений.
Как правило используйте при запуске вашей программы RANDOMIZE TIMER
для получения новой последовательности значений с помощью заявления RND.
Не применяются нулевой или отрицательные аргументы, если вы не преследуюте
цель наблюдать за особыми эффектами, вызываемыми этими значениями чтобы
получить случайные целые между 1 и n, включая границы, применяйте следую-
щий прием: случайное число % =INT (RND=n)+1
Еще лучше создавать его как функцию:
DEF FN Случцел%(x%)=INT (RND*x%)+1
См. также RANDOMIZE
---------
Пример FOR I=1 TO 10 STEP 1.34
-------- PRINT USING "###.##^^^^";RND(x!)
NEXT I!
END
-177 -
Заявление RSET
----------------
Функция RSET перемещает строчные данные в буфер произвольного файла.
Синтаксис RSET переменная поля=строчное выражение
---------
Замечания RSET и LSET перемещают строчные данные в "переменные по-
ля", которые уже определены в предыдущем заявлении FIELD , как принадлежа-
щие буферу произвольного файла. Если длина строчного выражения меньше раз-
меров переменной поля, специфицируемой в заявлении FIELD, это поле вырав-
нивается заявлением RSET вправо посредством заполнения пробелами. Это оз-
начает, что пробелы вставляются перед первой литерой строчного выражения
таким образом, чтопосле операции RSET параметр LEN (переменной поля) оста-
ется равным ширине, определенной в соответствуюшем заявлении FIELD.
LSET осуществляет левое выравнивание заполнением пробелами (пробелы
добавляются после последней литеры строчного выражения)
RSET можно также использовать для образования формата вывода на эк-
ран или печатающее устройство:
a$ = пробел$(20)
RSET a$ = "Выравнять вправо"
PRINT a$
См. также LSET
---------
Пример OPEN "RSET.DTA"AS#1 LEN = 18
------- " определить имена и размеры полей файла
FIELD 1,2 AS Заполнить целым $, 4AS заполнить длинным $, 4 AS
заполнить еденичным$, 8 AS заполнить двойным $
"назначить несколько значений полям и поместить запись в файл
произвольного доступа
FOR счетчик %=1 TO 5
RSET заполнить целым $=MKI$(счетчик %)
RSET заполнить длинным $=MKL$(счетчик%^2)
RSET заполнить еденичным$=MKS$(счетчик%^2.1)
RSET заполнить двойным$=MKD$(счетчик%^4.4)
PUT1, счетчик %
NEXT счетчика %
CLOSE 1 "закрыть файл
END
Заявление RUN
--------------
Функция RUN повторно запускает программу
------------
Синтаксис RUN[файласпец]
----------
Замечания RUN без аргумента вызывает повторный запуск самой програм-
мы на Турюо-Бейсике. Все числовые переменные (включая элементы массивов)
повторно устанавливаются в 0, а строчное переменное - в нуль-строку.
Если включается файласпец, этот аргумент представляет собой строчное
выражение для имени файла. TBC или EXE (получаемый с помощью цепочки меню
опций или при усиановке компилирования EXE). Если файласпец не имеет удли-
нения, предполагается TBC; если удлинение есть, оно и используется. Если
прогон или установление цепочки на EXE-файле, вы должны явно добавлять к
имени вашего файла удлинение EXE.
Пример "компилировать программу в файл, вызываемой
------- MASTER.EXE
"ввести имя SLAVE в ответ
" на эту подсказку
INPUT "введите имя программы для RUN:",N$
RUN N$ "прогнать указанную программу
END
"компилировать эту программу в SLAVE.TBC с компилированием
на вход цепочки из меню опций
PRINT "Теперь мы в программе SLAVE"
-178 -
END
Функция SCREEN
----------------
Функция SCREEN возвращает код ASCII литеры специфицированного ряда и
колонки
Синтаксис y=SCREEN (ряд,колонка[,опция])
-----------
Замечания Ряд и колонка - это целые выражения, которые могут быть в
диапазоне от 1 до 25 и от 1 до 80,соответственно.
Функция SCREEN представляет собой копию функции POINT графических
режимов для режимов текстовых. Она возвращает информацию о литере в специ-
фицированных ряду и колонке; например, SCREEN1,1 возвращает код ASCII ли-
теры в ряду 1, колонке 1.
Если опциональный параметр опция устанавливается в 1, это будет воз-
врат функций SCREEN хранимого атрибута(по адресу ряд, колонка), а не литеры.
Пример LOGATE 10,10
------ PRINT "ASCII"
"Кодом ASCII для "A" является 65; аттрибутом отображения по
умолчанию (белое на черном) является 7
PRINT SCREEN (10,10),SCREEN(10,10.1)
END
Заявление SCREEN
-----------------
Функция SCREEN устанавливает режим экранного отображения .
---------------
Синтаксис SCREEN[режим][,[цветафлаг]][,[а-страница]][,[в-страница]]
-----------------
Замечания Режим-это целое выражение в диапазоне от 0 до 10, имеющее
следующее децствие:
---------------------------------------------------------------------
Режим Действие
---------------------------------------------------------------------
0 Установить текстовый режим без измерения ширины
1 Устанавливается графический режим со средней разрешающей спо-
собностью; изменения ширины на 40
2 Устанавливается графический режим с высокой разрешающей способн
остью; изменение ширины на 80
7 Устанавливается режим со средней разрешающей способностью на EGA
допускающий 16 цветов и 640x200 пиксел
8 Устанавливается режим с высокой разрешающей способностью на EGA,
допускающий 16 цветов и 640x200 пиксел
9 Устанавливается улучшенный режим высокой разрешающей способности
на EGA c улучшенным дисплеем; допускается 4 или 16 цветов ( в
зависимости от памяти EGA) из палитры в 64 цвета и 640x350 пиксел.
10 Устанавливается режим высокой разрешающей способности на EGA с
моно хромным монитором; разрешается 4 аттрибута и 640x350 пиксел
----------------------------------------------------------------------
Цветафлаг управляет тем, будет ли цветовая информация подаваться на
композитные мониторы,которые подключаются к композитному устройству ви-
део-выхода цветного /геометрического адаптера. В текстовом режиме значени-
ем FALSE(0) цвет выключается. В графических режимах средней разрешающей
способности цвет значением FALSE включается.
а-страница-это целое выражение в диапазоне от 0 до 7буправляющее
страницей текста,подлежащей записи, когда PRINT и другие команды вывода
осуществляют запись на экран. Этот аргумент является законным только на
цветном/графическом адаптере (CGA) и улучшенном графическом адаптере (EGA)
и для экранных режимов 0,7,8,9,10. См. раздел о графике в главе 4.
-179 -
в-страница обеспечивает выбор того, какой из возможных экранов(0-7)
действительно отображается.Этот аргумент является законным только на цвет-
ных/графических адаптерах и улучшенных графических адаптерах для экранных
режимов 0,7,8,9 и 10.
Исполнением заявления SCREEN вызывается начало действия нового режи-
ма и экран подлежит очистке. Цвет фона устанавливается белым, а цвета зад-
него фона и бордюров-черным.
Если режим специфицируемый в заявлении SCRREN тот-же, что текущий,
не происходит ничего.
Если режим является текстовым и включаются только аргументы а-стра-
ницы и в-страницы, то отображение настраивается на страницу и регулируется
соответственно требуемому.
Пример "включить графику со средним разрешением при запрещенном цвете
------ SCREEN 1,0
CIRCLE (160,100)50,2
WHILE NOT INSTAT:WEND
A$=INKEY$
"включить текстовый режим с запрещенным цветом и активную и
видимую страницы установить на страницу 0
SCREEN0,0,0,0
PRINT "активной страницей является страница 0 "
WHILE NOT INSTAT :WEND
A$=INKEY$
" изменить активную страницу на страницу 2
SCREEN,,2
PRINT "активной страницей является страница 2
WHILE NOT INSTAT:WEND
A$=INKEY$
"теперь переключить на графический режим высокого разрешения
SCREEN 2
CIRCLE (320,100),100,1
END
Заявление SEEK
---------------
Функция SEEK устанавливает позицию в двоичном файле для заявлений
GET$ и PUT$ .
Синтаксис SEEK [#] файланом, позиция
--------------
Замечания SEEK заявляет, что следующее GET$ или PUT$, выполняемое на
файле файланом будет реализовываться на глубине файла равной позиция бай-
тов. Файл файланом должен быть открыт в режиме BINARY.
Для возврата текущей SEEK - позиции в двоичном файле используйте
функцию LOG.
См. также LOG
---------
Пример SUB создать файл
------ "SEEK открывает и в него записывается 256 литер
LOGAL I%
"открыть файл для двоичного ввода/вывода
OPEN"SEEK.DTA" FOR BINARY AS#1
"записать в него несколько данных
FOR I% = 1TO 256
PUT$1, CHR$(I%-1)
NEXT I%
END SUB "конец процедуры создать файл
DEF FN читать это $ (начало%,размер%)
"эта функция читает указанные данные из файла
LOGAL Врем Стр$,Лит$,I%
"искать правильную позицию в файле
SEEK 1, Начало %
-180 -
I%=1
ВремСтр $=" "
"читать указанные данные -- не читать после конца файла
WHILE (NOT EDF(1) AND (I%<=Размер %)
GET$1, I%, Лит$
Врем Стр $ = Врем Стр$ + Лит $
INCR I%
WEND
"назначить результат функции
FN читать это$ = Врем Стр $
END DEF " конец функции читать это $
"создать файл данных
CALL создать файл
"получить пользовательский ввод
PRINT " введите начальную точку [1....256] и сколько"
PRINT "байтов данных (256-начальная точка) вы желаете
INPUT "считать из файла:Нач%,РЕЗ%
Читать данные
PRINT FТ читать это $ (Нач%,Рез %)
END
Заявление SELECT
------------------
Функция SELECT возвращает заявление общецелевого тестирования.
---------------
Синтаксис SELECT CASE выражение
--------------
CASE заявление списков тестов
[CASE заявление списков тестов]
[CASE ELSE заявление]
END SELECT
Замечания список тестов - это один или более тестов, разделяемых за-
пятыми, которые подлежат выполнению над выражением. Выражение может быть
строчным или числовым, но все списки тестов в блоке SELECT должны быть од-
ного и того-же типа.
Тесты, которые могут быть выполнены посредством включения статьи
CASE охватывают тестирование равенства, неравенства, больше чем, меньше
чем и диапазона ("от до"). Примерами тестов, включенных в статью CASE яв-
ляются:
CASE <b "относительный
CASE 14 "равенство (предполагается "=")
CASE b TO 99 "диапазон
CASE 14,b " два теста равенства
CASE b TO 99,14 "комбинации (неявное ИЛИ)
В одной и той-же статье CASE имеет место неявная операция логическо-
го ИЛИ между множеством тестов.
Если обнаруживается, сто один или несколь-
ко тестов оказываются TRUE (истинными), исполняются все заявления, вплоть
до следующей CASE-статьи. После последнего заявления управление переходит
к тому заявлению, которое следует за END SELECT.
Заявление SELECT является мощным инструментом срвнения переменной с
рядом возможных значений и последующего продолжения в соответствии с его
результатом.
Используя это заявление можно создать более четкую исходящую прог-
рамму, чем вы получаете с применением множества IF.
См. также END SELECT
--------- EXIT CASE
Пример INPUT "Вводное число", x
------ SELECT CASE x
CASE < 10
PRINT "малое число"
CASE < 1000
-181 -
PRINT " среднее число"
CASE 1111,2222,3333,4444
PRINT "колибрующее число"
CASE ELSE
PRINT "только другое большое число"
END SELECT
Функция SGN
------------
Функция SGN возвращает знак числового выражения.
-----------
Синтаксис y=SGN (числовое выражение)
--------
Замечания Если числовое выражение положительно, SGN возвращает +1.
Если числовое выражение равно 0, SGN возвращает 0. Если числовое выражение
отрицательно, SGN возвращает -1.
В сочетании с заявлением ON/GOTO и ON/GOSUB функция SGN может давать
тринаправленное ветвление, подобное имеющемуся в ФОРТРАНЕ:
ON SGN (баланс) + 2 GOTO Вкрасном, РазрывЧетного, Вденьгах
См. также ON/GOSUB
--------- ON/GOTO
Пример " установить x и y в 0
------ x=0;y=0
"пользователь определяет x и y
INPUT "Пожалуйста, вводное значение для x";x
INPUT "Пожалуйста, вводное значение для y", y
" с помощью ON по значению знака x+y осуществить переход
GOSUB к подходящей подпрограмме
ON SGN (x+y) +2 GOSUB Минус, Ноль, Плюс
END
Минус:
PRINT "Вход по минусу" : RETURN
Ноль:
PRINT "Вход по нулю" :RETURN
Плюс
PRINT "Вход по плюсу" : RETURN
Заявление SHARED
-----------------
Функция SHARED заявляет разделяемые (глобальные) переменные в проце-
дуре или функции.
Синтаксис SHARED список переменных.
-----------------
Замечания SHARED определяет переменные своего разделяемого запятыми
списка переменных как глобальные для программы в целом, а не ограничиваю-
щиеся сферой определения процедуры или функции. Это обеспечивает процедуре
или функции доступ к переменным без необходимости подавать их как парамет-
ры.Заявление SHARED может появляться только в определениях процедур и фун-
кций и должно предшествовать любым исполнительным заявлениям соответствую-
щего определения. Чтобы заявить массив как разделяемую переменную, принад-
лежащую процедуре или функции, включайте его идентификатор и пустой набор
скобок в список переменных - вам нет необходимости образмеривать его вновь.
Незаявленные переменные в определениях функций по умолчанию являются
разделяемым аттрибутом , но вы не должны рассчитывать на переменность это-
го умолчания в будущих версиях компилятора. Вы должны явно заявлять все
переменные которые появляются в функции или процедуре, соответственно их
классу. (LOCAL,STATIC,SHARED)
См. также LOCAL
--------- STATIC
-182 -
Пример DIM массив $ (5)
------ DEF FN Пусто$
SHARED массив $
FN Пусто $ = массив (0)
END DEF 'конец функции FN Пусто $
Массив $ (0) = Это работает для меня
PRINT FN Пусто $
END
Заявление SHELL
----------------
Функция SHELL загружает и исполняет порождаемую обработку
--------------
Синтаксис SHELL [строка параметров ]
---------------
Замечания Строка параметров - это строчное выражение которое содержит
------------ имя программы. COM,.EXE или BAT (порождаемая обработка),
подлежащей прогону, и опционально параметры, которые вы можете пожелать
подать в порождаемую обработку. Если строка параметров опускается, никакая
программа не загружается. Вместо этого появляется DOS-подсказка и вы може-
те вводить стандартные DOS-команды; например DIR (справочник), COPY(копи-
ровать). Вы можете возвращаться в вашу программу набирая в DOS - подсказке
EXIT(уход).
Если строка параметров включается, то исполняется специфицируемая
программа. Когда она завершается, ваша программа продолжается со следующе-
го заявления.
См. также ENVIRON
--------- ENVIRON $
SHELL в DOS - руководстве.
Пример PRINT "Теперь мы будем использовать заявление SHELL ТУР-
БО-Бейсика"
PRINT "для выдачи DOS-команды DIR/W"
PRINT "с целью просмотреть какие файлы имеются на вашем при-
воде"
DELAY 3 'ждать 3 секунды
Использовать SHELL с целью покинуть Турбо-Бейсик и выдать
DIR с опцией /W
SHELL "DIR/W
Выводить в нижней части дисплея
LOGATE 21'1
PRINT "Теперь вернемся в Турбо-Бейсик"
END
Функция SIN
-------------
Функция SIN возвращает тригонометрический синус.
-----------
Синтаксис y=SIN (числовое выражение)
---------
Замечания Числовое выражение - это угол, специфицируемый в радианах.
Чтобы преобразовать радианы в углы, умножайте на 57.296. Чтобы преобразо-
вать углы в радианы, делите на 0,17453. (см. пояснения к радианам в описа-
нии заявления ATN).
SIN возвращает результат двойной точности.
См. также ATN
--------------
Пример Выбрать значение для в $ для вывода в образчике
------- в $ ="Турбо-Бейсик из Борленда"
-183 -
"найти центр
центр - (79 - LEN ($) /2
SIN (тэта) возвращает повторяющуюся равномерную последова-
тельность в диапазоне от -1 до 1 таким образом, что таб значение находится
всегда между - центр и + центр
таб значение = центр*SIN (тэта)
PRINT TAB (центр + таб значение +1) в $
тэта = тэта+ 1
WEND
END
Заявление SOUND
---------------
Функция SOUND генерирует тон специфицированой частоты и продолжи-
тельности.
Синтаксис SOUND частоты, продолжительности.
----------
Замечания Частота - это целое выражение, представляющее желаемую вы-
соту тона в диапазоне от 37 до 32767 герц. Продолжительность - это выраже-
ние с плавающей точкой, которое указывает длительность тона, измеряемой в
тиканьях часов. Тиканья часов происходят с интенсивностью 18,2 раза в се-
кунду так что значение продолжительности 36 соответствует примерно 2 се-
кундам. Продолжительность может находиться в диапазоне от 0,0015 до 65535
(один час).
Заявление SOUND не задерживает исполнение программы. Когда оно вст-
речается, начинается требуемый тон, а исполнение продолжается нормально.
Если встречается другое заявление SOUND и параметр продолжительносьи в но-
вом заявлении равен 0, то предыдущее SOUND выключается. Перед исполнением
нового заявления SOUND Турбо-Бейсик ожидает завершения исполнения первого.
SOUND при создании специальных эффектов лучше музыки.
Ограничения Следует заметить, что заявление SOUND , будет вновь воз-
буждать микротаймер MTEMER.
См. также PLAY
---------
Пример настроить музыкальный буфер на 800 байтов
------- $ SOUND 100 ' 8 байтов на ноту
использовать SOUND для создания звуковых эффектов имитирую-
щих изменеия в коробке передач мотоцикла
'первая передача
FOR i=150 TO 175
SOUND i,2
NEXTI
'вторая передача
FOR j=125 TO 152
SOUND j,1.5
NEXTj
'третья передача
FOR k=100 TO 127
SOUND k,1.25
NEXTk
Функция SPACE $
----------------
Функция SPACE $ возвращает строку, состоящую из одних пробелов.
--------------
Синтаксис а$=SPACE $ (счетчик)
--------------
Замечания Счетчик - это целое выражение в диапазоне от 0 до 32767
которым специфицируется сколько пробелов должна возвращать эта функция.
SPACE $ - это одно из многих средств форматообразования текстов,
имеющихся в Турбо-Бейсике.
-184 -
См. также LSET
--------- PRINT USING
RSET
SPC
STRING $
TAB
Пример резервировать 46 пробелов для aS
------ aS = SPACE (46)
сделать строку длиной 46 литер
в $ = 'это строка длиной 46 литер'
сделать то-же, что a$, используя с$="
'вывести длины a$,в$, c$
PRINT LEN (a$),LEN (в$),len (c$)
PRINT "как вы можете видеть ........
PRINT "я могу дать а$ то-же значение
END
Устройства
COM (n) Управляет прерываниями, связанные с событиями
последовательного порта
INP Читает из порта ввода/вывода.
IOCTL/IOCTL$ Работают с драйвером устройства.
OPEN COM Открывает и конфигурирует коммуникационный порт.
OUT Пишет в порт ввода/вывода.
DOS
CHDIR Изменяет текущий каталог (команда CD DOS).
KILL Удаляет файл (подобно команде DEL DOS).
MKDIR Создает каталог (подобно команде MKDIR DOS)
RMDIR Удаляет каталог (подобно команде RMDIR DOS)
SHELL Загружает и выполняет порожденный процесс (только
для версии 3.0 DOS).
SYSTEM Завершает программу.
Обработка_ошибок
ERADR Возвращает адрес самой последней ошибки.
ERRDEV/ERRDEV$ Возвращает информацию драйвера устройства.
ERL/ERR Возвращает номер строки и код последней ошибки.
ERROR Имитирует ошибку выполнения.
Файлы
BLOADS Загружает файл ВSAVED в память.
BSAVE Сохраняет на диске содержимое памяти в заданном
диапазоне адресов.
CLOSE Закрывает файл или устройство.
EOF Возвращает состояние конца файла.
FIELD Определяет переменные поля в буфере файла с
произвольным доступом.
FILES Выводит содержимое каталога (подобно команде DIR DOS)
GET(файлы) Читает запись из файла с произвольным доступом.
GET(графика) Считывает часть экрана или весь экран в массив.
LINE INPUT# Считывает строку из последовательного файла в
символьную переменную, игнорируя разделители.
LOC Возвращает текущую позицию в файле.
LOF Возвращает длину файла.
LSET Пересылает символьные данные в буфер файла.
NAME Переименовывает файл (подобно функции RЕN DOS).
OPEN Готовит файл или устройство к записи или чтению.
PRINT#, Записывает в файл сформатированную информацию.
PRINT# USING
PUT Записывает запись в файл с произвольным доступом.
PUT$ Записывает строку в файл в двоичном режиме.
RESET Закрывает и сбрасывает все дисковые файлы.
RSET Пересылает символьные данные в буфер файла с
произвольным доступом.
SEEK Устанавливает позицию в двоичном файле для GET$
и РUT$.
WRITE# Выводит данные в последовательный файл.
Управление_ходом_программы
CALL Вызывает процедуру, подпрограмму.
CALL ABSOLUTE Вызывает процедуру на языке ассемблер.
CALL INTERUPT Вызывает системное рперывание.
DEF FN/END DEF Определяет функцию.
DO/LOOP Строит цикл с проверкой вначале и/или в конце
END Завершает выполнение программы или определяет конец
структурного блока.
1
EXIT Преждевременный выход из структуры.
FOR/NEXT Задает цикл с автоматически возрастающим (или
уменьшающимся параметром цикла).
GOSUB Вызывает подпрограмму.
GOTO Направляет ход программы на оператор,
идентифицируемый меткой.
IF Проверяет условие и изменяет ход программы, если
условие выполнено.
IF BLOCK Создает последовательность операторов IF.
INLINE Объявляет встроенный машинный код.
RESUME Перезапускает выполнение программы после обработки
ошибки.
RETURN Возвращает управление из подпрограммы в вызывающую
программу.
SELECT Формирует оператор проверки общего назначения.
STOP Останавливает программу.
SUB/END SUB Определяет процедуру (подпрограмму).
WHILE/WEND Строит цикл с проверкой в начале.
Графика
CIRCLE Рисует круг или часть круга.
DRAW Изображает контур на графическом экране.
LINE Рисует прямую линию или прямоугольник.
PAINT Закрашивает замкнутую область на графическом экране
выбранным цветом.
PEEK Возвращает байт, записанный в заданную ячейку
памяти.
PEN (функция) Читает состояние светового пера.
PEN (оператор) Управляет проверкой событий, связанных со световым
пером.
PMAP Переводит физические координаты в пользовательские
и наоборот.
POINT Определяет цвет пиксела или информацию LPR.
POKE Записывает бай по заданному адресу.
PRESET Изображает точку на графическом экране.
PSET Изображает точку на графическом экране.
PUT Изображает на графическом экране содержимое
числового массива.
VIEW Определяет активную область (после изображения)
графического окна.
WINDOW Определяет графическую систему координат.
Аппаратные_события
ON COM (n) Создает подпрограмму обработки прерывания по
событиям последовательного порта.
ON ERROR Определяет процедуру обработки ошибки и включает
прерывания по ошибке.
ON /GOSUB Вызывает одну из нескольких возможных подпрограмм в
соответствии со значением числового выражения.
ON /GOTO Направляет ход программы по одному из нескольких
возможных адресов в зависимости от значения
числового выражения.
ON KEY(n) Объявляет подпрограмму обработки прерывания,
получающую управление при нажатии заданной клавиши.
ON PEN Объявляет подпрограмму обработки прерывания,
получающую управление, если начинается работа со
световым переом.
ON PLAY Объявляет подпрограмму обработки прерывания,
получающую управление, если буфер фоновой музыки
2
содержит меньше заданного количества нот.
ON STRIG Объявляет подпрограмму обработки прерывания,
связанных с кнопками джостика.
ON TIMER Объявляет подпрограмму обработки прерывания,
которая получает управление каждые n секунд.
STICK Возвращает информацию о позиции джостика.
STRIG (функция) Возвращает состояние кнопок джостика.
STRIG (оператор) Управляет проверкой событий, связанных с
кнопками джостика.
WAIT Ждет заданных условий состояния кнопок клавиатуры.
Ввод
INKEY$ Читает с клавиатуры.
INPUT Запрашивает у пользователя значения, которые будут
присвоены одной или нескольким переменным.
INPUT# Присваивает переменным данные из последовательного
файла.
INPUT$ Читает заданное число символов с клавиатуры или из
файла.
INSTAT Возвращает состояние клавиатуры.
LINE INPUT Считывает строку с клавиатуры в символьную
переменную, игнорируя разделители.
READ Загружает переменне константами из оператора DATA.
RESTORE Позволяет повторно читать константы оператора DATA.
Управление_клавиатурой
KEY Устанавливает и воспроизводит назначения
функциональных клавиш и определяет значения
прерываний по клавишам.
KEY (n) Включает и выключает прерывание по определенной
клавише.
Управление_памятью
CLEAR Очищает память переменных.
DEF SEG Определяет сегмент данных, который используется
операторами BLOAD, BSAVE, CALL ABSOLUTE, PEEK, POKE
END MEM Возвращает адрес конца физической памяти.
ERASE Удаляет динамические массивы и возвращает в
исходное состояние.
FRE Возвращает количество свободной памяти, которая
доступна вашей программе.
МEМSET Объявляет вурхнюю границу памяти.
POKE Записывает бай по заданному адресу.
VARPTR Возвращает адрес переменной.
VARPTR$ Возвращает указатель переменной в символьном
формате.
VARSEG Возвращает адрес сегмента переменной.
Меткаоператоры
$COM Размещает принимающий буфер последоватльного порта.
$DYNAMIC Объявляет динамическими массивы, размещение которых
выполняется по умолчанию.
$EVENT Управляет генерацией кода прерывания по событиям.
$IF/$ELSE/$ENDIF Определяет части исходной программы, которые
компилируются или пропускаются в зависимости от
условий.
$INCLUDE Включает текстовый файл.
$SEGMENT Объявляет новй сегмент кода.
$SOUND Объявляет емкость буфера фоновой музыки.
$STACK Задает размер стека для прогона программы.
3
$STATIC Объявляет статическими массивы, выполнение которых
выполняется по умолчанию.
Смешанные_команды
DATA Объявляет константы для оператора READ.
DELAY Устанавливает задержку.
REG Устанавливает или возвращает значение в регистровом
буфере.
SWAP Обменивает значение двух переменных.
Числовые_операции
ABS Возвращает абсолютное значение.
ASC Возвращает ASCII код первого символа строки.
ATN Возвращает значение тригонометрического арктангенса
CDBL Преобразует число в формат с двойной точностью.
CEIL Возвращает наименьшее целое, большее или равное
аргументу.
CINT Преобразует в целое.
CLNG Преобразует в длиное целое.
COS Возвращает значение тригонометрического косинуса.
CSGN Преобразует числовое выражение в эквивалентное ему
число.
CVI/CVL/CVS/CVD/ Преобразует символьные данные, прочитанные из
файла с произвольным доступом в числовую форму.
CVMD/CVMS Преобразует символьные переменные, прочитанные
из файла с произвольным доступом в формате Microsoft
числовую форму.
DECR Уменьшает значение переменной.
DEFINT/DELNG/ Объявляет тип идентификаторов переменных,
DEFSNG/DEFDBL/ установленный по умолчанию.
DEFSTR
EXP Возвращает e в степени Х.
EXP2 Возвращает 2 в степени Х.
EXP10 Возвращает 10 в степени Х.
FIX Округляет до целого.
INCR Увеличивает значение переменной.
INT Преобразует числовое выражение в целое.
LOG Возвращает значение натурального (по основанию e)
логарифма.
LOG2 Возвращает значение логарифма по основанию 2.
LOG10 Возвращает значение логарифма по основанию 10.
MKI$/MKL$/MKS$/ Преобразует числовые данные в (для
MKD$ файлов с произвольным доступом).
MKMD$/MKMS$ Преобразует числовые данные в формате Microsoft (для
файлов с произвольным доступом).
RANDOMIZE Устанавливает начальное значение для генератора
случайных чисел.
RND Возвращает случайное число.
SGN Возвращает знак числового выражения.
SIN Возвращает значение тригонометрического синуса.
SQRT Возвращает значение квадратного корня.
TAN Возвращает значение тригонометрического тангенса.
Вывод
PRINT Посылает данные на экран.
PRINT USING Посылает на экран сформатированную информацию.
SPC Пропускает n пробелов (используется в опреаторах
4
PRINT)
TAB Устанавливает табуляцию на заданную позицию вывода
n (используется в опреаторах PRINT).
WRITE Посылает на экран данные, разделенные запятыми.
Печатающее_устройство
LPOS Возвращает позицию курсора в буфере печатающего
устройства.
LPRINT/ Посылает данные на принтер.
LPRINT USING (LPT1:)
Экран
CLS Очищает экран
COLOR Задает цвет
COLOR Задает цвет для графических операций
CSR LIN Возвращает текущую вертикальную позицию курсора
(номер строки)
LOCATE Размещает курсор и/или определяет размер указателя
(курсора)
POS Возвращает текущую горизонтальную позицию курсора
(номер колонки )
SCREEN(файлы) Возвращает ASCII-код символа в заданной строке и
колонке
SCREEN(графика) Устанавливает режим изображения на экране
WIDTH Устанавливает логическую длину строки
Звук
PLAY(функция) Возвращает число нот в буфере фоновой музыки
PLAY(оператор) Возвращает число нот в буфере фоновой музыки
SOUND Генерирует тон заданной частоты и длительности
Символьные_операции
BIN$ Возвращает двоичный символьный эквивалент числа
CHR$ Преобразует ASCII код в односимвольную строку
GET$ Читает в символьном формате данные из файла,
открытого в режиме BINARY.
HEX$ Преобразует число в шестнадцатиричный символьный
эквивалент
INSTR Просматривает строки в поисках заданного шаблона
LCASE$ Возвращает строку, состоящую только из прописных
букв
LEFT$ Возвращает n самых левых символов в строке
LEN Возвращает длину строки
MID$ Возвращает символьную строку
MID$ Замещает символьную строку
OCT$ Возвращает строку, представляющую значение числа в
восьмеричном (по основанию 8) виде
RIGHT$ Возвращает n самых правых символов строки
SPACE$ Возвращает строку, состоящую из n пробелов
STR$ Возвращает символьный эквивалент числа
STRING$ Возвращает строку, состоящую из многократных копий
заданного символа
UCASE$ Возвращает строку, состоящую только из строчных
букв
VAL Возвращает числовой эквивалент строки
5
ПРИЛОЖЕНИЕ_I
Подготовка_к_работе_ТУРБО_БЕЙСИКА
Программа TBINST.COM позволяет
* задавать маршрут для файлов, выполняющих настройку, и файлов со
вспомогательной информацией (help)
* приспосабливать клавиатуру
* модифицировать режимы редактора, устанавливаемые по умолчанию
* настраивать режим работы с экраном по умолчанию.
Если вы хотите хранить файлы со вспомогательной информацией
(TBHELP.TBH) и/или файлы настройки (TBCONFIG.TB) не в том
каталоге, где хранится ТВ.ЕХЕ, а в другом, вам потребуется режим
работы с каталогами ТУРБО БЕЙСИКА для задания маршрута поиска этих
файлов.
Если вы не знакомы с редактором ТУРБО БЕЙСИКА или прикованы к
другому редактору, вы можете использовать режим "Команды
редактора" для того, чтобы переконфигурировать (приспособить) к
вашим привычкам клавиши редактора.
Для установки по умолчанию нескольких характеристик
редактора: режима вставки или перезаписи, табуляторов и
автоматического структурирования,- можно использовать вариант
"Default" (по умолчанию) в режиме редактирования.
И, наконец, можно устанавливать режим экрана, в котором будет
работать ТУРБО БЕЙСИК.
Запуск_TBINST
Для запуска программы введите на подсказку DOS TBINST. Первое
меню позволит выбрать: каталог ТУРБО БЕЙСИК, команды редактора,
режимы редактирования по умолчанию, режимы работы экрана или
выход. Вы можете либо нажать высвеченную заглавную букву
выбранного режима, либо использовать стрелки вверх или вниз для
перемещения указателя к выбранному пункту и нажать Enter. Нажмите,
например, D для того, чтобы изменить режимы редактирования по
умолчанию. Нажатие клавиши Esc вернет вас в основное меню
программы TBINST.
Режим_"Каталог_ТУРБО_БЕЙСИКА
Режим "Каталог ТУРБО БЕЙСИКА" полезен, в действительности,
только пользователям, работающим с жестким диском. Этот режим
используется для задания маршрута к конфигурационным файлам с тем,
чтобы они были доступны всякий раз при вызове ТУРБО БЕЙСИКА
(предполагается, что вы задали оператор маршрута для ТБ).
После выбора режима "Каталог ТБ", появляется подсказака на
ввод полного маршрута к каталогу ТУРБО (т.е. каталога, в котором
хранятся ваши конфигурационные файлы; см. в гл.3 описание режима
Directories в спускающемся меню SETUP). Например, если вы хотите
хранитьконфигурационные файлы в подкаталоге с продуктами Борланда,
вы должны в качестве маршрута указать:
C:\BORLAND\BASIC
После ввода маршрута нажмите Enter для приема ответа, и вам
будет вновь предложено меню. При выходе из программы вы получите
запрос о том, сохранить ли сделанные изменения. Если вы захотите
сохранить маршрут, о
9
ПРИЛОЖЕНИЕ А
---------------------------------------------------------
Обсуждение работы с числами
---------------------------
В процессе выполнения программы ТУРБО БЕЙСИКу
приходится иногда преобразовывать внутренние
представления числовых значений из одной формы в другую;
например, число с одинарной точностью в целое:
А=14.1
В%=А
В таких случаях ТУРБО БЕЙСИК решает, как быть с излишней
или недостающей точностью. Следующие правила управляют
преобразованием числовых типов:
В операторе присваивания число запоминается с
точностью, соответствующей точности переменной, которой
оно присваивается (т.е. переменной, стоящей слева от
знака равенства). Например:
В=1.1
А%=В
PRINT A%
Во всех случаях, когда значение с большей точностью
присваивается переменной с меньшей точностью, выполняется
округление. Например:
A%=1.5
B=123.456789
PRINT A%,B
Обратите, однако, внимание, что ТУРБО БЕЙСИК особым
образом рассматривает любые числа, содержащие 5 в дробной
части: такое число всегда округляется до ближайшего
четного числа. Например, 0.5 округлится в сторону
меньшего - до 0, 9.005 также округлится в сторону
меньшего - до 9.000.
Если число с меньшей точностью преобразуется в число
с большей точностью, результирующее значение не может
быть более точным, чем исходное. После присваивания,
приведенного в следующем примере, значимыми являются
только 6 цифр переменной B#:
A=123.456
B#=A
PRINT B#
При вычислении числового выражения ТУРБО БЕЙСИК
преобразует все операнды выражения в соответствии с
наиболее точным из них. Например:
A=1.1: B#=1.123456
C=A*B#
PRINT A*B#,C
Обратите внимание, что для выражений, содержащих операнды
и с одинарной, и сдвойной точностью, точность результата
будет одинарной.
Файлы произвольного доступа,
----------------------------
содержащие данные с плавающей запятой.
--------------------------------------
Поскольку Интерпретатор БЕЙСИК использует
нестандартный формат Microsoft для чисел с плавающей
запятой, в программах на ТУРБО БЕЙСИКе должны выполняться
специальные преобразования для чтения и записи данных в
файлы с произвольным доступом, созданные Интерпретатором
БЕЙСИКа. Функции MKMS$ и MKMD$ (make Microsoft) создают
числовые строки в формате Microsoft; CVMS и CVMD (convert
Microsoft) обрабатывают числовые строки в формате
Microsoft и возвращают числовые данные в формате ТУРБО
БЕЙСИКа.
Внутреннее представление четырех типов чисел.
---------------------------------------------
-----------------T-------------------¬
¦ байт 0 ¦ байт 1 ¦
------------------T+----------------+-------------------+
¦Шестнадцатеричное¦ 13h ¦ 02h ¦
+-----------------+-----------------+-------------------+
¦Двоичное ¦ 00010011 ¦ 00000010 ¦
L-----------------¦-----------------+--------------------
Дополнительный код в двоичной системе означеет, что все
биты меняют значения на противоположные и к результату
добавляется 1.
Длинные целые представляются в виде 32-битовых
(4-байтовых) чисел со знаками. Отрицательные числа хра-
нятся в дополнительном коде. Наименее значимое слово за-
писывается первым (по младшему адресу), а наименее значи-
мый байт каждого слова располагается до более значимого.
Например, десятичное число 79033 равно 000134B9H и
записывается в виде последовательности байтов B9H 34H 01H
и 00H:
-----------------T-------------------¬
¦байт 0 I байт 1 ¦ байт 2 I байт 3 ¦
------------------T+----------------+-------------------+
¦Шестнадцатеричное¦ B9 I 34 ¦ 01 I 00 ¦
+-----------------+-----------------+-------------------+
¦Двоичное ¦10111001 00110100I 00000001 00000000 ¦
L-----------------¦-----------------+--------------------
А десятичное число -79033 равно дополнению к 00013469H -
FFFECB47H и хранится в виде последовательности байтов 47
CB FE FF.
Компьютеры и множество вещественных чисел.
------------------------------------------
Множество вещественных чисел включает и бесконечно
большие и бесконечно малые числа. В дополнение к минус и
плюс бесконечности, между любыми двумя точками на число-
вой прямой имеется бесконечное число точек (чисел). Так,
например, между 17,1 и 17,11 находятся точки 17,101;
17,104; 17,1041 и т. д.
Будучи конечными автоматами, компьютеры не могут точ-
но представлять это трансцендентное множество чисел, од-
нако, они могут представлять их приближенные значения.
Компромисс между качеством аппроксимации (т. е. точности)
с одной стороны, и скоростью вычислений и потребностью в
памяти, с другой, привели к созданию двух наиболее попу-
лярных способов представления множества вещественных чи-
сел: числа с одинарной точностью и числа с двойной точ-
ностью.
Обе эти модели отображают конечное, но практически
очень большое множество дискретных значений на значитель-
ном отрезке вещественной числовой прямой. Между смежными
значениями на ней имеются промежутки. Если при вычислени-
ии результат попадает в промежуток, выполняется округле-
ние до ближайшей представимой точки.
Плотность представимых значений распределена неодина-
ково вдоль числовой прямой. Равное количество
представимых чисел находится между целыми степенями двой-
ки. Например, между 1 и 2 столько же представимых чисел,
сколько и между 131072 и 262144. Другими словами, проме-
жутки между представимыми значениями становятся больше
при движении в любом направлении от нуля на числовой пря-
мой. Наконец, вы заберетесь так далеко от нуля, что там
не останется представимых точек. Использование чисел вне
представимых значений в любом направлении числовой прямой
приводит к переполнению.
Переполнение и потеря значимости
--------------------------------
Переполнение числа с плавающей точкой возникает в тех
случаях, когда результат вычислений больше максимального
представимого положительного значения или меньше макси-
мального отрицательного числа. В силу обширности диапазо-
на значений, допустимых в ТУРБО БЕЙСИКЕ, переполнение
числа с плавающей точкой является нетипичной ситуацией. В
отличие от переполнения целого числа, переполнение числа
с плавающей точкой всегда регистрируется.
Потеря значимости числа с плавающей точкой возникает
в случаях, когда результат вычислений попадает в крошеч-
ный интервал между 0 и первым представимым отрицательным
или положительным числом на одном из лучей числовой пря-
мой. Математические подпрограммы ТУРБО БЕЙСИКА обрабаты-
вают подобные ситуации присвоением 0 величине, у которой
произошла потеря значимости, и продолжают выполнение
программы без вывода сообщения об ошибке.
Числа с плавающей запятой одинарной точности
--------------------------------------------
Числа с одинарной точностью в ТУРБО БЕЙСИКЕ соответс-
твуют коротким вещественным значениям, принятым в стан-
дарте IEEE. В этом формате число записывается в 4 байтах
памяти с точностью от 6 до 7 десятичных знаков и может
иметь значение в приближенном диапазоне:
8,43*10**(-37)<=IXI<=3,37*10**38
Числа с одинарной точностью состоят из 23-битовой
нормализованной мантиссы, 8-битового показателя степени
со смещением 7FH и знакового бита, размещенных так, как
показано на рисунке А-1. (Смещение относится к разности
между беззнаеовым целым, записываемым в поле показателя
степени числа с плавающей точкой, и непосредственно пока-
зателем степени, который это целое представляет.)
---------------------------------------------------------
I Растущая значимость I
I I
I Целое --------------------- I
I I I I I
I I S I величина I дополнение до двух I
I I I I I
I --------------------- I
I 15 0 I
I I
I I
I Длинное ------------------------------- I
I целое I I I I
I I S I величина I дополнение I
I I I I до двух I
I ------------------------------- I
I 31 0 I
I I
I I
IОдинарное------------------------------- I
I вещест- I Iсмещенный I I I
I венное I S IпоказательI мантисса I I
I I Iстепени I I I
I ------------------------------- I
I 31 23 I 0 I
I I
I I
I Двойное -------------------------------------------- I
I вещест- I I смещенный I I I
I венное I S I показатель I мантисса I I
I I I степени I I I
I -------------------------------------------- I
I 63 52 I 0 I
I I
I Замечания I
I I
I S - знаковый бит (0 - положительное число, 1 - отри-I
I цательное) I
I D - десятичная цифра (2 на байт) I
I X - биты, не имеющие значения: 80287 игнорирует их I
I при загрузке, заносит нули при записи I
I I - целый бит значимости, хранится во временных I
I вещественных числах, всегда равен 1 в коротких I
I и длинных целых I
I I
I Смещенный показатель степени I
I ( нормализованное значение ) I
I Короткое вещественное: 127 (7FH) I
I Длинное вещественное: 1023 (3FFH) I
I Временное вещественное: 16383 (3FFFH) I
I I
I-------------------------------------------------------I
Рисунок А-1. Форматы данных
Числа с плавающей запятой с двойной точностью
---------------------------------------------
Вещественные числа с двойной точностью, используемые в
ТУРБО БЕЙСИКЕ, соответствуют длинным вещественным числам
в стандарте IEEE. В этом формате число записывается в 8
байтах памяти с точностью от 15 до 16 десятичных цифр и
может иметь значение в приближенном диапазоне:
4,19*10**(-37)<=IXI<=1,67*10**308
Значения с двойной точностью состоят из 52-битовой
нормализованной мантиссы, 11-битового показателя степени
со смещением 3FFH и знакового бита, размещенных как пока-
зано на рисунке А-1.
Далее приводится программа,демонстрирующая внутренний
форматпредставления числа с одинарной точностью в ТУРБО
БЕЙСИКЕ:
а1=167.25
address=VARPTR(a)
FOR n=0 TO 3
byteval=PEEK(address+n)
PRINT HEX$(byteval)
NEXT n
Давайте расшифруем полученные четыре байтовых значения,
представляющие число 167,25 с одинарной точностью. Сначала
перезапишем так, что наиболее значимый байт будет следовать
первым:
43 27 40 00
Теперь представим в двоичном виде:
-----------------------------------------
шестнадцатеричное I 4 I 3 I 2 I 7 I 4 I 0 I 0 I 0 I
-----------------------------------------
двоичное I0100I0011I0010I0111I0100I0000I0000I0000I
-----------------------------------------
Выделим знаковый бит, показатель степени и мантиссу:
--------------------------------------------------
двоичное I 0 I 10000110 I 01001110100000000000000 I
--------------------------------------------------
Вычтем смещение 7FH из показателя степени:
86H-7FH=7 - получим истинное двоичное значение
показателя степени.
Нормализованная мантисса имеет подразумеваемые 1 и дво-
ичную точку с левого края, так что в действительности значение
мантиссы равно:
1 010 011 101 000 000 000 000 00
Перемещение двоичной точки на семь знаков с учетом пока-
зателя степени приводит к результату:
10 100 111. 010 000 000 000 000 0=167725
ПРИЛОЖЕНИЕ В
------------------------------------------------------------
Прерывания по событиям
----------------------
ТУРБО БЕЙСИК поддерживает возможность фоновой обработки, из-
вестной как прерывания при возникновении событий, которые могут
одновременно и упростить и ускорить отдельные операции. Прерыва-
ние по событию означает, что проверку различных событий, таких
как нажатие определенной клавиши, выполняет сам ТУРБО БЕЙСИК, и
нет необходимости писать операторы, чтобы делать это самостоя-
тельно. ТУРБО БЕЙСИК может выполнять такую проверку между каждыми
двумя операторами вашей программы и гарантирует при этом наиболее
быстрый возможный ответ. Когда событие наступает, автоматически
вызывается подпрограмма, которую вы задали для обработки прерыва-
ния.
Проверяться могут следующие типы событий:
- Клавишные: была ли нажата клавиша F10? Или пробел? Или клавиша
SHIFT- ALT-K? Можно определить прерывания для 20 различных клавиш
одновременно.
- Состояние таймера, работающего в режиме вычитания - управление
передаётся подпрограмме обработки прерывания по истечении n секунд,
например, для обновления экранного времени каждые 60 секунд.
- Нажатие кнопки джостика.
- Действия светового пера.
- Состояние буфера фоновой музыки (проверка необходимости загрузки
в буфер дополнительного количества нот).
Вы можете получить краткое описание событий, вызывающих и не
вызывающих прерывание, просмотрев в главе 5 "Справочное руководс-
тво по ТУРБО БЕЙСИКУ" данного пособия разделы на букву "О". Боль-
шинство операторов "ON что-либо GOSUB" управляют прерываниями,
связанными с событиями.
Нет нужды специальным образом сообщать ТУРБО БЕЙСИКУ о необ-
ходимости генерации кода обработки прерывания по событиям. Его
автоматически генерирует компилятор всякий раз, когда встречает
любые инструкции, связанные с прерываниями.
ПРИМЕР
------------------------------------------------------------
Представьте программу ведения учета с дюжиной меню для выбора
варианта работы с большим количеством выводимых экранов. Как ав-
тор столь сложной прикладной системы, вы можете пожелать включе-
ния вспомогательных экранов, содержащих основную информацию о её
использовании, такую, как например, описание комбинаций клавиш,
необходимых для редактирования полей данных или преждевременной
отмены выбранного пункта меню. Для простоты рассмотрим систему
вызова вспомогательной информации, не являющейся контексо-зависи-
мой, т.е. независимо от того, в каком месте программы в момент
запроса вспомогательной информации находится пользователь выво-
дится всегда один и тот же текст.
Пусть F1 - клавиша вызова вспомогательной информации. Другими
словами, когда бы ни была нажата клавиша F1, независимо от теку-
щего контекста на экран будет выведена вспомогательная информа-
ция.
Возможность прерывания при возникновении событий в ТУРБО БЕЙ-
СИКЕ позволяет кодировать "вывод вспомогательной информации" в
одном месте программы, а затем вызывать его без лишних усилий в
любом ее месте. Если бы возможности обработки событий не было,
приходилось бы проверять состояние клавиши F1 ( с помощью перехо-
да GOSUB на вспомогательную подпрограмму) в каждом месте програм-
мы, где пользователь может на некоторое время задержаться.
Во-первых, поскольку дело касается клавишного прерывания ( а
не прерывания по джостику или световому перу), следует с помощью
оператора ON KEY(n) определить подпрограмму, которая получит уп-
равление при нажатии клавиши F1:
ON KEY(1) GOSUB DispHelpText
В этой строке определяется, что когда прерывание по клавише
включено, между каждыми двумя операторами выполняется проверка:
была ли нажата клавиша F1. Если была, вызывается подпрограмма
DispHelpText; если не была, выполняется следующий оператор.
Подпрограмма DispHelpText есть ни что иное, как последова-
тельность операто ров PRINT. Поскольку выполнение прерванной прг-
раммы при этом не должно быть нарушено, подпрограмма сохраняет
текущую позицию курсора, а затем после завершения вывода на эк-
ран, восстанавливает её. Вспомогательная информация воспроизво-
дится в четырех нижних строках экрана, где по соглашению ничто
больше не выводится.
DispHelpText:
oldcsrx=pos(0): oldcsry=CSRLIN
LOCATE 22,1
PRINT "Эта программа была выпущена в эксплуатацию вместе с"
PRINT "замечательным дорогостоящим руководством, тщательно"
PRINT "подготовленным профессиональными писателями. Оно "
PRINT "содержит больше информации, чем вам когда-либо "
PRINT "понадобится. Используйте его. Нажмите пробел, чтобы"
PRINT "продолжить." dummy$
LOCATE 22,1: PRINT SPACE$(320)
LOCATE oldcsrx, oldcsry
RETURN
Теперь, когда подпрограмма обработки прерывания (код, на ко-
торый будет передано управление при нажатии клавиши F1) объявле-
на, включите обработку прерывания с помощью оператора KEY(n)
KEY(10) ON
После выполнения этого оператора, ТУРБО БЕЙСИК переходит в
режим проверки событий. Перед выполнением каждого следующего опе-
ратора, он производит быструю проверку того, была ли нажата клави-
ша F1. Если не была, выполняется следующий оператор. Если клавиша
F1 была нажата, вызывается подпрограмма DispHelpText. После возв-
рата из неё с помощью оператора RETURN, управление передается сле-
дующему оператору в прерванной последовательности.
Когда возникает прерывание, связанное с натуплением заданного
события выполняется неявный оператор "остановки прерываний" для
того, чтобы избежать повторных вызовов подпрограммы обработки пре-
рываний из нее самой (и переполнения таким образом стека). Завер-
шающий подпрограмму оператор RETURN автоматически выполняет неяв-
ный оператор "включения прерывания"Б если только в подпрограмме
явно не содержится оператор "отключить прерывание". Вы можете за-
менить слова PEN, PLAY, KEY, STRIG, TIMER и COM словом "прерыва-
ние".
Настройка прерываний при наступлении события.
---------------------------------------------
Прерывание при наступлении заданных событий - это мощное
средство, но оно имеет цену. Поскольку между выполнением каждых
двух операторов вашей программы производится проверка события
(или событий), ее работа замедляется, что, в зависимости от кон-
кретных приложений, может привести к недопустимо маленькой ско-
рости. Кроме того, компиллятор для программы, связанной с преры-
ваниями по событиям, генерирует более длинный код (1 дополни-
тельный байт на каждый оператор), чем для программы, не связан-
ной с ними.
Для управления генерацией кода проверки событий в ТУРБО
БЕЙСИКЕ служит метаоператор $EVENT. В программах, которые обра-
батывают прерывания по событиям в отдельных частях программы,
следует использовать метаоператор $EVENT. $EVENT OFF отменяет
генерацию кода проверки событий до тех пор, пока не будет выпол-
нен метаоператор
$EVENT ON.
Для иллюстрации, рассмотрим подпрограмму сортировки в прог-
рамме ведения учета, упомянутой ранее. Сортировки работают мед-
ленно, даже без остановки после выполнения каждого оператора,
чтобы проверить, была ли нажата клавиша F1. Более того, так как
сортировка не требует ввода от пользователя, какой смысл в выво-
де на экран вспомогательной информации?
Решение состоит в том, чтобы заключить подпрограмму между
метаоператорами $EVENT:
ON KEY(1) GOSUB DispHelpText
KEY(1) ON
.
. тело основной программы...
.
$EVENT OFF
Sortroutine:
.
. здесь код проверки событий не генериуется;
. это экономит время и память.
.
EndSortroutine:
$EVENT ON
.
. остальная часть программы
.
END
Существует значительная разница между $EVENT и отключением
прерывания с помощью оператора KEY(10) OFF, обычно используемым
в Интерпретаторе БЕЙСИКА. Дело в том, что KEY(10) OFF - это ди-
намический оператор (т.е. он выполняется во время прогона прог-
раммы), который отключает реакцию на нажатие клавишы F1, но не
отключает выполнения проверок, с соответствующими затратами вре-
мени. Они участвуют в ходе работы программы, так как код провер-
ки вставляется между каждыми двумя операторами. Тогда как $EVENT
- оператор, выполняющийся на этапе компиляции, который управляет
тем, будет ли компилятор генерировать код проверки события.
Для отмены генерации кода проверки событий в части програм-
мы используется метаоператор $EVENT OFF. В этом случае выполне-
ние оператора KEY(1) ON не вызывает никакого действия.
ПРИЛОЖЕНИЕ C
------------------------------------------------------------
Интерфейс с языком ассемблера
---------------------------------------
При разработке некоторых прикладных систем может возник-
нуть задача, которая либо слишком долго решается в ТУРБО БЕЙСИ-
КЕ, либо по каким-то причинам вообще не может быть реализована
на нем. Для того, чтобы обеспечить потребность в большей скорос-
ти и гибкости, ТУРБО БЕЙСИК позволяет программе вызывать подп-
рограммы, написанные на ассемблере и обращаться к функциям DOS и
BIOS.
В ТУРБО БЕЙСИКЕ имеются три формы оператора CALL:
1) Вызов процедуры (CALL). Процедурв может быть написана на
на ТУРБО БЕЙСИКЕ или является встроенной (ONLINE) процедурой,
написанной на языке ассемеблера. Встроенное ассмеблирование яв-
ляется наиболее мощной формой интерфейса с ассмеблером.
2) Вызов подпрограммы по абсолютному адресу (CALL
ABSOLUTE). Подпрограмма, написанная на ассмеблере, уже должна
быть загружена в память. Эта возможность реализована для обеспе-
чения максимальной совместимости с Интерпретатором БЕЙСИКА.
3) Вызов подпрограммы обработки программного прерывания
CALL INTERRUPT, в соответствии со значением вектора программных
прерываний. Вызывает подпрограмму и обычно применяется для ис-
пользования служебных операций DOS и DIOS.
В главе 5 "Справочное руководство по ТУРБО БЕЙСИКУ" описаны
в деталях операторы ТУРБО БЕЙСИКА CALL и SUB. В этом приложении,
мы рассмотрим аспекты CALL и SUB, касающиеся ассемблера.
Обратите внимание, что средства интерфейса с подпрограммами
на ассемблере трудны для понимания в силу сложности самого про-
цесса связи. Прежде, чем приступить к изучению тогоБ что изложе-
но в данном приложении, следует ознакомиться с основными положе-
ниями языка ассемблер.
Оператор CALL ABSOLUTE
------------------------------------------------
Выполнение оператора CALL ABSOLUTE в программе на ТУРБО
БЕЙСИКЕ вызывает подпрограмму на ассемблере, предварительно заг-
руженную оператором BLOAD или являющуюся частью пространства
данных программы.
В примере:
DEF SEG=$H5000
MyAsmSub%=&H4000
CALL ABSOLUTE MyAsmSub%
вызывается ассемблерная процедура, расположенная в сегменте 5000H
(20480 - десятичный адрес) со смещением 4000H (16384 десятичное).
Адрес обычни указывается в виде сегмент:смещение, т. е. 5000:4000.
Синтаксис оператора CALL ABSOLUTE:
CALL ABSOLUTE <числовой-идентификатор>[(список-параметров)]
где числовой-идентификатор - это числовая скалярная переменная,
которая находится в диапазоне от -32768 до 65535. Если числовой
идентификатор отрицателен, он преобразуется в положительное чис-
ло путем дополнения до 2. Он задает смещение и используется в
совокупности с адресом сегмента, установленным в последнем опе-
раторе DEF SEG, для задания вызываемого 32-битового абсолютного
адреса. Если вы хотите использовать выражение для задания адре-
са, вам следует присвоить его числовому идентификатору, а затем
указать идентификатор в операторе CALL.
В качестве необязательных параметров могут задаваться только
короткие целые скалярные переменные. Параметры передаются по адресу
с помощью 16-битовых указателей, размещенных в стеке слева направо.
Сами параметры располагаются в главном сегменте данных, на который
указывает DATA SEGMENT(DS).
Эта форма оператора CALL допускает минимальную совмести-
мость с интерпретатором БУЙСИКА. ТУРБО БЕЙСИК располагает более
мощной возможностью вызова встроенных процедур (SUB INLINE) для
обеспечения полного доступа к хранилищам данных.
После завершения требуемых действий, ассмеблерные процедуры
должны выполнить межсегментный (дальний) возврат (RETURN) в ТУР-
БО БЕЙСИК. Выполнение программы затем продолжается с оператора,
следующего за вызовом CALL.
Заботиться о сохранении регистров сегмента данных (DS),
указателя базы (BP), сегметна стека (SS) и указателя стека (SP)
должен сам программист.
Оператор CALL INTERRUPT
------------------------
Оператор CALL INTERRUPT использует значения вектора преры-
ваний для входа в подпрограмму на ассмеблере. Обычно эта форма
CALL используется для вызова подпрограмм обработки прерываний
DOS и BIOS, но может употребляться и для вызова определенных
пользователем программных обработчиков прерываний.
Синтаксис оператора CALL INTERRUPT:
CALL INTERRUPT <целое-выражение>
где целое выражение должно быть в пределах от 0 до 255.
Перед вызовом подпрограммы обработки прерывания следует,
пользуясь оператором REG, установить значения соответствующих
регистров. Доступ к результатам, записанным в регистрах и сохра-
няемых компилятором, может быть осуществлен с помощью функции
REG.
После выполнения нужной операции ассемблерная процедура
должна выполнить возврат (RETURN) из прерывания (IRET) в ТУРБО
БЕЙСИК. Затем продолжается выполнение следующего за вызовом CALL
оператора.
Заботиться о сохранении регистров сегмента данных (DS),
указателя базы (BP), сегметна стека (SS) и указателя стека (SP)
должен сам программист.
Регистровый буфер
_________________
Оператор CALL INTERRUPT использует для передачи из и в
программу на ассмеблере регистровый буфер. Он представляет собой
последовательность 16- битовых целых чисел, соответствующих зна-
чениям процессорных регистров непосредственно до и после выпол-
нения оператора CALL INTERRUPT.
Оператор REG сохраняет содержимое 16-битовой целой перемен-
ной в указанном регистре, в соответствии с заданным числовым ар-
гументом (от 0 до 9).
Функция REG возвращает 16-битовое содержимое заданного ре-
гистра, определяемого в соответствии со значением числового ар-
гумента (от 0 до 9). Связь между аргументами и действительными
процессорными регистрами приведена в следующей таблице:
-------------------------------------------
I Номер I Регистр I
-------------------------------------------
I 0 I Флаги I
I 1 I AX I
I 2 I BX I
I 3 I CX I
I 4 I DX I
I 5 I SI I
I 6 I DI I
I 7 I BP I
I 8 I DS I
I 9 I ES I
I------------------------------------------
Для того, чтобы установить значение в регистровом буфере,
пользуйтесь оператором REG, например:
REG 5,&H8000
загружает 16-ричное значение 8000H в регистр SI буфера.
Обратите внимание, что REG не производит непосредственной
записи или чтения процессорного регистра - REG читает или запи-
сывает в промежуточный буфер.
Для чтения элемента из регистрового буфера пользуйтесь фун-
кцией REG, например:
y%=REG(1)
загружает в целую переменную y% содержимое из дубликата регистра
AX.
И вновь, заметьте, что значение регистрового буфера загру-
жается в процессорные регистры с началом выполнения оператора
CALL INTERRUPT и копируется из процессора после возврата из выз-
ванной подпрограммы.
О вызовах функций DOS и BIOS
----------------------------
Прерывание 10H - 1FH являются обращениями к BIOS и выполня-
ют различные служебные функции. (Для более детальной информации
см. "Техническое справочное руководство по DOS IBM".)
Прерывание 21H (33 десятичное) представляет особый интерес
по сравнению с остальными номерами прерываний, так как оно явля-
ется главным способом обращения к DOS.
Запрос на прерывание по-
мещается в наиболее значимый байт регистра AX (AH), а дополни-
тельные, при необходимости, размещаются в других регистрах. DOS
предоставляет множество полезных функций, доступ к которым может
быть осуществлен с помощью описанного выше способа.
В качестве примера рассмотрим функцию FNFreeSpace, опреде-
ляющую количество пустого дискового пространства.
DEF FNFreeSPACE (drive%) 'Функция DOS 36H возвращает число
'свободных кластеров на выбранном
'устройстве: 0=устройство по умолчанию,
'1=А,2=В и т.д.
REG 4,drive%
REG 1,&H3600
CALL INTERRUPT &H21
'своб. пространство = доступные кластеры * байт/сектор *
'сектор/кластер = BC*CX*AX
FNFreeSpace = CSNG(REG(2))*REG(3)*REG(1)
END DEF
Определенная в одном месте программы, функция FNFreeSpace
может быть вызвана в любом другом, также как и все остальные
функции.
Использование CALL вместе с INLINE
----------------------------------
Встроенные процедуры на ассмеблере и обычные процедуры на
ТУРБО БЕЙСИКЕ используют одну и ту же вызывающую последователь-
ность. Изменяется определение процедуры SUB при задании программ
на языке ассмеблера. Встроенные процедуры - наиболее мощный ре-
жим использования ассмеблера в ТУРБО БЕЙСИКЕ.
Синтаксис:
CALL <имя процедуры> [(список параметров)]
Синтаксис:
SUB <имя процедуры> INLINE
$INLINE <список-байтов>
$INLINE <имя-файла-COM>
END SUB
Может быть задано произвольное количество операторов
$INLINE в любом порядке. Единственное ограничение - количество
файлов COM в одной процедуре не должно быть больше 16.
Список-байтов состоит из констант или выражений, значения
которых находятся в диапазоне от 0 до 255, разделенных запятыми.
Обычно для каждого байта задается 16-ричная константа
($H4C,$H90).
Команды возврата недопустимы ни в ассемблерном коде, ни в
конце процедуры SUB. За этим автоматически следит компилятор.
Если необходимо выйти из процедуры до ее завершения, следует вы-
полнить переход на ассемблерную метку в конце встроенного кода.
Обратите внимание, что в определении SUB список параметров
не задается.
Заботиться о сохранении регистров сегмента данных (DS),
указателя базы (BP), сегметна стека (SS) и указателя стека (SP)
должен сам программист.
Передача параметров встроенным процедурам
-----------------------------------------
Параметры в качестве 32-битовых указателей элементов данных
(за исключением массивов) помещаются в стек в порядке слева нап-
раво.
Передача числовых переменных
----------------------------
Для числовых переменных (целых и с плавающей запятой) пере-
дается 32-битовый указатель данных (см. Приложение А "Обсуждение
работы с числами" описание числовых форматов.)
Передача символьных данных
--------------------------
Для символьных параметров (за исключением массивов) переда-
ется 32-битовый указатель на 4-байтовый дескриптор строки. В
первых двух байтах дескриптора содержится длина строки. Следую-
щие два байта содержат смещение символьных данных в сегменте
символьных данных.
Замечание. Старший бит байтов, указывающих длину строки,
использовать не следует, он зарезервирован и может быть в даль-
нейшем задействован. Прежде, чем использовать значение длины,
нужно исключить старший бит с помощью логической операции "И".
Нельзя, однако, изменять значение в памяти. Можно изменять байты
в строке символов, но не следует менять длину строки. Для полу-
чения указателя символьного сегмента используйте первое слово
сегмента данных, определенного по умолчанию. Дескриптор строки
имеет следующий формат:
Байты 0,1: Длина строки (старший бит зарезервирован)
2,3: Смещение данных в символьном сегменте.
Передача массивов
-----------------
Когда параметрами являются массивы, дескриптор массива, длина
которого 60 байтов, помещается в стек. Дескриптор массива имеет
следующий формат:
Байты 0,1: Адрес сегмента данных массива. Первый элемент
массива начинается со смещения 0. Для динамических
массивов он содержит 0 до тех пор, пока не уста-
новлена размерность массива.
2: Описывает тип элементов массива
0 = целый
2 = длинный целый
4 = с плавающей запятой одинарной точности
6 = с плавающей запятой двойной точности
8 = зарезервирован
10 = символьный
3: Количество индексов
4,5: Число элементов массива
6,7: Длина элементов массива
2 байта = целый
4 байта = длинный целый
4 байта = с плавающей запятой одинарной точности
8 байтов = с плавающей запятой двойной точности
4 байта = символьный дескриптор
8,9: Нижняя граница правого индекса массива
10,11: Верхняя граница правого индекса массива
Следующие 6 байтов повторяются для 8 размерностей (индексов)
Байты 12,13 зарезервированы
14,15 нижняя граница следующего индекса массива
16,17 верхняя граница следующего индекса массива
Передача результатов выражений
------------------------------
Процедурам на ассмеблере можно передавать значения выраже-
ний, однако нельзя гарантировать числовой тип результата его вы-
числения. Мы советуем присваивать значение выражения переменной
и затем передавать переменную.
Передача констант
-----------------
Процедурам на ассмеблере можно передавать константы, но не-
обходимо явно указать их числовой тип. Используйте для этого
идентификаторы типов после значения константы.
Создание файла INLINE.COM
-------------------------
Для создания файла можно использовать отладчик или макроас-
семблер. Находясь в отладчике, можно выполнить команду А (ассем-
блировать) для ввода с клавиатуры операторов, написанных на язы-
ке ассемблер, команду N (имя) для задания имени файла и команду
W (запись) для записи файла на диск.
При использовании макроассмеблера необходимо четыре прог-
раммы: редактор, макроассемблер, компоновщик и программа, назы-
ваемая EXE2BIN. Сначала наберите в редакторе текст вашей прог-
раммы на ассемблере. Затем запустите макроассмеблер для того,
чтобы получить объектный файл вашей программы. Далее, с помощью
компоновщика создайте выполняемый файл. И, наконец, используйте
EXE2BIN для преобразования выполняемого файла в файл типа .COM.
На рисунке С-1 изображен простой пример распределения памяти
во время выполнения:
0000:0000 -------------------------------
I I
I DOS I
I I
-------------------------------
I Другие резидентные I (SideKick и т.д.
I программы I
I I
-------------------------------
I ТУРБО БЕЙСИК I
I Система выполнения I
I Область данных I
I Рабочий стек I FRE (-2)
-------------------------------
I Область пользовательских I От 16 до 64К
I программ I Сегменты
I I пользовательских
I I кодов
-------------------------------
I Скалярный сегмент I
I Набор констант I
I Скалярные переменные I
I Символьные дескрипторы I
I Дескрипторы массивов I
------------------------------- YYYY:FFFF
I Пространство для I переменный
I массивов I FRE (-1) размер
XXXX:0000 -------------------------------
I Символьный сегмент I FRE ($$)
I I
XXXX:FFFF -------------------------------
I Свободное пространство I MEMSET
I I
-------------------------------
A000:FFFF I I
-------------------------------
Рисунок С -1 Карта распределения памяти в
момент выполнения программы
ПРИЛОЖЕНИЕ D
-----------------------------------------------------------------
Сравнение ТУРБО БЕЙСИКА и ИНТЕРПРЕТАТОРА БЕЙСИКА
------------------------------------------------
Между ТУРБО БЕЙСИКОМ и ИНТЕРПРЕТАТОРОМ БЕЙСИКА имеются три
основные отличия:
1. Компилятор против интерпретатора
2. Расширение языка БЕЙСИК в ТУРБО БЕЙСИКЕ
3. Реализация компилятора
Каждое из этих основных отличий определяет связанные с ним
более мелкие различающиеся детали в двух реализациях БЕЙСИКА. Их
мы рассмотрим ниже.
Компилятор против интерпретатора
--------------------------------
Интерпретаторы имеют тенденцию затуманивать различия между
командами для создания программ и командами, используемыми в про-
грамма; другими словами, между системой сопровождения программ и
самим языком. Так, например, EDIT и AUTO не составляют часть язы-
ка в том смысле, в каком ими являются GOSUB и PRINT.
Интерпретаторы выполняют программный код в заданном порядке.
Компиляторы, напротив, сначала просматривают исходные операторы,
затем генерируют выполняемый код для исходного текста. Последнее
свойство позволяет ТУРБО БЕЙСИКУ, как компилятору выявлять ошибки
в ветвях программы, которые никогда не будут выполняться ИНТЕР-
ПРЕТАТОРОМ БЕЙСИКА. В следующем примере, выполняемом в Интерпре-
таторе, если X не будет равно 3 перед выполнением строки 20, опера-
торы, следующие за THEN никогда выполняться не будут:
10 X=5
20 IF X=3 THEN GOTO 30: X=10: Z="ААА"
При этом синтаксическая ошибка присвоения числовой переменной сим-
вольного значения обнаружена не будет. Кроме того, операторы Х=10
и Z="ААА" никогда не будут выполняться, так как при Х=3 будет осу-
ществлен переход GOTO на строку 30. Компилятор во время компиляции
пометит любой "тупиковый код" как ошибку.
Неподдерживаемые команды
------------------------
В ТУРБО БЕЙСИКЕ имеется настоящий полноэкранный редактор и ко-
манды работы с меню для выполнения вспомогательных функций. Поэтому
нет необходимости в наличии каких-либо операторов,связанных с за-
грузкой, сохранением и редактированием исходных программ. Таких
команд в ТУРБО БЕЙСИКЕ нет. Соответствующие команды ИНТЕРПРЕТАТОРА
Бейсика обычно используются в режиме непосредственной работы
(DIRECT) и включают:
AUTO LOAD
DELETE NEW
EDIT RENUM
LIST SAVE
ТУРБО БЕЙСИК позволяет создавать и модифицировать программы с
помощью текстового редактора, то есть, нет необходимости в измене-
нии или стирании строк программы (например, командами EDIT и
DELETE). Если вы захотите удалить строку, переместите курсор в
нужную строку и нажмите CTRL-Y. Аналогично, нет потребности в ко-
манде LIST - вместо этого достаточно нажать соответствующие клави-
ши и нужная часть программы будет выведена на экран.
Команды основного меню ТУРБО БЕЙСИКА выполняют те же (и дру-
гие) функции, что и команды SAVE, LOAD и NEW Интерпретатора БУЙ-
СИК. А, так как в ТУРБО БЕЙСИКЕ необязательны номера строк, то и
команды АUTO и RENUM не нужны.
В ТУРБО БУЙСИКЕ не поддерживаются также следующие команды:
CONT
В ТУРБО БЕЙСИКЕ не допускается повторный запуск прерванной
программы. Прерывание программы по STOP или Ctrl-Break означает то
же самое, что и выполнение оператора END.
MERGE
ТУРБО БЕЙСИК транслирует программу в выполняемый код, поэтому
он не предоставляет возможности сливать строки исходной программы
в момент выполнения.
MOTOR
Кассетный порт обычно не встречается на PC.
USR
Оператор CALL выполняет те же (и другие) задачиБ что и USR.
Операторы, требующие модификации
---------------------------------
CALL ABSOLUTE
В операторе CALL ABSOLUTE ТУРБО БЕЙСИКА допустимы только целые
параметры. Он включен в систему для обеспечения минимальной
совместимости с интерпретируемым БЕЙСИКОМ. Для программирова-
ния на ассемблере ТУРБО БЕЙСИК располагает более мощными сред-
ствами: CALL INTERRUPT и встроенными ассемблерными процедура-
ми. (Для более полной информации см. приложение С "Интерфейс с
языком ассемблер").
CHAIN
Программы типа СHAIN должны транслироваться в файлы .EXE или
.TBC с помощью выбора в меню "Варианты" компилятора режимов
Compile to exe (компиляция в EXE) или Compile to Chain (компи-
ляция в CHAIN). В операторах COMMON как в обычных, так и цепных
программах список переменных должен содержать общие переменные в
надлежащем порядке (хотя и необязательно с одними и теми же име-
нами). Нельзя выполнять в среде ТУРБО БЕЙСИКА оператор CHAIN. Он
может использоваться только при работе в DOS. Режимы MERGE и
"DELETE диапазон-номеров-строк" не поддерживаются.
DEFtype,TRON,TROFF,OPION BASE
Реализация этих операторов в ТУРБО БЕЙСИКЕ и ИНТЕРПРЕТАТОРЕ
БЕЙСИКА несколько отличается. ТУРБО БЕЙСИК рассматривает физичес-
кое местоположение каждого оператора в исходной программе, а не
его появление в выполняемой ветви обёектного кода программы. Дру-
гими словами, имеется в виду положение каждого оператора во время
компиляции, а не во время выполнения. Рассмотрим на примере следу-
ющей программы оператор DEFtype:
10 GOTO 30
20 DEFINT X
30 X=2.3
40 PRINT X
При выполнении этой программы в ИНТЕРПРЕТАТОРЕ БЕЙСИКА, опера-
тор в строке20 обнаружен не будет. Таким образом, при выполнении
строки 20 будет использован тип переменной Х по умолчанию (с оди-
нарной точность), а затем выведется значение 2.3.
В отличие от этогоБ ТУРБО БЕЙСИК устанавливает соглашения о
типах во время компиляции. Поскольку, оператор DEFINT физически
предшествует первому появлению перменной Х, оператор PRINT выведет
значение 2.
DRAW и PLAY
Оба эти оператора выполняют сложные командные строки, выводя-
щие графические изображения или воспроизводящие музыку, соответст-
венно. В ИНТЕРПРЕТАТОРЕ БЕЙСИКА символьная информация, управляющая
выполнением команд, может включать имена символьных переменных.
Например, в Интерпретаторе БЕЙСИКА операторы:
n=50
PLAY "T=n;C"
устанавливают темп в 50 четвертей в минуту и исполняет ноту до.
ТУРБО БЕЙСИК не понимает подобной конструкции, так как после ком-
пиляции вся ирформация, касающаяся переменной n,утрачивается. Од-
нако, того же эффекта можно добиться с помощью функции VARPTR$:
n=50
PLAY "T=",VARPTR$(n) + "C".
ПАРАМЕТРЫ ФУНКЦИИ
Для определения параметров функции Интерпретатор БЕЙСИК
позволяет использовать те же имена переменных параметров.
ТУРБО БЕЙСИК выдает сообщение об ошибке, связанной с наличием
дубликата локальной переменной.
RUN
Программа в ТУРБО БЕЙСИКЕ может использовать оператор RUN для
загрузки и выполнения другой программы или перезапуска себя самой,
но нет возможности запустить текущую программу из произвольной
точки кроме ее начала, задавать номер строки, с которой начнется
выполнение программы, в этом случае нельзя.
Преобразование программ Интерпретатора БЕЙСИК
в программы ТУРБО БЕЙСИК
Первый шаг преобразования программы Интерпритатора БЕЙСИК в
программу ТУРБО БЕЙСИК - сохранение ее на диске в формате ASCII.
Например, чтобы сохранить текущую программу, введите:
SAVE "<имя программы>.txt",A.
Режим ",А" заставляет Интерпретатор БЕЙСИКА записывать на
диск текстовый (ASCII) файл, не снабжая его "опознавательными
знаками". Такой файл может непосредственно читаться
ТУРБО БЕЙСИКом, однако, если он больше 64К, следует выделить
основной и подключаемые файлы прежде,чем редактировать или
компилировать его в ТУРБО БЕЙСИКе.
Дополнение языка БЕЙСИК
ТУРБО БЕЙСИК предоставляет новые командные возможности и
дополнения языка БЕЙСИК. Ниже приводятся некоторые из них (см.
для более детальной информации главу 5 "Справочное руководство по
ТУРБО БЕЙСИКу).
Структурные операторы
В дополнение к Интерпретатору БЕЙСИК, ТУРБО БЕЙСИК использует
для управления ходом программы и создания легко читаемых программ
конструкции операторов IF/ELSEIF/ELSE/ENDIF и SELECT CASE. Новыу
блочно-структурированные операторы DO/LOOP позволяют выполнять
общее управление программными циклами с проверкой в начале или
конце цикла.
Двоичный файл ввода/вывода
ТУРБО БЕЙСИК поддерживает новый режим BINARY для двоичного
ввода и вывода в файлы. Операторы GET$, PUT$ и SEEK позволяют
программисту управлять файлами на низком уровне. Программа может
читать или записывать информацию в файл по-байтно и устанавливать
указатель позиции в файле на любой байт.
Определение функций и процедур
В ТУРБО БЕЙСИКе определения функций могут содержать одну
строку, как в стандартном интерпретируемом БЕЙСИКе, или несколько
строк, предоставляя тем самым более структурный механизм
реализации подпрограмм. Операторы SUB и END SUB позволяют
создавать процедуры. ( Для более полной информации см. главу 4,
раздел "Подпрограммы,функции и процедуры").
ТУРБО БЕЙСИК поддерживает рекурсивные процедуры функции с
1
настоящими локальными переменными. Используйте оператор LOKAL для
задания переменных, которые заносятся в стек при рекурсивных
вызовах.
Интерфейс с языком ассемблер
В ТУРБО БЕЙСИКе оператор CALL используется в трех формах:
CALL имя процедуры, CALL INTERRUPT и CALL ABSOLUTE. Оператор CALL
INTERRUPT использует команду REG для передачи данных через
буферный регистр. Встроенные (INLINT) процедуры на ассемблере или
файл .COM могут быть заключены внутри процедур с помощью директив
$INLINE. (См. приложение С "Интерфейс с языком ассемблер" для
более детальной информации).
Встроенные функции
В отличие от Интерпретатора БЕЙСИКа в ТУРБО БЕЙСИКе
трансцендентные функции возвращают значения с двойной точностью.
Новые команды
В ТУРБО БЕЙСИКе имеется большое количество новых команд и
дополнительных режимов в старых командах. В таблице D-1 частично
приводятся дополнения к Интерпретатору БЕЙСИКа.
Если Вы случайно используете некоторые из этих ключевых слов
в качестве имен переменных, то произойдет ошибка компиляции. Для
безошибочной компиляции выполните операцию Find and replace (найти
и изменить), чтобы изменить неподходящее имя переменной.
2
Таблица D-1 Дополнения к БЕЙСИКу в ТУРБО БЕЙСИКе
------------------------------------------------------------------
BIN$ Возвращает целое число в двоичном виде
BINARY Новый вид файла для доступа на низком уровне
CETL,FIX Функции преобразования чисел с плавающей
точкой в целые
COMMAND$ Возвращает символ продолжения командной строки
CVM$,CVMD, Преобразуют из и в формат Microsoft
MKMD$,MKMS$
DECR/INCR Альтернативный способ увеличения/уменьшения
значений переменных
DEFLNG,MKL$, Поддерживает новый числовой тип - длинные
CVL целые
DELAY Ждет n секунд (для машинно-независимых
задержек)
DO/LOOP Гибкие конструкции циклов в стандарте ANSI
ERADR Адрес последней ошибки
EXIT Выход из циклов FOR/NEXT, WHTLE/WEND или
DO/LOOP, блоков IF, процедур, и функций
EXP2,EXP10 Возвращает степени 2 и 10
GET$ Читает данные из файлов с режимом BINARY
IF/ELSEIF/ELSE/ Выполняет множественные тесты IF
END IF
INLINE Встраевает байты непосредственно в обьектный
код
INSTAT Возвращает состояние клавиатуры
LCASE$ Преобразует символы в строчные
LOCAL/SHARED/STATIC Опрелеляют переменные в функциях и процедурах
LOG2,LOG10 Возвращает логарифмы по основанию 2 и 10
MEMSET Определяет свободное пространство старших
адресах памяти
MTIMER Таймер с высоким разрешением
PUT$ Записывает данные в двоичные файлы в режиме
BINARY
REG Читает/записывает в регистровый буфер
SEEK Определяет позицию в файлах в режиме BINARY
SELECT CASE Мощный оператор проверки условий
SUB/END SUB Определяют процедуру
VARSEG Возвращает адрес сегмента переменных или
элемента массива
------------------------------------------------------------------
Реализация компилятора
Использование компилятора в качестве транслятора БЕЙСИКа
влияет на уже существующие программы на БЕЙСИКе и, кроме того,
допускает более детальное управление ходом компиляции программ и
генерацией кода. Мы уже указывали на некоторые отличия и
дополнения, в этом разделе рассмотрим другие свойства,
проистикающие из мощной реализации ТУРБО БЕЙСИКа.
Редактор и большие программы
Включенный в ТУРБО БЕЙСИК редактор не может работать с
программами, длина которых превышает 64К. Если исходная программа
более 64К, следует разделить ее на несколько файлов. Директива
$INCLUDE допускает компиляцию программ длиной более 64К. Для
запуска программы в ТУРБО БЕЙСИКе на компиляцию следует в
спускающемся меню File задать режим Main (если программа
отличается от файла, находящегося в текущий момент в буфере
редактора).
Редактор ТУРБО БЕЙСИКа может работать со строками длиной до
3
248 символов. Интерпретатор БЕЙСИКа допускает строки по 255
символов. Строки, длина которых больше 248 знаков, автоматически
снабжаются в 248-ой позиции символом "возврат каретки". Однако,
Вам понадобится проверить правильно ли формируется строка прежде,
чем Вы загрузите стоку в редактор ТУРБО БЕЙСИКа.
ТУРБО БЕЙСИК допускает программы, выполняемый код которых
превышает 64К. Директива $SEGMENT задает генерацию нового сегмента
кода, при этом аргументы операторов CALL/GOTO меняются,так как
многие переходы становятся "длинными".
Файлы произвольного доступа с числами с плавающей запятой
ТУРБО БЕЙСИК использует для чисел с плавающей запятой
стандарт IEEE, а Интерпретатор БЕЙСИКа для чисел с одинарной и
двойной точностью нестандартный формат Microsoft, поэтому
ТУРБО БЕЙСИК должен выполнять преобразования полей с плавающей
запятой в уже существующих файлах с произвольным доступом,
созданных программами Интерпретатора БЕЙСИКа. Функции MKMS$ и
MKMD$ создают числовые строки в формате Microsoft, а функции CVMS
и CVMD преобразуют стоки в формате Microsoft в числовые данные в
формате ТУРБО БЕЙСИКа.
Обратите внимание, что это касается только полей с плавающей
запятой в файлах с произвольным доступом, а не полей с целыми или
символьными данными.
Числа с плавающей запятой
В отличие от Интерпретатора БЕЙСИКа, ТУРБО БЕЙСИК использует
стандартное представление IЕЕЕ для вещественных значений в виде
чисел с плавающей запятой. Числа одинарной точности в
ТУРБО БЕЙСИКе занимают 6 байтов памяти, двойной точности -
8 байтов.
Использование формата IЕЕЕ в ТУРБО БЕЙСИКе повышает уровень
точности представления чисел с плавающей запятой. (Заметьте, что
функции МКМD$, МКМS$, СVМD и СVМS преобразуют любые данные из
ТУРБО БЕЙСИКа в формат Интерпретатора БЕЙСИКа и наоборот.)
Кроме того, так как ТУРБО БЕЙСИК выполняет все математические
операции с использованием сопроцессора (или эмулятора 8087),
округление дробной части не производится. Так, что при округлении
в ТУРБО БЕЙСИКе любого числа, содержащего 5 в дробной части, оно
увеличивается или уменьшается до ближайшего четного числа.
Например, 0,5 округляется до 0; 9,005 округляется до 9,01.
При выполнении следующей программы в ТУРБО БЕЙСИКе будет
получен 0 0; а в Интерпретаторе БЕЙСИКа - 0 1.
10 DEFINT A
20 A=1/2 ` деление целых
30 B=1/2 ` деление чисел с плавающей запятой
40 PRINT A;B
Работа в окне
В среде ТУРБО БЕЙСИКа программы, выводящие текст, могут
выполнятся в окне RUN, представляющем виртуальный экран
25-строк-на-80-позиций. Используйте Аlt-F5 для того, чтобы
распахнуть окно RUN в момент выполнения программы.
Если в программе используются специальные операции РОКЕ для
установки позиции курсора или изменения атрибутов цвета при работе
в окне, вывод на экран может выполняться неправильно. Однако если
до выполнения распахнуть окно RUN вывод будет отлично
воспроизведен. Программы, воспроизводящие графические изображения,
4
работают с полным экраном.
Промежуточная точность чисел с плавающей запятой
ТУРБО БЕЙСИК использует стандарт IЕЕЕ для чисел с плавающей
запятой, поэтому промежуточные результаты вычисляются с точностью
до представления в 80 битах. Некоторые программы в Интерпретаторе
БЕЙСИКа обрабатывают усеченные значения с плавающей запятой
добавлением в отдельных вычислениях "жульнической добавки" в 1 для
получения правильного результата. ТУРБО БЕЙСИК допускает
повышенную точность, поэтому коды, используещие преимущества
арифметики с усеченной точностью могут быть изменены.
Строки
В ТУРБО БЕЙСИКе имеется расширенная обработка строк.
Максимальная длина строки расширена с 255 до 32767 символов. Кроме
того, покончено со "сборкой мусора", периодически проводимой в
Интерпретаторе БЕЙСИКа - поэтому нет смысла в лихорадочном
выполнении команды FRE для вмешательства в эту операцию.
Расширенное использование памяти
В ТУРБО БЕЙСИКе программе доступна вся системная память, без
строгих ограничений на использование не более 64К в
Интерпретаторе БЕЙСИКа. Программы могут состоять из кода
неограниченного объема, могут работать со скалярными переменными
объемом до 64К, символьными данными до 64К и неограниченным числом
массивов, длина каждого из которых не более 64К.
Ячейки РЕЕК и РОКЕ
В графическом режиме цвет текста сохраняется в ячейке
РЕЕК/РОКЕ со смещением 4ЕН в основном сегменте данных. РЕЕК и РОКЕ
для остальных ячеек могут привести к непредсказуемым результатам.
5
ПРИЛОЖЕНИЕ Е
Сообщения об ошибках
В ТУРБО БЕЙСИКе регистрируются два основных типа ошибок:
ошибки компиляции и ошибки выполнения. К ошибкам компиляции
относятся синтаксические ошибки, обнаруженные компилятором. К
ошибкам выполнения относятся отклонения, найденные механизмами
обнаружения ошибок, которые компилятор помещает в объектной
программе.
Большая часть ошибок компиляции это ошибки в синтаксисе,
вызванные пропуском символа, неправильным написанием команды,
непарным числом скобок и т д. Если компилятор встречает что-то
в исходной программе, чего он не может понять или допустить Вы
немедленно окзываетесь в редакторе, и курсор указывает на то
место, где произошла ошибка. Вам нужно ножать на любую клавишу,
чтобы убрать собщение об ошибке, затем исправить ошибочный
оператор и повторить компиляцию.
ТУРБО БЕЙСИК выводит номер ошибки и краткое ее описание в
нижней строке экрана. Ошибки компиляции имеют номера от 256 и
выше. Ошибки выполнения возникают при прогоне оттранслированной
программы. Пример таких ошибок: ошибки файловой системы (диск
полон или защищен для записи), неверные вызовы функций
(графические операторы без графического адаптера), попытка
извлечения корня из -14, ошибки использования памяти (обычно
связанные с ее недостатком) и множество других.
Ошибки выполнения могут вызывать прерывания, то есть, вы
можете установить с помощью оператора ON ERROR, что если
произойдет ошибка, управление должно быть передано заданной
подпрограмме обработки ошибок. Эта подпрограмма может "рассудить",
что делать дальше в зависимости от обнаруженной ошибки. Особенно
удобно использовать такие подпрограммы для обработки ошибок
файловой системы (например, диск полон) - это единственный класс
ошибок, с которыми должна иметь дело ещательно отлаженная
программа.
С помощью оператора ERROR можно симулировать ошибки
выполнения выполнения в качестве способа отладки подпрограмм
обработки ошибок.
Для более детальной информации об ошибках выполнения см. в
главе 5 "Справочное руководство по ТУРБО БЕЙСИКУ" описание
операторов ON ERROR и ERROR, функций ERR, ERL и ERADR.
Если ваша программа не обрабатывает ошибки, тогда при их
обнаружении ТУРБО БЕЙСИКОМ выполнение программы преждевременно
прекращается, выводится номер ошибки и краткое описание
создавшихся условий. Если программа выполнилась в ТУРБО БЕЙСИКЕ,
курсор редактора указывает на оператор, вызвавший ошибку. Ошибки
выполнения имеют номера между 0 и 255. Например:
Error 5 Illegal function call at pgm-ctr: 761
(Ошибка 5 неверный вызов функции по программному счетчику: 761)
Сообщения об ошибках не включаются в .ЕХЕ файлы; поэтому
ошибки выполнения, возникающие в программах, запущенных из DOS, не
содержат текст сообщения об ошибке, а только ее номер. Отладочный
режим поиска ошибок выполнения (FIND) может преобразовать значение
программного счетчика, определяющего адрес ошибки, в конкретный
оператор в исходном файле, который вызвал ошибку. Например:
nnn Error - distination <CR/LF>,
где nnn - номер ошибки из трех цифр. Для более полной информации
см. граву 3 "Команда DEBUG".
6
Ошибки_выполнения
2 Syntax error
Синтаксическая ошибка
Синтаксическая ошибка выполнения, которая возникла в
операторе READ при попытке загрузки символьных данных в числовую
переменную. Остальные синтаксические ошибки обнаруживаются
компилятором.
3 RETURN without GOSUB
RETURN без GOSUB
Задан оператор RETURN без соответствующего ему GOSUB; то
есть, собтветственно возврат (RETURN) осуществлять неоткуда.
4 Out of data
Конец данных
Оператор READ вышел за пределы значений в операторе DATA.
5 Illegal function call
Неверный вызов функции.
Всу ошибки, связанные с передачей несоответствующего
аргумента оператору или функции. Сразу несколько причин могут
вызыввать их:
* слишком большое значение цвета или режима экрана;
* наличие оператора, работающего с графикой без графического
адаптера или при несоответствующем режиме, заданном оператором
SCREEN;
* попытка выполнения неверной математической операции, такой как,
например, извлечение корня из отрицательного числа;
* слишком большой (или отрицательный) номер записи в операторах
GET и PUT;
* попытка использования оператора WIDTH в последовательном файле.
6 Overflow
Переполнение
Переполнение возникает при получении в результате вычислений
слишком больших значений, которые не могут быть представлены в
виде числовых данных заданного типа. Например, х%=32767+1 приведет
к переполнению, также как 32768 не может быть представлено целым
числом.Ошибки переполнения целочисленных не обнаруживаются, если в
меню "Вариант" не был установлен режим (Overflow); переполнение
значений с плавающей запятой всегда регистрируются.
7 Out of memory
Выход за пределы памяти
Многочисленные ситуации могут приводить к выводу этого
сообщения, в частности, определение слишком большого массива.
9 Subscript out of range
Индекс за пределами диапазона
Возникает при попытке использовать индекса, большего, чем
максимальное допустимое.
10 Dublicate definition
Двойное определение
Повторная попытка размещения динамического массива до
освобождения уже размещенного массива с тем же именем.
11 Division by zero
Деление на ноль
7
Попытка деления на ноль или возведения нуля в отрицательную
степень.
13 Type mismatch
Несоответствие типов данных
Вместо числового значения используется символьное или,
наоборот. Возникает в операторах PRINT USING,DRAW или PLAY.
14 Out of string space
Выход за пределы пространства символьных переменных
Исчерпана память для символьных переменных, она недолжна
превышать 64К.
15 String to long
Слишком длинная строка
Строка, полученная в результате символьного выражения
превышает 32767 байтов.
19 No RESUME
Нет оператора RESUME
Выполнение подпрограммы обработки ошибок дошло до физического
конца программы. Возможно, в программе пропущен оператор RESUME.
20 RESUME without error
RESUME без ошибки
Выполнение оператора RESUME, когда ошибки не было, т.е. нет
подпрограммы обработки ошибки, из которой должен быть выполнен
выход RESUME.
24 Devise time out
Тайм-аут устройства
Истекло заданное время (Тайм-аут) для коммуникационной линии
состояния. Значения тайм-аута ьогут быть заданы для CTS (Clear To
Send), CD (CarrierDetect) и DSR (DataSetReady) линий состояния.
Программа либо преждевременно завершается, либо повторно
выполняются коммуникационные операции. Для более детельной
информации см. описание операторов OPEN COM в главе 5.
25 Devise fault
Ошибка устройства
Возникла аппаратная ошибка; например, в интерфейсе принтера,
или коммуникационном адаптере.
27 Out of paper
Конец бумаги
Интерфейс принтера указывает, что концилась бумага. В
действительности, он может быть просто выключен или в нем имеются
какие-либо сложности.
50 Field overflow
Преполнение поля
При заданной длине записи файла определяется слишком большое
множество переменых полей в операторе FIELD.
51 Internal error
Внутренняя ошибка
Возник сбой в системе выполнения ТУРБО-БЕЙСИКА. Обратитесь с
информациуй о вашей программе в группу технического сопровождения.
52 Bad file number
8
Неверный номер файла
Номер файла, указанный в операторе работы с файлом, не
соответствует номеру в операторе OPEN или выходит за рамки
диапазона допустимых номеров файлов.
53 File not found
Файл не найден
Заданноу имя файла не обнаружено на указанном диске.
54 Bad file mode
Неверный режим работы с файлом
Попытка выполнить PUT или GET (или PUT$ и GET$) для
последовательного файла.
55 File already more
Файл уже открыт
Попытка открыть уже открытый файл, или удалить открытый файл.
57 Device I/O error
Ошибка вода/вывода устройства
Возникла серьезная аппаратная неисправность при выполнении
команды.
58 File already exists
Файл уже существует
Новое имя файла, указанное в опраторе NAME уже существует.
61 Disk full
Диск полон
На указанном диске или диске по умолчанию не хватает места
для выполнения операции с файлом. Убедитесь, что места достаточно
и запустите программу повторно.
62 Input past end
Попытка прочитать больше данных, чем имеется в файле. Для того,
чтобы избежать этой сложности, используйте функцию EOF (конец
файла). Ошибка также может возникнуть при чтении из
последовательного файла, открытого для записи или дозаписи в
конец.
63 Bad record number
Неверный номер записи
В качестве номера записи в операторах GET или PUT для файлов
с произвольным доступом указано отрицательное число или число
больше чем 16.777.215.
64 Bad file name
Неверное имя файла
Имя файла, указанное в щператорах FILES, KILL или NAME
содержит недопустимые символы.
67 To many files
Слишком много файлов
Эта ошибка может быть вызвана либо попыткой создания слишком
большого количества файлов в корневом каталоге, либо неверныь
именем файла при выполнении системного вызова DOS для создания
файла.
68 Device unavailable
9
Устройство недоступно
Попытка открытия (OPEN) файла устройства на машине, на
которой этого устройства нет; например, СОМ1: в системе без
серийного адаптера или модема.
69 Communication buffer overflow
Переполнение коммуникационного буфера
Выполнение оператора INPUT для ввода символов в уже
заполненный коммуникационный буфер. Программа либо должна
проверять и чаще очищать буфер, либо увеличить размер буфера.
70 Permission denied
Нарушение защиты
Попытка записи на защищенный для записи диск.
71 Disk not ready
Диск не готов
Открыта крышка накопителя на гибком устройстве, или диск не
установлен на заданном накопителе.
72 Disk media error
Ошибка дискового накопителя
Панель контроллера гибкого или жествкого диска регистрирует
постоянную ошибку в одном или нескольких секторах носителя.
74 Rename across disks
Переименование с переменой диска.
Переименовать файл с заданием другого диска или каталога
нельзя. Оператор NAME а лишь присваивает ему новое имя.
75 Path/File acces error
Ошибка доступа в маршруте/файле
В команде, требующей указания маршрута (OPEN,RENAME,MKDIR)
неправильно использован маршрут; например, открывается (OPEN)
подкоталог или удаляется используемый каталог.
76 Path not found
Маршрут не найден
Маршрут, заданный в операторах CHDIR, MKDIR, OPEN и т.д., не
найден.
202 Out of string temp space
Выход за пределы временного пространства для символьных данных
Символьное выражение требует использования слишком большого
количества временных буферов для символьных данных. Ошибка может
быть вызвана выражением типа MID$(LEFT$(MID$(RIGHT$(...).
Попробуйте упростить символьное выражение путем сохранения
промежуточных результатов во временных символьных переменных.
203 Mismatched common variables
Несоответствие общих переменных
Попытка выполнить CHAIN между двумя програмными сегментами,
которые содержат несоответствующие друг другу операторы COMMON.
ТУРБО БЕЙСИК сверяет тип и число переменных в операторах COMMON.
204 Mismatched program option
Несоответствие програмных опций
Попытка выполнить CHAIN между двумя програмными сегментами,
компиляция которых происходила с несоответствующими друг другу
10
програмными опциями (различными математическими библиотеками,
требованиями сопроцессора и т.д.).
205 Mismatched program vervisions
Несоответствие версий в программе
Попытка выполнить CHAIN между двумя програмными сегментами,
которые созданы различными версиями компилятора ТУРБО БЕЙСИК.
206 Invalid program file
Непригодный програмный файл
Попытка выполнить CHAIN или RUN для програмнгосегмента,
компиляция которого выполнилась не в ТУРБО БЕЙСИКЕ.
242 String/array memory corrupt
Разрушение памяти строки/массива
Область памяти символьных данных была неверно перезаписана.
Ошибка может быть вызвана неверными действиями ассемблерной
подпрограммы, доступом к символьному массиву за пределами его
размерности или нарушениями в системе выполнения ТУРБО БЕЙСИКА.
243 CHAIN/RUN from .EXE file only
CHAIN/RUN допустимы только из файла .EXE
Попытка выполнить CHAIN или RUN для програмного сегмента из
среды ТУРБО БЕЙСИКА. Следует выполнить компиляцию программы и
записать оттранслированный модуль на диск с помощью команд меню
"Варианты", а затем запустить из DOS программу, использующую
операторы CHAIN и RUN.
Ошибки_компилятора
401 Expression too complex
Слишком сложное выражение
Выражение содержит слишком много операторов/операндов;
следует разбить его на два или несколько более простых выражений.
402 Statement too complex
Оператор слишком сложен
Сложность оператора вызвала переполнение внутреннего буфера
компилятора. Следует разбить его на два или несколько более
простых оператора.
403 $IF nesting overflow
Переполнение вложеннных $IF
Число блоков условной компиляции ($IF/$ELSE/$ENDIF) не должно
составлять более 16 уровней.
404 $INCLUDE nesting overflow
Переполнение вложенгых $INCLUDE
Вложенность включаемых файлов не должна быть больше 5
уровней, включая саму основную программу. Это позволяет иметь в
программе 4 вложенных включаемых ($INCLUDE) файла.
405 Block nesting overflow
Переполнение вложенных блоков
В вашей программе слишком много операторов блочных структур,
вложенных один в другой. Блочные структуры в ТУРБО БЕЙСИКЕ могут
иметь не более 255 уровней вложенности.
406 Compiler out of memory
Компилятор вышел за пределы памяти
11
Исчерпана доступная память компилятора для символьного
пространства, буферов и т.д. Если память исчерпана, выделите из
вашей программы небольшую основную программу, которая использует
метаоператор $INCLUDE для включения остальной части программы.
Если вы компилируете программу в память и возникает эта ошибка,
попробуйте с помощью меню "Варианты" выполнить компиляцию на диск.
407 Program too large
Программа слишком велика
Ваша программа содержит более 65530 операторов.
408 Segment exceeds 64K
Сегмент превышает 64К
Ваша программа включает сегмент, превышающий ограничение 64К.
Добавьте метаоператор $SEGMENT в исходную программу, чтобы
разместить программный код в дополнительном сегменте.
409 Variables exceeds 64K
Переменные превышают 64К
Общее пространство скалярных переменных ограничено 64К. Вэто
пространство включаются указатели строк, целые, длинные целые,
вещественные числа с одинарной и двойной точностью. Избавьтесь от
неиспользуемых переменных или разбейте вашу программу на отдельные
основную и цепные (CHAIN) программы.
410 "," expected
Предполагается ","
Синтаксис оператора требует запятую (,).
411 ";" expected
Предполагается ";"
Синтаксис оператора требует запятую (;).
412 "(" expected
Предполагается "("
Синтаксис оператора требует запятую (().
413 ")" expected
Предполагается ")"
Синтаксис оператора требует запятую ()).
414 "=" expected
Предполагается "="
Синтаксис оператора требует запятую (=).
415 "-" expected
Предполагается "-"
Синтаксис оператора требует запятую (-).
416 Statement expected
Предполагается оператор
ТУРБО БЕЙСИК полагает, что в этом местедолжен быть оператор.
Некоторый символ не может быть идентифицирован ни как команда, ни
как метакоманда, ни как переменная.
417 Label/line number expected
Предполагается метка/номер строки
В операторах IF, GOTO, GOSUB или ON должна быть задана
допустимая метка или номер строки.
418 Numeric expression requires relational operator
Численное выражение требует соответствующего оператора
Компилятор обнаружил символьный операнд в том месте, где
должен быть числовой операнд.
419 String expression requires string operand
12
Для символьного выражения требуется символьный операнд
Компилятор ожидал символьное выражение, а нашел нечто другое,
например: Х$=А$+В .
420 Scalar variable expected
Предполагается скалярная переменная
Компилятор ожидал найти скалярную переменную в качестве
формального параметра функции, определенной пользователем.
Скалярные переменные включают строки, целые, длинные целые и
вещественные числа с одинарной и двойной точностью.
421 Array variable expected
Предполагается переменная массив
В опреаторах DIM или операторах работы с графикой GET или PUT
должна быть указана переменная массив.
422 Numeric variable expected
Предполагается числовая переменная
В опреаторах INCR, DECR или при задании смещения в операторе
CALL ABSOLUTE должна быть указана числовая переменная.
423 String variable expected
Предполагается символьная переменная
В опрераторах FIELD, GET$, PUT$ или LINE INPUT должна быть
указана символьная переменная.
424 Variable expected
Предполагается переменная
В функциях VARPTR, VARPTR или VARSEG должна быть задана
переменная.
425 Integer constant expected
Предполагается целая константа
В поименованом присваивании константы или в командах условной
компиляции $IF/$ELSEIF должна быть указана целая константа.
426 Positive integer constant expected
Предполагается положительная целафя константа
При указании границ массива DIM STATIC и в метаоператорах
$COM, $SOUND и $STACK должна быть указана положительная целая
константа.
427 String constant expected
Предполагается символьная константа
В качестве имени файла в метаоператоре $INCLUDE должна быть
указана символьная константа.
428 Numeric scalar variable expected
Предполагается числовая скалярная переменная
Должна быть указана целая, длинная целая, вещественная
переменная с одинарной или двойной точностью; например в цикле
FOR/NEXT.
429 Integer scalar variable expected
Предполагается целая скалярная переменная
В качестве параметра в операторе CALL ABSOLUTE должна быть
указана целая переменная.
430 Integer array variable expected
Предполагается целая переменная массив
13
Должна быть указана целая переменная массив; например в
операторе PALETTE.
431 End of line expected
Предполагается конец строки
В строке, содержащей метаоператор, недопустимы никакие
символы, кроме комментария.
432 AS expected
Предполагается AS
Служебное слово AS пропущено в операторах FIELD или OPEN.
Проверьте в главе 5 синтаксис операторов FIELD и OPEN.
433 DEF FN expected
Предполагается DEF FN
Компилятор обнаружил операторы END FN или EXIT FN без
определения функции DEF FN.
434 IF expected
Предполагается IF
Компилятор обнаружил операторы END IF или EXIT IF без
предшествующего им оператора IF.
435 DO LOOP expected
Предполагается DO LOOP
Компилятор обнаружил операторы LOOP или EXIT LOOP без
предшествующего им оператора DO LOOP.
436 SELECT expected
Предполагается SELECT
При определении оператора SELECT CASE вы либо забыли указать
служебное слово SELECT, либо компилятор обнаружил операторы END
SELECT или EXIT SELECT.
437 CASE expected
Предполагается CASE
При определении опреатора SELECT CASE НЕ УКАЗАНО СЛУжЕбНОЕ
СЛОВО СASE. Эта ошибка может также возникнуть при использовании
служебного слова SELECT в качестве имени переменной.
14
438 FOR LOOP expected
Предполагается FOR LOOP
Компилятор обнаружил оператор EXIT FOR без предшествующего
ему оператора FOR.
439 SUB expected
Предполагается SUB
Компилятор обнуружил оператор END SUB или EXIT SUB
,без предшествующего ему оператора SUB. Началом объявления
подпрограммы должен быть оператор SUB.
440 END DEF expected
Предполагается END DEF
Определение функции не завершается соответствующим ему
оператором END DEF.
441 END IF expected
Предполагается END IF
Блок IF не завершается соответствующим END IF.
442 LOOP/WEND expected
Предполагается LOOP/WEND
Циклы DO или WHILE не завершаются соответствующими
опреаторами LOOP/WEND.
443 END SELECT expected
Предполагается END SELECT
Оператор SELECT CASE не был правильно завершен оператором END
SELECT.
444 END SUB expected
Предполагается END SUB
Процедура не была правильно завершена оператором END SUB.
445 NEXT expected
Предполагается NEXT
Цикл FOR не был правильно завершен оператором NEXT.
446 THEN expected
Предполагается THEN
В операторе IF пропущено служебное слово THEN.
447 TO expected
Предполагается ТО
В операторе FOR пропущено служебное слово TO.
448 GOSUB expected
Предполагается GOSUB
В опреаторе ON пропущена входящая в него часть GOSUB.
449 GOTO expected
Предполагается GOTO
В опреаторе ON пропущена входящая в него часть GOТО.
450 $ENDIF expected
Предполагается $ENDIF
В операторе условной компиляции $IF пропущено служебное слово
$ENDIF. Посмотрите все метаоператоры $IF, чтобы найти место, где
следует указать соответствующей ему $ENDIF.
1
451 Unmatched $ELSE
Непарный метаоператор $ELSE
Компилятор обнаружил метаоператор $ELSE без предшествующего
ему метаоператора условной компиляции $IF. Посмотрите в исходном
тексте предшествующие $ELSE, чтобы найти место, где следует
указать соответствующей ему $IF.
452 Unmatched $ENDIF
Непарный метаоператор $ENDIF
Компилятор обнаружил метаоператор $ENDIF без предшествующего
ему метаоператора условной компиляции $IF. Посмотрите в исходном
тексте предшествующие $ENDIF, чтобы найти место, где следует
указать соответствующей ему $IF.
453 Undefined name constant
Неопределенная именная константа
В программе использована именная константа, которая не
определена. Определите именную константу или используйте в
операторе литеральную константу.
454 Undefined function reference
Обращение к неопределенной фуркции
В выражении указано имя функции, которая не определена.
Проверьте, нет ли ошибок в имени функции или определите
фуркцию.
455 Undefined subprogram reference
Обращение к неопределенной подпрограмме
Выполнен вызов подпрограммы (CALL), но в программе нет
определения подпрограммы. Проверьте, нет ли ошибок в имени
подпрограммы или задайте подпрограмму.
456 Undefined label/line reference
Обращение к неопределенной метке/номеру строки
В опреаторах IF, GOTO, GOSUB или ON указана метка или
оператор строки, неопределенные в программе. Проверьте, нет ли
ошибок в метке или номере строки, или задайте их в программе.
457 Undefined array reference
Обращение к неопределенному массиву
Выполнено обращение к массиву, не определенному в операторе
DIM. Проверьте, нет ли ошибок в имени массива, или укажите его в
операторе DIM.
458 Dublicate label/line number
Двойное определение метки/номера строки
Дважды указан один и тот же номер строки или метки. Найдите в
вашей программе и включаемых файлах двойные определения и измените
одно из них или оба.
459 Dublicate named constant
Двойное определение имени константы
Две именные константы были заданы с одинаковыми именами.
Найдите в вашей программе и включаемых файлах двойные определения
и измените одно из них или оба.
461 Dublicate subprogram definition
Двойное определение имени подпрограммы
Две процедуры SUB были определены с одинаковыми именами.
Найдите в вашей программе и включаемых файлах двойные определения
2
и измените одно из них или оба.
462 Dublicate common variable
Двойная общая переменная
В списке переменных оператора COMMON одна переменная указана
дважды. Найдите в вашей программе и включаемых файлах двойные
определения и измените одно из них или оба.
463 Dublicate variable declaration
Двойное определение переменной
В операторах LOCAL, STATIC или SHARED две переменные указаны
с одинаковыми именами. Найдите в вашей программе и включаемых
файлах двойные определения и измените одно из них или оба.
464 Dublicate $COM definition
Двойное определение $COM
Для каждого коммуникационного порта в вашей программе может
быть только один метаоператор $COM. Найдите в вашей программе и
включаемых файлах определения $COM и удалите одно из них .
465 Dublicate $SOUND definition
Двойное определение $SOUND
В программе может быть использован только один метаоператор
$SOUND. Найдите в вашей программе и включаемых файлах определения
$SOUND и удалите одно из них .
466 Dublicate $STACK definition
Двойное определение $STACK
В программе может быть использован только один метаоператор
$STACK Найдите в вашей программе и включаемых файлах определения
$STACK и удалите одно из них .
467 Invalid line number
Неверный номер строки
Номер строки должен быть в диапазоне от 0 до 65535.
469 Metastatements not allowed here
Использование метаоператоров здесь недопустимо
Метаоператоры должны быть первыми командами в строке
470 Block/scanned statements not allowed here
Блочные операторы здесь недопустимы
Блочные операторы типа WHILE/WEND, DO/LOOP и SELECT CASE не
могут быть использованы в однострочных операторах IF.
471 Unknown identifier/syntax error
Неизвестный оператор/синтаксическая ошибка
В строке что-то не так - компилятор не может подобрать
соответствующее сообщение об ошибке.
472 Array subscript error
Ошибка в индексе массива
Вы задали массив с одним числом индексов, а использовали его
с другим числом.
473 Array bounds error
Ошибка выхода за границы массива
Программа обращается к статическому массиву с помощью
литерального значения, выходящего за пределы диапазона.
3
474 Tipe mismatch
Несоответствие числовых типов
Типы переменных в операторе SWAP неодинаковы.
475 Parameter mismatch
Несоответствие параметров
Типы или число параметров не соответствуют определению
функции или процедуры.
476 CLEAR parameter error - use MEMSET/$STACK
Ошибка параметров CLEAR - используйте MEMSET/$STACK
Дополнительные параметры, допуступные оператору CLEAR, не
доступны в таком компиляторе БЕЙСИКА, как ТУРБО БЕЙСИК.
477 LOCAL requires DEF FN/SUB
LOCAL требует DEF FN/SUB
Локальные переменные могут быть объявлены только в процедуре
или функции.
478 SHARED requires DEF FN/SUB
SHARED требует DEF FN/SUB
Разделяемые переменные могут быть объявлены только в
процедуре или функции.
479 STATIC requires DEF FN/SUB
STATIC требует DEF FN/SUB
Статические переменные могут быть объявлены только в
процедуре или функции.
480 COMMON array must be dynamic
Массивы СOMMON должны быть динамическими
Общие массивы, указанные в операторе COMMON, должны быть
объявлены как DYNAMIC.
481 LOCAL array must be dynamic
Массивы LOCAL должны быть динамическими
Локальные массивы, указанные в операторе LOCAL, должны
быть объявлены как DYNAMIC.
482 Parameter arrays cannot be altered
Массивы - параметры не могут быть изменены
Нельзя стереть (ERASE) или разместить (DIM) массив,
используемый в качестве параметра функции или подпрограмы.
483 Array is not STATIC
Массив не является статическим
Нельзя определять размерность статического массива с помощью
переменных в качестве индекса. При задании индексов массива типа
STATIC следует использовать либо именные константы, либо
литеральные константы.
484 Array previously STATIC
Первоначально массив был определен как статический
Если в вашей программе для одного и того же массива два
оператора DIM, ьассив автоматически считается динамическим. Либо в
другом месте программы пытались объявить массив как STATIC, либо
ваша программа выполняет команду DIM DYNAMIC для массива,
объявленного ранее как STATIC.
4
485 Array name without "()" expected
Требуется имя массива без "()"
При использовании оператора ERASE не следует за именем
массива указывать скобки.
486 Array exceeds 64K
Массив превосходит 64К
Размеры массива не должны превышать 64К (одного сегмента
данных). Если вам нужны массивы большего размера, вы можете
разбить один массив на несколько меньших.
487 Arrays limited to eights dimensions
Размерность массива не должна превышать 8
Это внутренне ограничение для компилятора.
488 Invalid numeric format
Неверный числовой формат
В программе объявлено число, содержащее более 36 цифр или в
числе с плавающей запятой не указано значение показателя в
компаненте Е.
489 Invalid function/procedure name
Неверное имя процедуры/функции
В случае функции, за FN должна следовать буква, а затем
другие буквы, цифры и точки, завершать может идентификатор типа
(%, &, !, #, или $). В случае процедуры имя должно начинаться с
буквы, включать другие буквы, цифры и точки, но не должно включать
идентификатор типа.
490 No parameters with INLINE SUB
В INLINE SUB не заданы параметры
Не указан список формальных параметров в объявлении процедуры
INLINE SUB. За число и тип параметров, перем\даваемых ассемблерной
программе отвечает она сама. Никакая проверка типов не выполняется
компилятором.
491 Only $INLINE allowed here
Здесь допустимо только $INLINE INLINE
В процедуре SUB с режимом INLINE допустимы только операторы
$INLINE.
492 $INLINE requires SUB INLINE
Для $INLINE необходимы SUB INLINE
Операторы $INLINE допустимы только в процедурах SUB с режимом
INLINE.
493 $INCLUDE file not found
Файл $INCLUDE не найден
Включаемый файл не найден в заданном маршруте, текущем
каталоге или маршруте, указанном в режиме DIRECTORIES в меню
SETUP. Проверьте маршруты или убедитесь в том, что заданный
включаемый файл существует.
494 $INCLUDE disk error
Ошибка на диске при выполнении $INCLUDE
При попытке открытия ТУРБО БЕЙСИКОМ включаемого файла в
процессе компилляции возникла ошибка на диске.
495 $INCLUDE file too large
Файл $INCLUDE слишком велик
Включаемые файлы, так же как и все файлы, загружаемые в
5
редактор ТУРБО БЕЙСИКА, не должны превосходить 64К.
496 $INLINE file not found
Файл $INLINE не найден
Файл INLINE не найден ни в заданном маршруте, ни в текущем
каталоге. Убедитесь в том, что указанный включаемый файл
существует.
497 $INLINE disk read error
Ошибка чтении с диска файла $INLINE
При попытке открытия ТУРБО БЕЙСИКОМ файла INLINE в процессе
компиляции возникла ошибка на диске.
498 Temporary file acces error
Ошибка доступа к временному файлу
При компиляции на диск (в файлы .ЕХЕ или .ТВС) компилятор не
смог осуществить доступ к временному файлу. Проверьте каталог ТУРБО
в режиме DIRECTORIES в меню SETUP, чтобы убедиться в том, что
заданный каталог существует.
499 Destination file write error
Ошибка записи в файл назначения
При компиляции на диск (в файлы .ЕХЕ или .ТВС) компилятор
получил информацию об ошибке записи на диск.
600-610 Internal error
Внутренняя ошибка
Если возникла какая-либо из этих ошибок неьедленно сообщите
группе технического сопровождения.
6
ПРИЛОЖЕНИЕ_F
Справочные_материалы
Этот раздел посвящен справочным материалам и включает
скэн-коды клавиатуры и расширенные коды.
Расширенные_коды_клавиш
Расширенными кодами клавиатуры кодируются клавиши, или их
комбинации, которые не могут быть представленны в коде ASCII.
Расширенные коды возвращаются системной переменной $INKEY. В
двухсимвольной строке в качестве первого символа возвращается
ноль. Обычно вторым информационным символом является скэн-код
первой клавиши.
В таблице F- 1 представлены информационные кода и их значения.
Таблица_F-1. Расширенные_коды_клавиатуры
_________________________________________________________________
Информационный код Значение
__________________________________________________________________
3 NULL (пустой символ)
15 Shift Tab (-<++)
16-25 Alt-Q/W/E/R/T/Y/U/I/O/P
30-38 Alt-A/S/D/F/G/H/J/K/L
44-50 Alt-Z/X/C/V/B/N/M
59-68 Клавиши F1-F10 (Задействованы как
програмные ключи)
71 Home
72 Стрелка вверх
73 PgUp
75 Стрелка влево
77 Стрелка вправо
79 End
80 Стрелка вниз
81 PgDn
82 Ins
83 Del
84-93 F11-F20 (Shift F1 до Shift F10)
94-103 F21-F30 (Ctrl F1 до F10)
104-113 F31-F40 (Alt F1 до F10)
114 Ctrl-PrtSc
115 Ctrl стрелка влево
116 Ctrl стрелка вправо
117 Ctrl-End
118 Ctrl-PgDn
119 Ctrl-Home
120-131 Alt-1/2/3/4/5/6/7/8/9/0/-/=
132 Ctrl-PgUp
133 F11
134 F12
135 Shift-F11
136 Shift-F12
137 Ctrl-F11
138 Ctrl-F12
139 Alt-F11
140 Alt-F12
7
Скэн-коды_клавиатуры
В скэн-кодах кодируются клавиши на клавиатуру IBM PC в
соответствии с тем, как их понимает ТУРБО БЕЙСИК. Эти клавиши
особено полезны при работе на уровне языка ассемблер. Обратите
внимание, что скэн-коды клавиатуры приведены в таблице F2 в
шестнадцатиричном виде.
8
Таблица_F-2. Скэн-коды_клавиатуры
__________________________________________________________________
Клавиша Шестнадцатиричный Клавиша Шестнадцатиричный
скэн-код скэн-код
__________________________________________________________________
Esc 01 Стрелка
влево/вправо 0F
!1 02 Q 10
@2 03 W 11
#3 04 E 12
$4 05 R 13
%5 06 T 14
^6 07 Y 15
&7 08 U 16
*8 09 I 17
(9 0A O 18
)0 0B P 19
_- 0C [{ 1A
+= 0D ]} 1B
BckSp 0E Enter 1C
Ctrl 1D |\ 2B
A 1E Z 2C
S 1F X 2D
D 20 C 2E
F 21 V 2F
G 22 B 30
H 23 N 31
J 24 M 32
K 25 ,< 33
L 26 .> 34
;: 27 /? 35
"' 28 Левый.Shift 36
~ 29 PrtScr 37
Правый.Shift 2A Alt 38
Кл.пробел 39 7Home 47
Caps Lock 3A 8Стрелка вверх 48
F1 3B 9Pg Up 49
F2 3C - 4A
F3 3D 4Стрелка влево 4В
F4 3E 6Стрелка вправо 4D
F5 3F 5 4C
F6 40 + 4E
F7 41 1End 4F
F8 42 2Стрелка вниз 50
F9 43 3PgDn 51
F10 44 Olns 52
F11 D9 Del 53
F12 DA
Num Lock 45
Scrol Lock 46
_________________________________________________________________
9
ПРИЛОЖЕНИЕ_G
DOS_для_начинающих
Если вы не знакомы с компьютерами или DOS, у вас могут быть
затруднения с пониманием отдельных терминов, используемых в данном
руководстве. В этом приложении вашему внимания предлагается
краткий обзор следующих положений и функций DOS:
.Что такое DOS и для чего он нужен
.Надлежащий способ загрузки программ
.Каталоги, подкоталоги и команда PATH
.Использование файлов АUTOEXEC.BAT
Информация данного раздела ни в коей мере не претендует на
полное описание операционной системы DOS. Для более полной
информации обратитесь к руководству пользоввателя по MS-DOS или
РС-DOS, которым снабжена ваша вычислительная система.
ТУРБО БЕЙСИК работает под управлением операционных систем
MS-DOS и РС-DOS версий 2.0 и более поздних.
Что_такое_DOS?
DOS это сокращенное название дисковой операционной системы.
Под МS-DOS понимают версию DOS фирмы Microsoft, РС-DOS - это DOS в
исполнении IBM. DOS является координатором движения, менеджером и
опреатором транзакций, возникающих между отдельными частями
вычислительной системы, между компьютером и вами. DOS работает в
фоновом режиме, зоботясь о выполнении служебных компьютерных
функций, о которых вы нехотели бы и думать - например, о передаче
символов между клавиатурой и компьютером, между компьютером и
принтером, между вашими дисками и внутренней памятью (RAM).
Выполнение других транзакций вы инициируете вводом
команды в командной строке DOS; иначе говоря, непосредственно
после подсказки DOS.
Подсказки DOS выглядят следующим образом:
А>
В>
С>
Прописная буква относится к активному дисковому накопителю
(который DOS и вы используете в данный момент). К примеру,
подсказка А> означает, что вы работаете с файлами на накопителе А,
и команды, которые вы зададите DOS будут обращены к этому
накопителю. Если вы захотите переключиться на другой диск, сделав
его активным, все, что вам следует сделать,- это набрать букву
диска, за которым следует двоеточие, и нажать клавишу "Enter".
Например, чтобы перейти на накопитель В, ввудите:
В:Enter
Есть несколько команд, которые вам в DOS придется часто
использовать, если уже не пришлось, такие как:
DEL ERASE Удалить файл
DIR Посмотреть список файлов на диске, на который
вы настроились
COPY Скопировать файлы с одного диска на другой
TB Загрузить ТУРБО БЕЙСИК.
Для DOS не имеет значения, вводите вы строчные буквы,
прописные или и те и другие в перемешку, так что вы можете вводить
их как вам нравится.
Предположим, что вы уже знаете, как пользоваться первыми
тремя указанными командами; а если нет, - обратитесь к руководству
по DOS. Далее мы рассмотрим надлежащий способ загрузки программы,
такой как ТУРБО БЕЙСИК (см. последнюю команду в списке).
10
Как_загрузить_программу
На вашем диске с системой ТУРБО БЕЙСИК вы найдете файл с
именем ТВ.ЕХЕ. Этот програмный файл содержит все основные функции
БЕЙСИКА. Имя файла с расширением (или последним именем) .СОМ или
.ЕХЕ означает, что это програмный файл, который можно загружать и
запускать (использовать) вводом только его "первого имени" в
командной строке DOS. Следовательно, для вызова программы ТУРБО
БЕЙСИКА наберите на клавиатуре ТВ и наберите Enter, чтобы
загрузить ТУРБО БЕЙСИК в память вашего компьютера.
При загрузке ТУРБО БЕЙСИКА или другой подобной программы
следует помнить: для того, чтобы загрузить программу, нужно
настроиться на диск и каталог, в котором она находится. Если вы не
задали маршрут DOS, опреационная система не будет знать, где
искать программу.
Пусть системный диск с программой ТВ.ЕХЕ находится на
накопителе А, а вы видите на экране подсказку В>. Если вы введете
ТВ и нажмете Enter, DOS не будет знать, что имеется в виду и
вывудут сообщение "Неверная команда или имя файла".
Другими словами, вы на неправильном пути. Еаким образом, если
получено соответствующее сообщение об ошибке, настройтесь на
накопитель А с помощью ввода А: и нажмите Enter. Затем введите ТВ
и нажмите Enter, чтобы загрузить ТУРБО БЕЙСИК.
Вы можете задать "маршрут" для ваших файлов на БЕЙСИКЕ так,
что DOS сможет найти их с помощью команды Path. Более полную
информацию вы найдете в разделе "Файл AUTOEXEC.BAT".
Каталоги
Каталог (или указатель) - это удобный способ организации
файлов на гибком или жестком диске. Каталоги позволяют
подразделить диск на несколько частей подобно раскладыванию
различных групп архивных папок в отдельные ящики.
Если, например,
вы решили собрать все архивные папки, касающиеся финансов, скажем,
банковые ведомости или папку с пододными налогами, ил др. в
отдельный ящик с ярлыком "Финансы". На вашем компьютере удобно
иметь один каталог для хранения файлов ТУРБО БЕЙСИКА, другой для
писем и т.д. При этом, если вы наберете DIR в командной строке
DOS, вам не придется в посиках нужного файла просматривать сотни
других имен. Будет выведен список файлов лишь того каталога, на
который вы настроились.
Хотя каталоги можно создавать и на гибких и на жестких
дисках, чаще всего они используются на жестких дисках. Это связано
с тем, что последние содержат значительно больший объем данных,
однако, это же приводит к необходимости структурной организации и
группировке данных.
Работая на уровне DOS, а не в ТУРБО БЕЙСИКЕ или какой-либо
другой программе, вы можете создавать новые каталоги, перемещать
файлы из одного каталога в другой и выводить список файлов в
конкретном каталоге.
В приведенных ниже примерах предполагается, что вы
используете систему на жестком диске, и настроены на жесткий диск
так, что на экране вы видите подсказку С>. Если вы хотите создать
каталоги на гибких дисках, замените в примере С на А или В.
Для того, чтобы создать каталог для файлов ТУРБО БЕЙСИКА,
следует выполнить следующее:
1. На подсказку С> наберите MRDIR BASIC и нажмите Enter. Команда
MKDIR сообщает DOS о том, что нужно создать каталог с именем
BASIC.
2. Введите CHDIR BASIC и нажмите Enter. Команда CHDIR настраивает
DOS на ваш каталог.
11
3. Затем поместите диск с ТУРБО БЕЙСИКОМ, который вы хотите
скопировать на одно из устройств для гибких дисков, скажем, А, и
введите команду СОРY А: *.* Enter (звездочки используются в
качестве шаблонов, обозначающие в данном случае все файлы).
Команда COPY заставляет DOS скопировать все файлы на устройстве А
в каталог BASIC на устройстве С. По мере копирования каждого
файла, на экране появляется соответствующее сообщение.
Oб этом все. К каталогу следует относиться также как и к
накопителю; для того, чтобы загрузить ТУРБО БЕЙСИК, следует,
прежде чем вводить ТВ, настроиться на каталог BASIC, иначе DOS не
сможет найти нужную программу.
Подкаталоги
Если вам действительно очень нравится структурная
организация, вы можете разбить каталоги на подкаталоги. Можно
создать столько каталогов и подкаталогов, сколько вам захочется -
не забудьте только, куда какие файлы вы поместили.
Подкаталог создается тем же способом, что и каталог. Для
того, чтобы создать подкаталог в каталоге BASIC (например для
хранения графических файлов), сделайте следующее:
1. Убедитесь в том, что вы в каталоге BASIC
2. Введите MKDIR GRAF Enter
3. Введите CHDIR GRAF Enter
4. Введите MKDIR GRAF Enter. Теперь вы в подкаталоге GRAF.
Если вы хотите хранить в этом подкаталоге уже имеющиеся
графические файлы, скопируйте их. Если они находятся на гибком
диске с расширением .GRP, поставьте диск на накопитель А и нажмите
Enter. Если файлы находятся в корневом каталоге жесткого диска,
наберите COPY *.GRP и нажмите Enter.
Где_я_нахожусь?_Подсказки_$p$g
Возможно, что вы уже заметили, что при смене каталогов, вы
видите одну и ту же подсказку С>; т.е., не очевидно, в каком
каталоге или подкаталоге вы находитесь. Это может запутать,
особенно если вы на какое-то время ушли с машины. Легко забыть,
где вы до этого времени находились.
DOS предоставляет простой способ обнаружить это. Введите
prompt=$p$g
и с этого момента (до тех пор, пока вы не выключите компьютер или
не перезагрузитесь) подсказака точно покажет вам, где вы
находитесь. Попробуйте. Если вы еще в подкаталоге GRAF, подсказка
DOS будет выглядеть как:
С:\BASIC\GRAF>
Ффйл_AUTOEXEC.BAT
Можно избежать ввода команды посказки (которая обсуждалась
выше) для того, чтобы посмотреть "где вы находитесь" при каждом
включении компьютера, если внести ее в файл AUTOEXEC.BAT. Он будет
выполнять эту команду каждый раз когад вы включите машину.
Файл AUTOEXEC.BAT - это удобное средство и он может выполнять
множество других функций кроме этой. Но вместо того, чтобы
углубляться в детали здесь,мы предлагаем обратиться к руководству
по DOS. Однако, мы покажем вам, как создать файл AUTOEXEC.BAT,
который автоматически изменит посказку с тем, чтобы вы всегда
знали, где в структуре каталогов вы находитесь, установит маршрут
каталога BASIC и загрузит ТУРБО БЕЙСИК.
Команда задания маршрута (path) в DOS сообщает компьютеру,
где искать команды, которые операционная система не может узнать.
DOS узнает программы только в текущем (том, на который настроен)
12
каталоге, если не задан маршрут каталога, содержащий подходящие
программы или файлы.
В следующем примере устанавливается маршрут к каталогу BASIC
и подкаталогу FILES.
Если в корневом каталоге имеется файл AUTOEXEC.BAT, ваш
компьютер выполнит все, что в нем содержится в тот момент, когда
компьютер будет включен (корневой каталог - это тот, для которого
указывается С> или С:\ без всякого имени каталога).
Далее, изложено, как создать файл AUTOEXEC.BAT:
1. Наберите CHDIR\ для того, чтобы настроиться на корневой
каталог.
2. Наберите COPY CON AUTOEXEC. BAT Enter. Эта команда сообщает DOS,
что все введенное вами дальше должно быть скопировано в файл
AUTOEXEC.BAT.
3. Введите
ECHO OFF
PROMPT=$P$G
PATH=C:\BASIC;C:\BASIC\FILES
CHDIR\BASIC
\BASIC
Ctrl Z Enter
Команда Ctrl Z сохраняет введенные команды в файле
AUTOEXEC.BAT.
Для того, чтобы проверить ваш новый файл AUTOEXEC.BAT,
перезагрузите систему, нажав одновременно Ctrl+Alt+Del. Когда
загрузка завершится, вы увидите подсказку C:\BASIC>.
Система_каталогов
Как перейти из одного каталога в другой? Это зависит от того,
куда вы хотите перейти. Основная команда DOS для смены каталогов -
это CHDIR. Используйте ее следующим образом:
* Для перехода из одного каталога в другой:
например, для перехода из каталога BASIC в каталог WP, введите:
C:\BASIC>CHDIR\WP Enter
Обратите внимание на обратную косую черту (\) перед именем
каталога. При каждом переходе из одного каталога в другой, не
связанный с ним, перед именем каталога следует указывать обратную
косую черту.
* Для перехода из каталога в подкаталог:
например, из каталога BASIC в подкаталог GRAF, введите за
подсказкой с именем каталога BASIC
C:\BASIC>CHDIR GRAF Enter
В этом случае обратная косая черта вам не понадобится, так как
каталог GRAF является ответвлением каталога BASIC. На самом деле,
если вы используете обратную косую черту, DOS поймет вас
неправильно. При указании обратной косой черты DOS посчитает, что
ее каталог GRAF входит в основной (корневой) каталог.
* Для перехода из подкаталога в пораждающий его каталог:
например, для перехода из подкаталога GRAF в каталог BASIC,
введите вслед за подсказкой подкаталога GRAF:
C:\BASIC\GRAF>СHDIR ..Enter
и DOS вернет вас в каталог BASIC. Каждый раз, когда вам
понадобится вернуться в пораждающий каталог, укажите за командой
CHDIR пробел и две точки.
* Для возврата в корневой каталог:
корневой каталог - это исходный каталог, он является "родителем"
(и даже "прародителем") всех каталогов (и подкаталогов).
Находясь в корневом каталоге вы увидите посказку C:\>
Для перехода в корневой каталог введите CHDIR \Enter. Обратная
косая черта без имени каталога сообщает DOS, что вы хотите
13
вернуться в корневой каталог.
Конфигурирование_операционной_среды
Если у вас есть специальные требования к аппаратным средствам
или вы разработчик, нуждающийся в динамической среде, возможность
установки переменных среды предоставляет вам определенный выбор.
Переменные среды задаются с помощью команды SET в DOS и
переопределяют опции компилятора и/или программы.
Переменные среды воздействуют на всю среду, в кото рой
выполняется программа. Таким образом, установленный однажды
параметр действует до тех пор, пока он не будет переустановлен или
пока машина не будет выключена. Если значения параметров
устанавливаются всегда одним и тем же образом, вы можете ввести
команду SET в пакетный (bath) файл, или в файл AUTOEXEC.BAT
(описание этого файла см. выше).
Переменные среды в ТУРБО БЕЙСИКЕ позволяют переопределять
опции компилятора и режимы выполнения для сопроцессора 8087 и
проверки цветного графического адаптера (CGA). Предположим, что вы
хотите использовать сопроцессора 8087 в опреационной среде. На
подсказку DOS введите:
SET 87=yes
где "yes" означает, что у вас есть сопроцессор, "no" означает, что
если даже 8087 имеется, использовать его не следует. По умолчанию
- "yes".
В случае "снежной проверки" CGA, ввудите
SET CGA SNOWCHK=no
где "no" отменяет выполнение "снежной проверки", а "yes" ее
выполняет. По умолчанию - "yes".
Когда компилятор начинает работу, или запускается на
выполнение сгенерированные файлы .ЕХЕ, происходит просмотр
пространства переменной среды с целью определения их значений.
Хотя и нет необходимости в установке значений переменной среды,
они в вашем распоряжении в любой момент, когда вам это
понадобится. Если вы предпочтете не задавать их, текущий каталог
будет искать соответствующие файлы и создает временные файлы для
хранения переменных по умолчанию.
Это приложение предоставляет лишь краткий обзор DOS и
некоторых его функций. Если вы уже знакомы с тем, что изложено
здесь, вы можете изучить зуководство по DOS и обнаружить там
множество действий, которые выполняются с помощью операционной
системы. Там вы найдете множество других функций, здесь не
упомянутых, которые упростят и расширят вашу работу с компьютером.
ПРИЛОЖЕНИЕ_H
Краткое_описание_функций_и_процедур
Это приложение можно использовать как краткий справочник
процедур и функций, сгруппированных в соответствии с их действием.
Так, например, под заголовком "Символьные операции" приведена, в
частности, функция $BIN, которая возвращает двоичный символьный
эквивалент заданного числа, а также все остальные операции работы
со строками.
Связывание
CHAIN Вызывает цепной модуль ТУРБО БЕЙСИКА (с расширением
.ТВС).
COMMON Объявляет переменную (ые), передаваемые в цепную
программу.
RUN Перезапускает программу.
14
Определение_данных
DIM Объявляет массивы.
LET Присваивает переменной значение.
LOCAL Объявляет локальные переменные в процедуре или функции.
OPTION BASE Объявляет минимальное значение для индексов массива.
REM Отделяет програмные коментарии.
SHARED Определяет разделяемые (глобальные) переменные в
процедуре или функции.
STATIC Объявляет статические переменные в процедуре или
функции.
TRON/TROFF Включает и выключает трассировку выполнения.
15
ПРИЛОЖЕНИЕ D
Сравнение Турбо-Бейсика с Интерпретаторным Бейсиком
Существует три принципиальных различия между Т.Б. и И.Б.:
1.Компилятор против Интерпретатора
2.Расширение в Т.Б. языка Бейсик
3.Реализация компилятора
Каждая из этих статей определяет много других вторичных различий
между реализациями этих двух Бейсиков,которые будут рассмотрены здесь
детально.
Компилятор в сравнении с Интерпретатором
----------------------------------------
В Интерпретаторах существует тенденция затушевывать различие между
командами для создания программ и теми 6которые фактически используются
в программах;другими словами,системой создания программы и собственно
языком.Например,EDIT и AUTO не являются частью языка в том смысле,в ка-
ком его частями являются GOSUB и PRINT.Интерпретаторы исполняют програм-
мный код в порядке его следования.Тогда как компиляторы сначала сканиру-
ют все исходные операторы,а затем генерируют исполнительный код для ис-
ходных заявлений.Это последнее свойство позволяет Т.Б. как компилятору
предупредить попадание ошибок в программный код.
В следующем примере,где используется И.Б.:
10 x=5
20 if x=3 then goto 30:x=10:z="aaa"
во-первых,если Х никогда не равно 3,то операторы,следущие за then
никогда не будут исполнены и синтаксическая ошибка,связанная с попыткой
назначить строку числовой переменной,никогда не будет обнаружена.Во-вто-
рых,операторы x=10 и z="aaa" никогда не будут исполнены,если x=3,потому
что goto ориентировано на строку 30.Компилятор будет отмечать флагом лю-
бой "мертвый код",как ошибку компилирования.
Неподдерживаемые команды
------------------------
Т.Б. благодаря его поистине полноэкранному редактору и командам воз-
буждения из меню для вспомогательных функций ,не нуждается в любых опе-
раторах,относящихся к загрузке,хранению и редактированию исходных прог-
рамм;по этой причине они из Т.Б. выпали.Соответствущие команды И.Б.
обычно используются в режиме DIRECT и включают в свое число следущие:
AUTO (авто) LOAD (загрузить)
DELETE (стереть) NEW (новый)
EDIT (редактировать) RENUM (перенумеровать)
LIST (список) SAVE (хранить)
Т.Б. позволяет вам редактировать и создавать программы с использова-
нием текстового редактора,так что у вас нет необходимости в командах для
изменения или стирания программных строк(таких как EDIT и DELETE).Если
вы желаете нарушить строку сразу же перемещайте курсор к специфицирован-
ной строке и нажимайте Ctrl-Y.Точно так же ,нет необходимости в
LIST-вместо этого вы исполняете подходящие удары по клавишам для получе-
ния желаемой части программы на экране.
Функции главного меню Т.Б. обеспечивают выполнение некоторых за-
дач,которые в И.Б. реализуются с применением SAVE,LOAD,и NEW.А поскольку
в Т.Б. вы не нуждаетесь в нумерации строк,отпадает необходимость в AUTO
и RENUM.В Т.Б. не поддерживаются также и следущие команды:
CONT (продолжать)
Т.Б. не допускает повторный запуск прерванной программы.прерывание
программы с помощью STOP или Ctrl-Break есть то же самое,что использова-
ние оператора END (конец).
MERGE (Слить)
Т.Б. компилирует программы в исполнительный код,поэтому невозможно
сливать воедино строки исходной программы во время исполнения.
MOTOR (мотор)
Кассетное внешнее устройство,видимо ,не будет самой популярной осо-
-202 -
бенностью РС.
USR (пользователь)
Оператор CALL выполняет работу USR и даже более того.
Операторы ,требующие модификации
--------------------------------
CALL ABSOLUTE (вызвать абсолютно)
CALL ABSOLUTE принимает только целые параметры и было включено для
обеспечения минимальной совместимости с И.Б..Т.Б. дает более мощные про-
цедуры для полного программирования на языке ассемблера CALL INTERRUPT и
INLINE
CHAIN (цепочка)
сцепляемые программы должны компилироваться либо как .EXE-файлы,либо
как .TBC-файлы,в зависимости от выбора переключателя меню опций "Компи-
лировать в .EXE" или "Компилировать в цепочку".В операторе COMMON и пер-
воначальной,и сцепленной программ общие переменные должны перечисляться
в правильном порядке (хотя не обязательно с одинаковым именем).Вы не мо-
жете исполнять оператор CHAIN ,когда прогон выходит из среды Т.Б..Ис-
пользование CHAIN возможно только при прогоне из DOS.Опции диапазона но-
меров строк MERGE и DELETE не поддерживаются.DEFтип (определить
тип),TRON,TROFF(включить,выключить трассировку),OPTION BASE (опциональ-
ный базис).
Эти операторы качественно отличаются от аналогичных И.Б.Т.Б. расс-
матривает физическое положение каждого оператора в исходной программе,а
не в исполнительном проходе обьектной программы.Другими словами,имеется
ввиду,что положение этих операторов в период компилирования,а не прогона
,управляет их действием.Рассмотрим,в качестве примера приведенную ниже
простую программу,где используется DEFтип:
10 GOTO 30
20 DEFINT X
30 X=2.3
40 PRINT X
При исполнении этой программы в И.Б. ,невозможно увидеть оператор
определения типа в строке 20.Следовательно,используется тип переменной
по умолчанию(единичная точность),когда в строке 30 встречается перемен-
ная X,а затем на экран выводится 2.3.
Т.Б. рассматривает соображения касающиеся типа,попутно в период ком-
пиляции.Поскольку оператор DEFINT физически предшествует первому появле-
нию X,эта переменная становится целой и оператором PRINT выводится 2.
DRAW (чертить),PLAY (играть)
Оба эти оператора обеспечивают исполнение строк сложной инструкции,в
результате чего вычерчивается требуемая графика или играется заказанная
музыка,соответственно.В И.Б. строчная информация,которая обеспечивает
приведение этих команд в действие,может содержать имена строчных или
числовых переменных,заключенных в строке инструкций.Например,в И.Б. опе-
раторами
n=50
play "t=n;c"
устанавливается темп исполняемой музыки на 50 четвертых нот в минуту
и исполнение ноты с.Т.Б. не может понять такую конструкцию,поскольку
после компилирования вся информация об идентификаторе,ассоциируемой с
переменной n,теряется.Однако вы можете добиться того же эффекта,пользу-
ясь функцией VARPRT$:
n=50
play "t="+varprt$(n)+"c"
Функциональные параметры
------------------------
Что касается функциональных параметров,И.Б. дает вам возможность ис-
пользовать то же самое имя переменной параметра.Т.Б. дает сообщение об
ошибке по дублированию локальной переменной.
RUN (прогон)
Программа на Т.Б. может исползовать RUN для загрузки и исполнения
другой программы или повторного запуска себя самой ,но не существует
-203 -
способа повторно запустить текущую программу с какой-либо точки,кроме
начала;вы не можете специфицировать какую-либо опцию с номером строки.
Преобразование программ Интерпретаторного бейсика в Турбо-Бейсик.
-----------------------------------------------------------------
Первый шаг в преобразовании программ на И.Б. в Т.Б. состоит в сохра-
нении ее на диске в формате ASCII.Например,чтобы сохранить вашу програм-
му,набирайте:
SAVE "прогимя.txt",A
опция "А" вызывает выписку И.Б.
текстового (ASCII) файла без выпол-
нения символизации.Этот файл может непосредственно считываться в Т.Б.
,хотя если она больше 64К, вам придется разделять ее на отдельные главный
и включаемые файлы до того,как ее можно будет редактировать или компили-
ровать с помощью Т.Б.
Расширения языка Бейсик
------------------------
В Т.Б. добавлено много командных возможностей и расширений языка
Бейсик.Ниже обсуждаются некоторые расширения.
Структурированные операторы
---------------------------
Как усовершенствование И.Б.,Т.Б. используются операторы
IF/ELSEIF/ELSE/ENDIF и SELECT CASE для управления программным потоком и
поддержания легкого чтения программ.Новое блочно-структурированное заяв-
ление DO/LOOP дает возможность всеобьемлющего управления программными
циклами с тестированием в начале и в конце цикла.
Ввод/вывод двоичного файла
---------------------------
Т.Б. поддерживает новый режим BINARY (двоичный) ввода и вывода файла.Ко-
манды GET$(получить) ,PUT$ (ввести) и SEEK (найти) предоставляют прог-
раммисту очень низкий уровень управления файлом.Программам может считы-
вать или записывать байты в файл и позиционировать файловый указатель на
любом байте.
Определения функций и процедур
-------------------------------
Определение функций в Т.Б. может быть в виде единственной строки,по-
добной стандартным функциям И.Б.,и многострочным,допускающим механизм
более структурированной подпрограммы .Операторы SUB (подпрограмма) или
ENDSUB (конец подпрограммы) дают возможность создавать процедуры.
Т.Б. поддерживает процедуры и функции с истинной поддержкой локаль-
ных переменных.Для определения того,какие переменные будут проталкивать-
ся на стек во время реккурсивного исполнения,используется оператор LOCAL.
Интерфейс языка ассемблера
----------------------------
Оператор CALL имеет в Т.Б. три формы:
CALL процедурыимя,CALL INTERRUPT и CALL ABSOLUTE.CALL INTERRUPT ис-
пользует команду REG для подачи данных через буфер регистров.Вставляемые
в строку (INLINE) байты языка ассемблера или .COM-файлы могутзаключаться
в процедуры с использованием директивы $INLINE (в строку).
Встроенные функции
------------------
В отличии от И.Б.,трансцедентные функции Т.Б. возвращают результаты
двоичной точности.
Новые команды
---------------
В Т.Б. имеется много новых команд,а также опций для старых.В таблице
частично перечислены улучшения И.Б.
-------------------------------------------------------------------
BIN$ возвращает двоичную форму целого
-------------------------------------------------------------------
BINARY новый файловый режим для низкоуровнего доступа
-------------------------------------------------------------------
CEIL,FIX плавающая точка для целых функций
-204 -
-------------------------------------------------------------------
COMMAND$ возвращает трейлер командной строки
-------------------------------------------------------------------
CVMS,CVMD, транслирует существующие данные формата МИКРОСОФТ
MKMS$,MKMD$
-------------------------------------------------------------------
DECR/INCR альтернативный способ приращения и сбрасывания переменных
--------------------------------------------------------------------
DEFLNG,MKL$,CVL поддержка нового типа длинных целых
--------------------------------------------------------------------
DELAY ожидание n секунд (для независимых машинных задержек)
--------------------------------------------------------------------
DO/LOOP гибкая конструкция цикла в стандарте ANSI
--------------------------------------------------------------------
ERADR адрес самой последней ошибки
--------------------------------------------------------------------
EXIT покидается цикл FOR/NEXT,WHILE/WEND или DO/LOOP,IF-блоковый,про
цедура либо функция
--------------------------------------------------------------------
EXP2,EXP10 возвращается результат возведения в степень
--------------------------------------------------------------------
GET$ считываются данные из файлов в режиме BINARY
--------------------------------------------------------------------
IF/ELSEIF/ELSE/ END IF выполняется множественный тест если
--------------------------------------------------------------------
INLINE вставляются байты непосредственно в обьектный код
--------------------------------------------------------------------
INSTAT возвращается состояние клавиатуры
--------------------------------------------------------------------
LCASE$ преобразуется строка в нижний регистр
--------------------------------------------------------------------
LOCAL/SHARED/STATIC заявляются переменные процедур и функций
--------------------------------------------------------------------
LOG2,LOG10 возвращаются логарифмы по основанию 2 и 10
--------------------------------------------------------------------
MEMSET определяется пространство в высокой памяти
--------------------------------------------------------------------
MTIMER таймер тонкой разрешающей способности
--------------------------------------------------------------------
PUT$ записываются данные в файл в режиме BINARY
--------------------------------------------------------------------
REG считывание /запись буфера регистров
--------------------------------------------------------------------
SEEK определение позиции в файлах в режиме BINARY
--------------------------------------------------------------------
SELECT CASE мощные возможности тестирования по операторам CASE
--------------------------------------------------------------------
SUB/END SUB определяется процедура
--------------------------------------------------------------------
VARSEG возвращается адрес сегмента или переменной массива
--------------------------------------------------------------------
Если вы непреднамеренно используете некоторые из этих резервирован-
ных слов в качестве переменных6то получите сообщение о синтаксической
ошибке периода компилирования.Для правильного компилирования выполняйте
операцию найти и заменить с целью исправить конфликтный имена переменных.
Реализация компилятора
-----------------------
Реализация компилятора затрагивает некоторые существующие Б.-прог-
раммы,а также повышает возможности управления компилированием программ и
генерированием кода.Мы уже обсудили ряд различий и расширений;другие
важные моменты,которые проистекают из реализации Т.Б.,будут обсуждаться
в этом разделе.
Редактор и большие программы
-----------------------------
-205 -
Интегрированный в Т.Б. редактор допускает размер исходной программы
не более 64К.Директива $INCLUDE (включить) дает возможность компилиро-
вать программы более 64 К.Если у вас есть программа более 64К,потребует-
ся расщепить ее на несколько отдельных файлов.Для спецификациипрограм-
мы,которую вы желаете запустить на компилирование в Т.Б. (если она отли-
чается от файла,находящегося в данный момент в буфере редактора),исполь-
зуйте опцию главного файла из меню.
Редактор Т.Б. поддерживает строки шириной до 248 литер.И.Б. поддер-
живает строки шириной до 255 литер.Строки,которые длинее 248,будут авто-
матически разделяться возвратом каретки после колонки 248.Однако вы бу-
дете продолжать нуждаться в привязке правильности форматообразования
строк перед загрузкой вашей программы в редактор Т.Б.Т.Б. также поддер-
живает программы ,которые больше 64К исполнительного кода.Директивой
$SEGMENT специфицируется ,что будет генерироваться новый сегмент кодов,а
все CALL/GOTO будут изменены на далекие вызовы и переходы.