Г Л А В А 5 ------------------------------------------------------------------ Справочное руководство ТУРБО БЕЙСИКа ------------------------------------------------------------------ 200 с лишним команд ТУРБО БЕЙСИКа по своим синтаксическим призна- кам делятся на функции, операторы, системные переменные и метаопе- раторы. Функции (предопределенные, в отличии от определяемых пользователем) возвращают значение и поэтому должны использоваться в рамках выражений. Большинство их требует одного или двух аргументов, например: t=cos(3.1) ' числовая функция w/1 числовой аргумент ts=LEFT$("Cat",2) ' символьная функция w/1 символьный и 1 числовой аргумет Операторы представляют собой неделимые строительные блоки, которые составляют программы. Операторы появляются в строке самостоятельно или с ограничительными двоеточиями между соседними операторами; например: CIRCLE (160,000), 50 ' начертить круг CALL MySub (x,y,z) ' вызвать процедуру а = а + 1 ' выполнить присваивание (см.оператор LET) Системные переменные являются предопределенными идентификато- рами доступа и управления определенной системной информацией, например: a$ = DATE$ ' читать системную дату TIME$ = "00:00" ' установить системное время Метаоператоры представляют собой директивы компилятора. Строго говоря, они не являются частью языка, а оперируют на другом уровне, управляя действиями компилятора, например: $INCLUDE "module1.tbs" ' загрузить и обрабатывать файл $STACK &H1000 ' установить объем стека Метаоператоры, как и переключатели субменю Optios компилятора, скорее управляют компилятором во время компиляции, чем компилятором во время выполнения программы. Перед метаоператорами ставится знак доллара ($), чтобы отличить их от обычных операторов. В строке может быть только один метаоператор, и, в отличии от некоторых других компилированных БЕЙСИКов, они не помещаются внутри комментариев (REM). Формат руководства ------------------------------------------------------------------ Каждая статья в руководстве содержит описание, синтаксис, общие замечания и пример использования оператора, функции или процедуры. В случае необходимости для связанных между собой статей даётся перекрeстная ссылка, определяются ограничения в использовании, отличаются различия в использовании элементов в ТУРБО БЕЙСИКе и Интерпретаторе БЕЙСИК. Ниже приводятся условные обозначения описания синтаксиса, используемые в алфавитном командном справочнике. - численное выражение Численная константа, численная функция или численная переменная, или их сочетание с использованием апифметических, логических и реляционных операторов. В некоторых случаях описывается тип численного выражения, например, выражение integer. Например: 16 х 16 * х SIN(3.14159) SIN(x /(16 * x)) - символьное выражение Символьная константа, символьная переменная или символьная функция, или их сочетание с факультативным включением оператора конкатенации, значка "плюс" (+). Например: "Cat" a$ + "Cat" LEFT$(a$ + "Cat",4) filesrec (спецификация файла) Символьное выражение, описывающее имя файла MS-DOS (восемь знаков с необязательным трехзначным добавлением с предшествующей точкой, регистр любой), возможно включая описание накопителя и/или ветви программы. Имена файлов должны быть выражены как символьные переменные или заключены в кавычки, за исключением случаев, о которых уже говорилось, например: "MYFIRST.BAS" "turbobas\myfirst.bas" "a:\tyrbobas\myfirst.bas" - ветвь Символьное выражение, описывающее действительный подсправочник на зарегистрированном накопителе. Например: "\TURBOBAS" "GAMES" - LPR (ПОТ) "Последняя опорная точка" используется как имплицитная координатная величина в некоторых операциях вычерчивания, и устанавливается большинством графических операторов. - метка Метка представляет собой либо буквенно-цифолвуё метку, либо номер строки идентифицирующий строку программы. Номера строк и метки более или менее взаимозаменяемы в синтаксисе ТУРБО БЕЙСИКа, за исключением того, что метки должны появляться в строке самостоятельно. шрифт - - - Курсив указывает зоны в пределах команд, которые должны быть заполнены специальной информацией прикладного характера, например: REG регистр, величина Текст с прописными буквами обозначает часть команды которая должна быть передана дословно, например: RESUME NEXT Квадратные скобки [ ] означают, что заключенная в них информация необязательна, например: OPEN спецификация файла AS [#] номер файла означает, что вы можете вставить номерной знак (#) перед номером файла в операторе OPEN, а можете и опустить его. Поэтому оба следующих варианта допустимы: OPEN "cust.dta" AS 1 OPEN "cust.dta" AS #1 Фигурные скобки { } указывают на выбор двух или более вариантов, один из которых должен быть испьзован. Варианты отделяются друг от друга вертикальной чертой (|). Например: KEY {ON|OFF} означает, что и KEY ON и KEY OFF являются действительными операторами, а KEY, взятый отдельно, не является таковым. Многоточие (...) указывает на то, что часть команды может быть повторена необходимое количество раз. Например: READ переменная [,переменная]... означает, что множественные переменные, отделенные друг от друга запятыми, могут быть обработаны одним оператором READ: READ a$ READ a$, b$, a, b, s Три вертикально расположенные точки указывают на опущение одной или более строк текста программы, например: FOR n = 1 to 10 . . . NEXT n Метаоператор $COM ------------------------------------------------------------------ Назначение $COM определяет место для буфера порта с после- довательным приёмом данных Синтаксис $COMn size Примечания n указывает на коммуникационный адптер (1 или 2), а size представляет собой целочисленную константу, определяющую ёмкость буфера этого адаптера (от 0 до 32767 байт), 256 по умолча- нию. Значение по умолчанию может быть установ- лено и записано в меню Options. Значения по умолчанию могут быть заменены метаоператорами в коде. Ограничения Емкость буфера, описанная в метаоператоре $COM должна быть в пределах от 0 до 32767. Интер- претатор БЕЙСИК предоставит буфер такого же размера для обоих коммуникативных портов, если они существуют. В ТУРБО БЕЙСИКе размеры этих двух буферов устанавливаются независимо. Различия Эта функциональность возможна только через ко- мандно-строчные параметры в случае интерпрета- тора БЕЙСИК. Примеры ' метаоператор $COM используется для изменения ' размера по умолчанию, определённого буферам ' портов с последовательным приёмом данных. ' устаносить программу обработки ввода COM $COM1 1024 ' установить буфер ввода 1К ON COM(1) GOSUB GetComInput COM(1) ON ' включить обработку ввода COM OPEN "COM1:" AS #1 ' открыть переменную файла как COM1 PRINT "Нажмите любую клавишу для окончания программы..." ' пока клавиша еще не нажата WHILE NOT INSTAT LOCATE 2,1 PRINT TIME ' вывести время на экран WEND END ' закончить программу GetComInput: ' обработать прерывание порта COM ' очистить ввод с буфера порта COM INPUT #1,ComPortInput$ RETURN Метаоператор $DYNAMIC ------------------------------------------------------------------ Назначение $DYNAMIC объявляет определение массива по умол- чанию динамичными. Синтаксис $DYNAMIC Примечание Метаоператор $DYNAMIC не принимает никаких ар- гументов и объявляет тип определения массива по умолчанию динамичным. Пространство для динамичных массивов выделяет- ся во время прогона. Для освобождения массива можно использовать оператор ERESE. Динамичные массивы обеспечивают более эффективное исполь- зование памяти. Массивы можно также объявить динамичными, ис- пользуя дескриптор DYNAMIC или аргументы выра- жения в операторе DIM. Массивы с изменяющимися размерами, которые объявляются общими или ло- кальными к процедуре или функции всегда дина- мичны. Смотреть также DIM , ERASE , FRE , $STATIC Примеры $DYNAMIC ' установить программу обработки ошибок ON ERROR GOTO ErrorHandler ' индицировать память в массиве PRINT FRE(-1) DIM BigArray(10000) ' объявить динамичный мас- сив BigArray(6666) = 66 ' присвоить данные ' индицировать память в массиве PRINT FRE(-1) ' ошибка прогона возвращается, если прогон осу- ' ществляется с контролем границ PRINT BigArray(6666) END ' закончить программу ErrorHandler: PRINT "Ошибка типа" ERR; PRINT "произошла по адресу" ERADR END Метаоператор $EVENT ------------------------------------------------------------------ Назначение $EVENT управляет генерацией кода со срабатыва- нием ловушки. Синтаксис $EVENT {ON|OFF} Примечание Если ваша программа включает любое срабатыва- ние ловушек (например, ON KEY, ON COM), то $EVENT срабатывает по умолчанию на ON, а компи- лятор генерирует код с контролем результата в промежутках между каждым оператором вашей прог- раммы. Если ваша программа не организует лову- шек, тогда метаоператор $EVENT находится в по- ложении OFF и не генерирует код с контролем ре- рультата. Метаоператор $EVENT дает вам возможность управ- лять тем, какие части вашей программы будут контролировать результат. Если существует зона, где максимальная скорость более важна чем быст- рое ответное действие, тогда вначале и конце поместите метаоператоры $EVENT OFF и $EVENT ON. Примеры ' EVENT пример ON TIMER (1) GOSUB WasteTime TIMER ON PRINT "Медленная цепь" x = timer FOR i = 1 TO 10000 i = i + i - i NEXT i y = timer PRINT "время цепи -" y-x $EVENT OFF PRINT "быстрая цепь" x = timer FOR i = 1 TO 10000 i = i + i - i NEXT i y = timer PRINT "время цепи -" y-x END WasteTime: FOR j = 1 TO 10000 j = j + j - j NEXT j PRINT RETURN Метаоператоры $IF/$ELSE/$ENDIF ----------------------------------------------------------------- Назначение Метаоператоры $IF, $ELSE и $ENDIF определяют порции исходной программы, которые необходимо компилировать или пропустить (это часто назы- вается условным компилированием) Синтаксис $IF постоянная . . операторы . [$ELSE . . операторы] . $ENDIF Примечания const представляет собой константу с присвоен- ным именем или постоянную величину. Если const не равна нулю (TRUE), тогда операторы между $IF и $ELSE компилируются, а операторы между $ELSE и $ENDIF не компилируются. Если const равна нулю (FALSE), тогда операторы между $IF и $ELSE игнорируются, а между $ELSE и $ENDIF компилируются. Метаоператор $ELSE является необязательным, а $ENDIF обязательным. Операторы условной компиляции могут быть вложены на уровне глубины 256. Пример %ColorScreen = 1 ' установка константы с прис- ' военнным именем на величину ' не равную нулю, указывает ' на операцию на цветной сис- ' теме. ' установка виличины, равной нулю, указывает ' на операцию ' на монохронной системе $IF %ColorScreen DEF SEG = &HB800 ' графический адрес ' экранная память $ELSE DEF SEG = &HB000 ' монохронный адрес ' экранная память $ENDIF FOR I% = 0 to 4000 STEP 2 POKE I%,ASC("A") ' заполнить экран буквами А NEXT I% ' сохранить все 4000 блоков видео записи BSAVE "SIF.DTA",0,4000 END ' закончить программу Метаоператор $INCLUDE ------------------------------------------------------------------ Назначение $INCLUDE включает текстовой файл. Синтаксис $INCLUDE filespec literal Примечание Используется $INCLUDE для компилирования текс- та другого файла наряду с текущим файлом. filespec literal - это символьная константа, а файл, который она представляет, должен исполь- зовать условные обозначения имени файла DOS и должен представлять исходный ффайл ТУРБО БЕЙ- СИКа. Если для файла включения не указывается имя файла, то ему присваивается расширение BAS. Механизм $INCLUDE заявляет компилятор обхо- диться с включенным файлом так, как будто он физически присутствовал в этот момент в ориги- нальном тексте. Это позволяет вам разбить вашу исходную программу на удобные в использовании куски программы. Концепция ТУРБО БЕЙСИКа рабо- чий-файл/главный-файл связана с $INCLUDE. В качестве иллюстрации рассмотрите файлы CALCAREA.BAS и CONST.BAS: File CALCAREA.BAS PRINT "Circle area calculating program" PRINT "If you find this program useful" PRINT "Please send $3,500 to:" PRINT PRINT "Frank Borland" PRINT "4585 Scorland" PRINT "Scotts Valley, CA 95066" PRINT "-------------------------------" $INCLUDE "CONST.BAS" INPUT "Enter radius", r PRINT "Area =" pi * r * r File CONST.BAS ' All purpose constants pi = ATN(1) * 4 %true = -1 %false = 0 %maxx = 319 %maxy = 199 Для компилирования этой программы, CALCAREA необходимо сделать "главным файлом", т.к. он является файлом с оператором $INCLUDE. Рабочий файд "путешествует" вперед и назад между файла- ми, в зависимости от того, где требуется редак- тирование (т.е. где есть ошибки). Независимо от текущего рабочего файла, компиляция всегда на- чинается с CALCAREA (главный файл). (Более под- робно описывается в Главе 3 "Основное меню"). Когда компилятор ТУБРО БЕЙСИКа встречает ме- таоператор $INCLUDE в 7 строке CALCAREA, он приостанавливает считывание с кода, загружает и начинает считывать знаки с CONST.BAS. Когда этот код исчерпан, компилятор возвращается в то место оригинальной программы, где было приоста- новлено считывание. Метаоператор $INCLUDE может быть помещён на глубину 5; то есть включенный файл может иметь свой собственный метаоператор $INCLUDE. Пример ' Записать следующую информацию в файл ' называемый "EXAMPLE.INC". SUB SayHello ' процедура печатает PRINT "Hello" ' "Hello" на экране END SUB ' Далее идет главная программа $INCLUDE "EXAMPLE.INC" ' включить исходный файл CALL SayHello ' вызвать определенную процедуру ' в включенном файле END ' закончить программу Метаоператор $INLINE ------------------------------------------------------------------ Назначение $INLINE объявляет встроенный машинный код в встроенной процедуре. Синтаксис $INLINE [byte list] [filespec literal] Примечания $INLINE встречается только в пределах тела встроенной процедуры. byte list представляет собой последователь- ность целых чисел в пределах от 0 до 255, кото- рые должны кодироваться непостредственно в объектный код в этом месте. filespec literal - это имя файла, содержаще- го код, который необходимо встроить. Этот код должен перемещаться, а также сохранять и вос- станавливать следующие регистры: Сегмент Стека (SS), Указатель Стека (SP),Указатель Базы (ВР), Сегмент Данных (DS). Встроенный (inline) код может обращаться к параметрам использую относи- тельную адресацию BP. (Более подробно об этом см. Приложение А "Рассмотрение чисел", и Прило- жение С "Интерфейс языка Ассемблера"). Пример SUB Shriek INLINE ' $INLINE заставляет динамик издать крик $INLINE &HBA, &HOO, &HO7, &HE4, &H61, &H24 $INLINE &HFC, &H34, &HO2, &HE6, &H61, &HB9 $INLINE &H4O, &HO1, &HE2, &HFE, &H4A, &H74 $INLINE &HO2, &HEB, &HF2 END SUB CALL Shriek END ' закончить программу Метаоператор $SEGMENT ------------------------------------------------------------------ Назначение $SEGMENT объявляет новый сегмент кода. Синтаксис $SEGMENT Примечания Используйте метаоператор $SEGMENT "отсутстсвие аргумента" для прерывания вашей исходной прог- раммы, когда компилятор сообщает, что произошло прерывание ограничения сегмента кода 64К: Error 409 Segment OverflowВся информация после метаоператора $SEGMENT будет помещена в новый сегмент кода. Это прев- ращает каждый оператор управляющей логики прог- раммы (GOSUB, GOTO), который проходит контроль через данную границу, в движение интерсегмента, вызов или скачок, для выполнения которых требу- ется немного больше времени и объема стека. Эту потерю времени можно уменьшить, поместив опера- торы $SEGMENT в местах, где происходит естест- венное разделение вашей программы; например, между главной программой и подпрограммами или между главной программой и кодом инициализации или окончание. В программе ТУРБО БЕЙСИКа может быть до 16 сегментов кода. Данные состояния компиляции, напечатанные после компиляции, покажут размеры каждого сегмента, отделенные косой чертой (/). Нельзя использовать оператор $SEGMENT в рам- ках структурного блока; например, FOR/NEXT, DO/LOOP, WHILE/WEND, IF BLOCK. Пример SUB Proc1 PRINT "This is a dummy procedure" END SUB $SEGMENT ' определите второй сегмент SUB Proc2 PRINT "This is another dummy procedure" END SUB $SEGMENT ' определите третий сегмент SUB Proc3 PRINT "This is another dummy procedure" END SUB CALL Proc1 CALL Proc2 CALL Proc3 END ' закончить программу Метаоператор $SOUND ------------------------------------------------------------------ Назначение $SOUND объявляет ёмкость буфера фоновой музыки. Синтаксис $SOUND buffer size Примечания buffer size - это численная константа, показы- вающая нотную ёмкость фонового буфера оператора PLAY, от 1 до 4096. Увеличение ёмкости буфера до максимума (количество нот, которые прозвучат в данной программе) делает создание нотносчет- ной ловушки ненужным. Каждая нота требует 8 байтов памяти; емкость по умолчанию составляет 32 ноты или 256 байтов. Значение по умолчанию может быть использовано и записано путем использования элемента Music By- ffer на меню Options. Значения по умолчанию за- меняются метаоператорами, встроенными в код. Метаоператор $STACK ------------------------------------------------------------------ Назначение $STACK описывает размер стека выполнения прог- раммы. Синтаксис $STECK count Примечания count - это численная константа от 1024 до 32К. Метаоператор $STACK определяет какой объем па- мяти выполнения программы будет отведен стеку. Стек используется для адреса возврата во время вызовов программы и в рамках структурных опера- торов, а также в локальных переменных много- строчных функций. Размер по умолчанию (и мини- мальный) - 1024 (400Н) байтов. Вам может понадобится больший объем стека, если ваша программа ненормально расположена, испoльзует большие локальные переменные или осуществляет рекурсию. Если вы предполагаете, что вашей программе не хватит объёма стека, то вам необходимо вновь произвести компиляцию с версией текста STACK в меню Options. Программы, генерируемые с настоящим переключателем отладки во включенном состоянии, всегда проверяют имею- щийся в распоряжении объем стека до входа в подпрограммы, процедуры и функции. Значения по умолчанию заменяются метаоператорами, встроен- ными в код. Вы можете самостоятельно проверить количест- во свободного объема стека с помощью функции FRE(-2). Смотреть также FRE Пример ' Дает стек в 4096 байтов... $STACK &H1000 PRINT FRE(-2) ' показывает омеющийся в распоря- ' жении объем стека Метаоператор $STATIC ------------------------------------------------------------------ Назначение Метаоператор $STATIC описывает размещение мас- сива по умолчанию как статическое. Синтаксис $STATIC Примечания Метаоператор $STATIC не принимает аргумента и приписывает размещение массива по умолчанию как статический тип. Пространство для статических массивов выделяется во время компиляции. Масси- вы с постоянными размерами являются всегда ста- тическими, кроме тех случаев, когда массив опи- сывается локальным по отношению к процедуре или функции, либо если для одного и того же массива существует более, чем одна величина (размер). Статические массивы не уничтожаются. Опера- тор ERASE только инициирует каждый элемент в массиве к нулю или пустой строке. Обратите внимание, что метаоператор $STATIC, несмотря на косметическое сходство, не имеет ничего общего с оператором STATIC, который опи- сывает специальный тип локальной переменной в пределах процедур и функций. Метаоператор $STATIC есть по умолчанию ком- пилятора. Смотреть также DIM , $DYNAMIC , ERASE , FRE Пример $STATIC ' эксплицитно объявляет статические ' массивы PRINT "Memory available:",FRE(-1) ' выводится свободный объем памяти DIM A(50) ' A является статическим массивом PRINT "Memory available:",FRE(-1) N = 50 ' B является динамическим массивом из-за ' выражения, используемого в качестве ар- ' гумента в операторе DIM DIM B(N) PRINT "Memory available:",FRE(-1) ' теперь уже меньше ERASE A PRINT "Memory available:",FRE(-1) ' нет никакой разницы, потому что А не переме- ' щается, а просто обнуляется ERASE B PRINT "Memory available:",FRE(-1) ' больший объем памяти, потому что динамические ' массивы перемещаются END ' закончить программу