Если адрес указан, то адресная информация, запомненная вместе с файлами, созданными с помощью оператора BSAVE, уничтожается. Команда BLOAD не выполняет проверку нахождения адреса в каком-либо заданном диапазоне, поэтому по небрежности можно загрузить этой командой содержимое файла в начало DOS и/или на место вашей программы, что приведет к краху системы. Ограничения: BLOAD не загружает непосредственно в память ЕGA. Смотри также: BSAVE DEF SEG Пример: REM LoadGraphicsScreen DEF SEG &HB800 BLOAD 'Picture",0 Оператор BSAVE Функция: BSAVE сохраняет содержимое области памяти пользователя на диске. Синтаксис: BSAVE имя_файла, адрес, длина Комментарии: Имя_файла - это допустимое символьное выражение, определяющее файл, куда должны быть записаны данные. Имя_файла должно удовлетворять стандартным требованиям присвоения имен в DOS и может включать имя устройства и/или информацию о пути. Адрес - допустимое числовое выражение, имеющее значение в диапазоне от 0 до 65535. Оно определяет смещение ячейки памяти, начиная с которой будет осуществляться запись в файл (смотри описание оператора DEF SEG). Длина - это допустимое числовое выражение, имеющее значение в диапазоне от 0 до 65535 и задающее длину сохраняемой области памяти в байтах. BSAVE сохраняет содержимое области памяти на диске (в действительности сохраняет цифровую копию указанной области по состоянию на время выполнения BSAVE). Файлы, создаваемые оператором BSAVE, могут быть затем загружены с помощью оператора BLOAD; кроме того, имеется возможность загружать эти файлы на другие адреса. BSAVE и BLOAD часто используются для сохранения и загрузки образа экрана непосредственным чтением и записью дисплейной памяти. Размер буфера монохромного дисплейного адаптера - 4000 байтов и начинается с ячейки со смещением 0 в сегменте &HB000. Размер дисплейного буфера цветного графического адаптера в текстовом режиме ( SCREEN 0 ) - 4000 байтов и 16384 байта для графических режимов со средней и высокой разрешающей способностью; оба начинаются с ячейки со смещением 0 в сегменте &HB800. Ограничения: Перед выполнением оператора 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 вызывает процедуру (подпрограмму). Синтаксис: CALL имя_процедуры [(список параметров)] Комментарии: Параметр "имя_процедуры" задает имя процедуры, определенной где-либо в программе с помощью оператора SUB. Необязательный аргумент "список параметров" - задает переменные, выражения и/или константы, разделенные запятыми и торые передаются процедуре. Существует 3 типа процедур: STATIC (статические), стандартные процедудуры, и INLINE (встроенные). Предыдущее изложение применимо ко всем типам процедур; однако, способ обработки компилятором списка параметров зависит от типа процедуры. Число и тип передаваемых аргументов должны соответствовать списку параметров в определении процедуры с заданным именем; в противном случае, компилятор выдает ошибку "Parameter Mismatch" (Несоответствие параметров). Если процедура является встроенной (INLINE), то число аргументов является переменным и проверка типа параметров не выполняется. Встроенная процедура сама должна знать или определять число и тип переданных ей параметров. (Более подробная информация o встроенных процедурах приведена в приложении С "Связь с языком ассемблера"). Когда аргументы процедуры передаются по ссылке (т.е. они являются переменнымие), они могут изменяться вызванной процедурой. Если переменная заключена в круглые скобки, она передается по значению, которое не может быть изменено. Следует отметить, что выражения и константы всегда передаются по значению. Передача массивов осуществляется заданием имени массива, за которым следуют пустые скобки. Массивы всегда передаются по ссылке. Например: CALL SumArray (a()) 'передать массив а в SumArray CALL SumArray(a(3)) 'передать 3-ий элемент массива а 'в SumArray Смотри также: $INLINE SUB Пример: DIM Array(1) 'объявляет массив из двух чисел SUB TestProcedure(I%, L&, S!,D#, E, A(1)) ' эта процедура просто выводит значения ' каждого параметра, переданного ей. PRINT I%; L&; S!; D#; e; A(0) END SUB 'конец процедуры TestProcedure Integer% = 1 LongInt& = 2 SinglePre! = 3 DoublePre# = 4 Array(0) = 5 CALL TestProcedure(Integer%, LongInt&, SinglePre!, _ DoublePre#, Integer%^2, Array(1)) END 'конец программы Оператор CALL ABSOLUTE Функция: CALL ABSOLUTE вызывает подпрограмму на языке ассемблера. Синтаксис: CALL ABSOLUTE адрес(список параметров) Комментарии: "Адрес" - это начальный адрес вызываемой подпрограммы в памяти, задаваемый числом, как смещение относительно текущего сегмента. Сегмент определяется последним выполненным оператором DEF SEG. Адрес может быть в диапазоне от -32768 до 65535. Отрицательные значения будут преобразованы компилятором в положительные. Форма "списка параметров" совместима с интерпретирующим Basic по засылке параметров типа коротких целых в стек. Эта форма позволяет передавать только целые. величины. (Смотри приложение С "Связь с языком ассемблера"). Содержимое буфера регистров загружается в регистры процессора перед вызовом CALL ABSOLUTE или CALL INTERRUPT и опять сохраняется после возврата из подпрограммы. В любой данный момент времени буфер содержит состояние процессора, имевшее место при завершении работы последней внешней подпрограммы. Доступ к буферу регистров осуществляется с помощью оператора REG и функции REG, которые используют исловой аргумент для ссылки на соответствующий регистр, как показано в следующей таблице: ------------------------------------------ Регистровый аргумент Регистр ------------------------------------------ 0 Флаги 1 АX 2 BX 3 CX 4 DX 5 SI 6 DI 7 BP 8 DS 9 ES ------------------------------------------ Оператор REG загружает в выбранный элемент буфера регистров указанное целое число: REG 2,&H1000 'загрузить 1000Н в ВХ в буфере регистров Функция REG возвращает значение выбранного элемента из буфера регистров: PRINT REG(2) 'печатает значение в ВХ из буфера регистров Программист отвечает за сохранение регистров: сегмента данных (DS), указателя базы (BP), сегмента стека (SS) и указателя стека (SP). Смотри также: CALL INTERRUPT DEF SEG REG Пример: DEINT a-z DIM a(100) DIM FillRoutine(10) FillRoutine(0) = &HF2FC FillRoutine(1) = &HCBAA REG 1, -1 REG 3, 101 * 2 REG 9,VARSEG (a(0)) REG 6,VARPTR (a(0)) DEF SEG=VARSEG(FillRoutine(0)) PRINT a(1) WHILE NOT INSTAT:WEND FillAdr=VARPTR(FillRoutine(0)) CALL ABSOLUTE FillAdr'(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 %DX, REG(%DX)AND &HFF02 ' DL = 02(шестн.) DH остается без изменений ' DL:= символ для вывода CALL INTERRUPT &H21 ' вызов прерывания 21 Функция CDBL Функция: CDBL преобразовывает число в формат с двойной точностью. Синтаксис: y = CDBL (числовое выражение) Комментарии: CDBL преобразовывает числовую переменную или выражение в формат с двойной точностью. Использование CDBL исключает возможность целочисленного переполнения в выражениях, содержащих целые операнды и операнды с плавающей запятой. Например, y# = (z% + x%)/a# Если (z% + x%) больше чем 32767, то возникает переполнение. Чтобы избежать такой возможности, используйте CDBL для перевода одной целочисленной переменной в формат с двойной точностью. В результате осуществляется перевод всего выражения в формат с двойной точностью: y# = (CDBL(z%) + x%)/a# Ограничения: Диапазон значений выражения, передаваемого функции CDBL, должен соответствовать диапазону для чисел с двойной точностью. Смотри также: CINT CLNG CSNG Пример: ' CDBL используется для предотвращения ошибок периода ' выполнения x% = 2000 'объявляет целую перменную y% = 2000 'назначает Y% значение X% z# = CDBL(x%) * y% 'предотвращает переполнение 'за счет преобразования X% PRINT X%, Y%, Z# 'выводит на дисплей значения трех 'переменных END Функция CEIL. Функция: CEIL преобразует числовую переменную или выражение в целое, возвращая наименьшее целое, большее, чем аргумент, или равное ему. Синтаксис: y = CEIL(числовое выражение) Функция CEIL преобразует числовую переменную или выражение в целое число, возвращая наименьшее целое, большее, чем аргумент, или равное ему. Различия: Эта функция не поддерживается в интерпретирующем BASIC. Смотри также: CINT FIX INT Пример: FOR I! = -2.5 to 2.5 STEP 0.5 ' вывести целые значения ряда чисел PRINT USING "The ceiling of ### is ###.";I!,CEIL(I!). NEXT I! END ' конец программы Оператор CHAIN Функция: CHAIN включает связанный модуль Turbo Basic (созданный как файл типа .TBC или .EXE). Синтаксис: CHAIN имя_файла Комментарии: "имя_файла" - символьное выражение, удовлетворяющее стандартным соглашениям DOS по присвоению имен, и задающее имя связанного модуля Turbo Basic (a расширением .ТВС). Если расширение пропущено, то предполагается .ТВС. Следовательно, если вы хотите определить файл с расширением .ЕХЕ, к имени файла надо обяазательно добавить .ЕХЕ. Переменные, перечисленные в операторе COMMON как в текущей, так и в целевой программе, передаются целевой программе. На стадии отладки вызывающая программа должна быть скомпилирована как файл .ЕХЕ, так как нельзя выполнить связывание программ в Turbo Basic. Вызванная программа должна быть скомпилирована на диск как связанный модуль (файлы типа .ЕХЕ или .ТВС) Если аргументы в операторах COMMON, в вызывающей и в вызываемой программах не совпадают (например, на одних и тех же местах стоят переменные с плавающей запятой в одной программе и целые - в другом), то возникает ошибка периода выполнения. Turbo Basic не поддерживает возможности оператора CHAIN интерпретирующего Basic, ориентированные на номер строки, включая такие, как DELETE, MERGR и CHAIN номер_строки). Поскольку нельзя задать номер строки в целевом связанном модуле, его выполнение всегда начинается с первой строки. При преобразованиии связанных систем программ из интерпретирующего Basic в Turbo Basic нет необходимости связывать программы; благодаря расширенному использованию памяти в Turbo Basic обеспечивается объединение отдельных модулей в одну программу. Ограничения: Связывание может быть осуществлено, только если программа выполняется в DOS, т.е. из файла типа .ЕХЕ. MERGE, DELETE, ALL и CHAIN с указанием номера строки не поддерживаются. Различия: В Turbo Basic связывание выполняется от одной скомпилированной программы к другой, скомпилированой в файле типа .EXE или .TBC. Смотри также: COMMON Пример: Рассмотрим PROG1, связанную с PROG2. PROG1.BAS ' объявляет переменные, передаваемые ' связанной программе; ' a и b - переменные обычной точности ' и целый массив с% DIM c%(3000) a = 65: b = 13: c%(2000) = 12 COMMON a, b, c%(1) ' задает # размерность массива CHAIN "PROG2" PROG2.BAS ' объявляет переменные, передаваемые ' из вызывающей программы ' они должны быть того же типа ' того же порядка, но не обязательно с тем же именем COMMON x, y, z%(1) PRINT x, y, z%(2000) Когда файл PROG1.EXE вызывается из DOS, он автоматически переносится в модуль PROG2.TBC и выполняет его, печатая значения, присвоенное в PROG1. Когда PROG2 заканчивается, управление перадается в DOS, а не в PROG1. Оператор CHDIR Функция: CHDIR меняет текущий справочник (аналогично команде CHDIR или CD в DOS). Синтаксис: CHDIR путь Комментарии: "Путь" - это символьное выражение, удовлетворяющее соглашениям DOS для имен пути (описанным в главе 4 в разделе "Файлы"). Если путь не указывает на допустимый справочник, то фикскруется ошибка периода выполнения 76 "Path Not Found" (Путь не найден). Оператор CHDIR изменяет текущий (активный, или по умолчанию) справочник. Он аналогичен команде DOS CHDIR, за исключением того, что он не может быть использовано сокращение CD. Запуская из Turbo Basic программу, которая изменяет текущий справочник, тем самым вы измените и текущий справочник Turbo Basic. Пример: INPUT "New directory:".Path$ CHDIR Path$ 'делает текущим справочник, 'определенный пользователем END Функция CHR$ Функция: CHR$ преобразовывает код ASCII в эквивалентный ему символ. Синтаксис: s$ = CHR$(целое выражение) Комментарии: CHR$ возвращает односимвольную строку, единственный символ которой имеет код ASCII "целого выражения" со значением от 0 до 255. CHR$ дополняет функцию ASC, которая возвращает код ASCII первого символа строки. Функция CHR$ обычно используется, чтобы создать специальный символ, который трудно ввести с клавиатуры, например, символы графики для вывода на экран и управляющие последовательности для принтера. Значение целого выражения, передаваемого CHR$, должно быть в пределах от 0 до 255. При использовании аргумента вне диапазона от 0 до 255, возникает ошибка периода выполнения 5 - "Illegal Function Call" (Неправильный вызов функции). Смотри также: ASC Пример: ' CHR$ выводит на экран набор символов ASCII FOR I% = 0 TO 255 PRINT USING "!";CHR$(I%); ' выводит символ ASCII представленный переменной I% NEXT I% END Функция CINT Функция: CINT округляет аргумент до целого числа. Синтаксис: y = CINT(числовое выражение) Комментарии: Функция CINT преобразует числовую переменную или выражение в целое число, округляя дробную часть "числового выражения". Если "числовое выражение" выходит за пределы диапазона от -32768 до 32767, фиксируется ошибка "Overflow" (Переполнение) (ошибка периода выполнения 6). Такое преобразование выполняется неявно при присваивании значения целой переменной или при вызове процедуры или функции, которая получает целый аргумент. Различия: В отличии от интерпретирующего Basic Turbo Basic не всегда округляет дробную часть до большего целого числа. Если дробная часть числа равна 0.5, округление осуществляется до четного числа. Смотри также: CDBL CEIL CLNG CSNG FIX INT Пример: FOR I! = 0.0 TO 5.0 STEP 0.2 ' выведем преобразованный результат PRINT USING "CINT of #.# = #";I!,CINT(I!) NEXT I! END 'конец программы Оператор CIRCLE Функция: CIRCLE вычерчивает на экране окружности или части окружностей. Синтаксис: CIRCLE (x,y),радиус[,цвет[,начало,конец[,вид]]] Комментарии: Параметры "x" и "y" - это координаты x и y центра окружности. Координаты центра могут быть заданы либо в абсолютных, либо в относительных (с использованием STEP) координатах. (Более подробная информация об абсолютных и относительных координатах приведена в разделе главы 3, посвященной графике). Параметр "радиус" - это числовое выражение, задающее размер окружности. Параметр "цвет" - целое выражение, задающее цвет окружности. Его допустимые значения от 0 до 3 в графическом режиме со средней разрешающей способностью (по умолчанию 3) и от 0 до 1 в графическом режиме с высокой разрешающей способностью (по умолчанию 1). Цвет по умолчанию - наивысший возможный цвет для режима, в котором вы работаете. Использование аргумента "цвет" вне указанного диапазона вызывает ошибку 5 периода выполнения "Illegal Function Call" (Неправильный вызов функции). (За дополнительной информацией по использованию цветов в различных экранных режимах обращайтесь к описанию функций COLOR.) Параметры угла "начало" и "конец" являются необязательными и задают начальную и конечную точки вычерчиваемой дуги в радианах. (Смотрите описание радиан в ATN). Используйте их, если хотите нарисовать только часть окружности. Если "начало" и "конец" опущены, будет нарисована окружность. Например: SCREEN 1 : pi = 4 * ATN(1) CIRCLE (160,100), 50, 3, 0, pi рисует полуокружность белого цвета от 0 радиан (0 градусов) до pi радиан (180 градусов). Если "начало" и "конец" отрицательны, то будет нарисована фигура типа сектора; т.е. концы дуги автоматически соединяются с точкой центра. Например, SCREEN 1 : pi = 4 * ATN(1) CIRCLE (160,100), 50,, - pi/4, -pi/2 рисует 45-градусный сектор от pi/4 радиан (45 градусов) до pi/2 радиан (90 градусов). Для того, чтобы начать чертеж сектора на положительной оси х, используйте в качестве параметра "начало" не - 0, а отрицательное число, немного меньшее, чем 0 (например,.0001). Параметр "вид" является числовым выражением и задает соотношение радиусов x и y (x:y), т.е. "овальность" окружности. По умолчанию значение параметра "вид", равно 5/6 (0.833333) в режиме среднего разрешения и 5/12 (0.416667) в режиме высокого разрешения. В зависимости от имеющейся в наличии комбинации монитора и контроллера дисплея, может потребоваться изменить эти величины (или подстраить монитор) для получения правильных окружностей. LPR после вывода на дисплей окружности находится в ее центре. Пример: ' эта программа показывает возможности CIRCLE, ' изменeние расположения, радиуса, цвета и вида. ' CIRCLE может также рисовать дуги и сектора, ' полезные при играх человека на компьютере. PI#=4 * ATN(1) 'вычисляет значение pi SCREEN 1 'переход в графический режим FOR Radius%=1 TO 20 'увеличивает размер окружности Colour%=Radius% MOD 4 ' определяет цвет дисплея CIRCLE(250,150), Radius%, Colour% 'центр в точке 250,150 NEXT Radius% CIRCLE(220,60), 50,1,-(PI#*5/4), -(PI#*3/4) 'тело человечка CIRCLE STEP (-5,-25), 5,1 'и глаз Radius%=50 ' эллипсы могут создавать иллюзию сфер... FOR Aspect=0 TO 2.0 STEP 0.09 CIRCLE(90,100),Radius%....Aspect NEXT Aspect END Оператор CLEAR Функция: CLEAR очищает область памяти переменных. Синтаксис: CLEAR Комментарии: CLEAR - команда без параметров, которая задает все числовые переменные равными 0, все символьные переменные равными символу "NULL" (пустая строка). CLEAR запрещает все прерывания по событиям (такие, как звучащая музыка) и инициализирует память массивов и строк. Примечание: Оператор CLEAR в цикле будет очищать счетчик, что делает цикл бесконечным. Используйте команду ERASE для частичной очистки массивов в памяти. Ограничения: Turbo Basic не поддерживает динамическую установку стека и сегментов данных; поэтому в этом операторе нет параметров. Различия: Отличие оператора CLEAR интерпретирующего Basic от Turbo Basic заключается непосредственно в различии между компилятором и интерпретатором. Интерпретирующий Basic позволяет динамически устанавливать стек и пространство данных, а в Turbo Basic стек и пространство данных устанавливается во время компиляции. Смотри также: ERASE $STACK Пример: ' Программа демонстрирует, что может CLEAR DIM Array$(1) 'объявляет массив строк PLAY "MB L1 EFGABCDEF" 'играет музыка в 'фоновом режиме ON PEN GOSUB PenHandler 'устанавливает обработку 'прерываний от светового пера ON STRIG((0) GOSUB ButtonOHandler 'устананавливает 'обработку прерываний от джойстика ' инициализация символьных данных Array$(0) = "This is a string in Array$(0)" Array$(1) = "This is a string in Array$(1)" ' выводит на экран символьные данные PRINT USING "Array element 1: &";Array$(0) PRINT USING "Array element 2; &";Array$(1) PRINT INPUT "Press to execute CLEAR statement";Dummy& CLEAR 'выполняется CLEAR PRINT ' выводит на экран больше не существующие символьные ' данные PRINT USING "Array element 1: &";Array$(0) PRINT USING "Array element 2: &";Array&(0) PRINT PRINT "The string variable are now empty." END 'конец программы PenHandler: 'фиктивная подпрограмма обработки 'прерывания от светового пера RETURN ButtonOHandler: 'фиктивная подпрограмма обработки 'прерывания от джойстика RETURN Функция CLNG Функция: CLNG преобразует число в длинное целое. Синтаксис: y = CLNG(числовое выражение) Комментарии: CLNG преобразует числовую переменную или выражение в длинное целое, округлением дробной части аргумента. Если значения числового выражения находятся вне диапазона от -2^31 до 2^31 (приблизительно от -2 миллиардов до 2 миллиардов), имеет место ошибка 6 "Overflow" (Переполнение). Ограничения: Числовое значение выражения, передаваемое функции CLNG, должно быть в допустимых для длинных целых пределах. Различия: Функция CLNG не доступна для большинства интерпретаторов Basic, так как они не поддерживают длинные целые. Смотри также: 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, "THIS Is A TEST" 'посылкя строки на символ CLOSE# 1 'закрывает файл OPEN "CLOSEFIL.ONE" FOR OUTPUT AS #1 'открывает два 'различных файла OPEN "CLOSEFIL.TWO" FOR OUTPUT AS #2 PRINT# 1,"THIS IS A TEST" 'записывает строку в каждый файл PRINT# 2,"THIS IS A TEST" CLOSE 'закрывает открытые файлы END Оператор CLS Функция: CLR очищает экран. Синтаксис: CLS Комментарии: Если экран находится в текстовом режиме, то активная страница очищается и ее цвет будет соответствовать цвету фона. Курсор перемещается в левый верхний угол (строка 1, столбец 1). Если экран находится в графическом режиме, то весь экранный буфер очищается и принимает цвет фона. LPR становится центром экрана с координатами (160,100) или (320,100) в зависимости от того, среднюю или высокую разрещающую способность имеет текущий режим. Если был выполнен оператор VIEW, CLR очищает только окно. Чтобы очистить весь дисплей, сначала надо испольнить оператор VIEW без аргументов для выключения окна и потом с помощью оператора CLS очистить экран. Смотри также: COLOR SCREEN VIEW Пример: ' CLS очищает экран до цвета фона PRINT "This is a test of the CLS statement" INPUT "Press to clear the screen...",Dummy$ 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 периода выполнения "Illegal Function Call" (Неправильный вызов фунции). SCREEN1 Цвет фона 0 - 255: Действительный используемый цвет фона - цвет фона MOD 16. Следовательно, задание цвета фона 1 и 16 приводит к одному и тому же результату. Палитра 0 -255. Выбирайте заданную палитру, как показано в следующей таблице: ----------------------------------------------- Цвет Палитра 0 Палитра 1 ----------------------------------------------- 1 зеленый циановый 2 красный малиновый 3 коричневый белый ----------------------------------------------- По умолчанию четные номера выбирают палитру 0, а нечетные номера выбирают палитру 1. Палитра 0 дает вашей программе возможности создавать фигуры в зеленом, красном и коричневом цветах. Палитра 1 предлагает цвета циановый (зелено-голубой), малиновый (пурпурно-красный) и белый. SCREEN 7 и 8 Только для адаптера EGA. Цвета зависят от текущей палитры. Цвет символов 1-15: Выбранный цвет используется как для вывода символов, так и графических рисунков. Цвет фона 0-15: Выбирает цвет фона. SCREEN9 Цвет символов 1-15: Выбранный цвет используется как для вывода символов, так и графических рисунков. Если EGA имеет 64К памяти, то вы можете использовать только значения в диапазоне от 1 до 3. Цвет фона 0-63: Выбирает цвет фона. SCREEN10 Цвет символов 1-3: Выбранный цвет используется как для вывода символов, так и графических рисунков; 1 - черный, 2 - мерцающий, 3 - высокая интенсивность. Цвет символов 0 вызывает возникновение ошибки "Illegal Function Call" (Неправильный вызов функции). Используйте оператор PALETTE для изменения значений параметров по умолчанию. Цвет фона 0-8: Выбранный цвет используется для цвета фона. Примечание: Значение цвета 0 для любой палитры соответствует цвету фона, заданному в этом операторе, а цветом символов по умолчанию является максимальное значение параметра. Ограничения: В режиме SCREEN 2 оператор COLOR возвращает ошибку 5 периода выполнения "Illegal Function Call" (Неправильный вызов функции). Пример: ' эта программа демонстрирует оператор COLOR ' в графическом режиме ' переключает в графический режим среднего разрешения ' и устанавливает палитру 0. SCREEN 1 COLOR ,0 FOR Radius% = 1 To 20 'увеличивает размер окружности COLOR% = Radius% MOD 4 'определяет цвет вывода CIRCLE(160,100), Radius%, Color% 'выводит окружность NEXT Radius 'с центром в точке 250, 150 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; он определяет цвет фона. Параметр "рамкa" является выражением целого типа со значением в диапазоне от 0 до 15, задающим цвет рамки вокруг экрана. Если любой из этих параметров находится вне указанного диапазона, возникает ошибка 5 периода выполнения "Illegal Function Call" (Неправильный вызов функции). Для стандартных контроллеров цветных графических дисплеев ваш выбор цвета символов включает следующее: 0 черный 8 серый 1 голубой 9 светло-голубой 2 зеленый 10 светло-зеленый 3 циановый 11 светло-циановый 4 красный 12 розовый 5 малиновый 13 светло-малиновый 6 коричневый 14 желтый 7 белый 15 белый высокой интенсивности Символы могут быть сделаны мерцающими установкой желаемого цвета символов плюс 16. Например, если задан цвет символов, установленный 22 (6 + 16), то получаться мерцающие символы коричнего цвета. Адаптеры, монохромных дисплеев не могут выводить цветные изображения, для них значения цвета символов интерпретируются следующим образом: 0 черный 1 подчеркивание 2-7 белый 8 черный 9 подчеркивание высокой интенсивности 10-15 высокая интенсивность 16 белый 17 подчеркнутый черный 18-23 мерцающий 24 черный 25 высокая интенсивность, подчеркивание, мерцание 26-31 высокая интенсивность, мерцание Значения цвета фона от 0 до 6 создают черный цвет фона. Значение 7 создает белый цвет фона. Примечание: Для любого адаптера символы становятся невидимыми, если цвет фона равен цвету символов. Расширенные графические адаптеры (EGA) и графический матричный видеоадаптер (VGA) с расширенными мониторами могут выводить на дисплей 16 цветов из палитры включающей 64 цвета (смотри PALETTE). Ограничения: Параметр "рамка" не действует для EGA и VGA с расширенным монитором. Пример: ' программа демонстрирует оператор COLOR ' в текстовом и графическом режимах ' выводит на дисплей таблицу аргументов FOR Back%=0 TO 7 FOR Fore%=0 TO 15 COLOR Fore%, Back% PRINT USING "###";Back%*16+Fore%; NEXT Fore% PRINT NEXT Back% PRINT FOR Back%=0 TO 7 ' display a table of all the attributes FOR Fore%=16 TO 31 'with blinking COLOR Fore%,Back% 'set display color PRINT USING "###";Back%*16+Fore%-16; NEXT Fore% PRINT NEXT Back% END Оператор COM(n). Функция: COM(n) управляет прерываниями от последовательного интерфейса. Синтаксис: COM(n) {ON|OFF|STOP} Комментарии: n - номер адаптера связи, прерывания от которого обрабатываются, (1 или 2). Оператор COM(n) ON разрешает обработку прерываний посредством подпрограммы, заданной в предыдущем операторе ON COM(n). После выполнения оператора COM(n) ON, Turbo Basic проверяет после выполнения каждого оператора не поступили ли какие-либо символы на заданный последовательный интерфейс. Если он находит, что такое событие произошло, то вызывается подпрограмма, заданная оператором ON COM(n). Если выполняется оператор COM(n) OFF, то работа последовательного интерфейса n игнорируется. После оператора COM(n) STOP обработка прерываний с линии связи приостанавливается; однако, имевшие после этого место события запоминаются так, чтобы, после выполнения оператора COM(n) ON, немедленно возникло прерывание. Используйте метаоператор $COM для увеличения или уменьшения размера буфера COM. Смотри также: ON COM(n) Пример: ' Демонстрация оператора COM(n) ' Замечание: эта программа не будет ничего ' выводить, если через интерфейс COM1 не поступает ' входная информация ' Задание подпрограммы для обработки последовательного ввода ON COM(1) GOSUB GetComInput ' размещение массива 5K для хранения входных данных DIM ComPortInput(5 * 1024) ' задание указателя на следующую доступную область буфера HeadPtr% = 0 ' и следующую область для печати TailPtr% = 0 ' разрешение обработки прерываний COM(1) ON ' установка входного буфера размера 1K $COM1 1024 ' открыть переменную файла COM1 OPEN "COM1" AS #1 PRINT "Press any key to terminate the programm..." ' пока клавиша не нажата WHILE NOT INSTAT ' если буфер не пуст IF TailPtr% <> HeadPtr% THEN ' вывести данные PRINT "COM PORT input:"; ComPortInput(TailPtr%) ' переход к следующей позиции в буфере TailPtr% = TailPtr + 1 END IF LOCATE 2,1 PRINT TIME$ WEND END ' конец программы ' обработка прерывания от последовательного интерфейса GetComInput: ' чтение данных из буфера INPUT# 1,ComPortInput(HeadPtr%) ' переход к следующей свободной позиции буфера HeadPtr% = HeadPtr + 1 RETURN EndOfInput: ' конец ввода с последовательного ' интерфейса PRINT "Reached the end of input..." END 'конец программы Функция COMMAND$. Функция: COMMAND$ возвращает командную строку, используемую для запуска программы из DOS. Синтаксис: s$ = COMMAND$ Комментарии: COMMAND$ возвращает все, что было напечатано в ответ на запрос DOS в процессе вызова программы, за исключением имени самой программы (в некоторых руководствах эти данные называются "trailer" (сопроводитель)). Используйте COMMAND$ для получения аргументов периода выполнения таких, как имена файлов и параметры программы. Например, рассмотрим команду DOS: FASTSORT cust.dta cust.new где FASTSORT - выполняемая программа Turbo Basic, имеющая тип .EXE. Когда FASTSORT получает управление, COMMAND$ будет содержать все, что было напечатано в ответ на запрос DOS после имени программы, в данном случае - строку "cust.dta cust.new". Решение, что дальше делать с этой строкой, зависит от самой программы FASTSORT (может быть это будет разделение информации в COMMAND$ на имя_файла1 и имя_файла2 и сортировка содержимого файла имя_файла1 в новый файл имя_файла2). Для тестирования программы, которая использует COMMAND$, из Turbo Basic, используйте команду "Parameter line" (строка параметров) в меню Options для задания строки, которую возвращает COMMAND$. Ограничения: Максимальная длина командной строки DOS - 127 символов. Пример: ' Эта программа демонстрирует функцию COMMAND$ PRINT"The command line parameters passed to this program are" PRINT COMMAND$ Скомпилируйте эту программу в памяти и запустите ее дважды, каждый раз изменяя вводимые параметры в меню Options. Оператор COMMON. Функция: COMMON объявляет одну или более переменных передаваемые в связанные программы. Синтаксис: COMMON переменная ,[переменная]... Комментарии: Аргумент "переменная" обозначает массив или скалярную переменную, которые должны быть сделаны доступными для связанной программы. Массивы описываются включением числа размерностей в круглых скобках после имени массива. Операторы COMMON можно вставлять в любое место программы и их может быть несколько, но конкретная переменная может встречаться в этих операторах только один раз. Соответствующие операторы COMMON должны присутствовать и в связываемой программе. Имена переменных, используемых в операторах COMMON в главной и связанных программах, не имеют значения, а их количество и тип должны совпадать. Если переменные, объявленные общими в главной программе, не соответствуют типу и количеству переменных, объявленных общими в связанной программе, то фиксируется ошибка периода выполнения. Различия: Turbo Basic не поддерживает параметр CHAIN ALL, который предусмотрен в интерпретирующем BASIC. Вы должны явно определить каждую переменную, которая будет общей для связанных программ. При определении общего массива в Turbo Basic вы должны задать число размерностей массива. Интерпретирующий BASIC не требует соответствия операторов COMMON, потому что оператор COMMON нужен только в той программе, из которой идет "связывание"; в тех программах, которые "связываются", операторы COMMON не нужны. С другой стороны, Turbo Basic требует, чтобы переменные в каждом операторе COMMON были единообразно упорядочены. Другими словами, имена переменных в главной и связанной программах могут быть различными, но типы переменных должны совпадать. Следующий оператор COMMON корректен: 'главная программа COMMON I%, Array(1), J# ' связанная программа COMMON Int%, RealArray(1), DblPre# Ограничения: Turbo Basic не поддерживает переопределение оператора COMMON, обеспечиваемое в интерпретирующем BASIC с помощью оператора CHAIN ALL. Пример: ' Эти программы демонстрируют оператор COMMON ' Для того, чтобы выполнить эту программу, ' сделайте следующее: ' (1) скомпилируйте первую программу в файл типа .EXE ' (2) скомпилируйте вторую программу в файл типа .TBC ' (3) вызовите первую программу из DOS 'Програма MASTER. Скомпилируйте эту программу в файл типа.EXE DIM OldArray$(1) 'задание массива из двух строк OldArray$(0) = "This is the first string in the array" OldArray$(1) = "This is the second string in the array" OldInteger% = 12345 OldLongInt& = 123450000 OldSinglePre! = 12345.12345 OldDoublePre# = 1.0E+300 ' Задание переменных, общих для программ Master и Slave COMMON OldArray$(1), OldInteger%, OldLongInt&,_ OldSinglePre!, OldDoublePre# CHAIN "SLAVE.TBC" ' связывание с программой Slave END ' конец программы 'Программа SLAVE. Скомпилируйте эту программу в файл типа.TBC COMMON NewArray$(1), NewInteger%, NewLongInt&,_ NewSinglePre!, NewDoublePre# PRINT NewArray$(0) PRINT NewArray$(1) PRINT NewInteger%, NewLong&, NewSinglePre!,_ NewDoublePre# Функция COS. Функция: COS возвращает значение тригонометрической функции косинус. Синтаксис: y = COS(числовое выражение) Комментарии: "Числовое выражение" задает угол, выраженный в радианах. Для преобразования радиан в градусы умножьте на 180/pi. Для преобразования градусов в радианы умножьте на pi/180. (См. обсуждение радианной меры угла в описании функции ATN). COS возвращает значение двойной точности. Смотри также: ATN SIN TAN Пример: ' Эта программа демонстрирует функцию COS PI# = ATAN(1) * 4 FOR I% = 0 TO 360 STEP 45 PRINT USING "The Cosine of ### dergees = ##.##";_ I%,COS(PI#/180 * I%) NEXT I% END Функция CSNG Функция: CSNG преобразует числовое выражение в его эквивалент обычной точности. Синтаксис: y = CSNG(числовое выражение) Комментарии: CSNG преобразует числовую переменную или выражение в формат с плавающей запятой обычной точности. CSNG обычно используется для предотвращения промежуточного переполнения при работе с целыми операндами. Смотри также: CDBL CINT CLNG Пример: PRINT CSNG(&HFFF), CSNG(13241.1324), CSNG(&HF000) Функция CSRLIN Функция: CSRLIN возвращает число, соответствующее номеру текущей строки, на которой находится курсор. Синтаксис: y = CSRLIN Комментарии: CSRLIN возвращает целое значение от 1 до 25, представляющее текущую вертикальную координату курсора (номер строки). Используйте функцию POS для считывания горизонтальной позиции курсора (номер столбца). Оператор LOCATE передвигает курсор на заданную строку и столбец. Смотри также: LOCATE POS Пример: Col = POS 'запоминает строку курсора Row = CSRLIN 'запоминает столбец курсора CLS LOCATE Row, Col 'восстанавливает позицию курсора 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-х байтовую строку в длинное целое. CVL преобразует 4-х байтовую строку в число с плавающей запятой обычной точности. CVD преобразует 8-и байтовую строку в число с плавающей запятой двойной точности. Из-за особенностей работы Turbo Basic с файлами с произвольным доступом, числовые значения должны быть преобразованы в символьный формат перед записью на диск и преобразованы обратно в числа после считывания файла. Не путайте перечисленные функции (которые предназначены для работы с файлами с произвольным доступом) с функцией VAL, которая строку, типа "3.7" преобразовывает в число. Смотри также: MKD$ MKI$ MKL$ MKS$ Пример: ' Программа создает файл с произвольным доступом ' и записывает данные в него. Затем данные считываются ' обратно, с преобразованием их в формат, используемый ' предыдущими функциями ' открывает файл с произвольным доступом OPEN "R", #1, "CVISLD.DTA", 18 FIELD #1,2 AS Integer$, 4 AS LongInt$,_ 4 AS SinglePre$, 8 AS DoublePre$ MaxInt% = 32767 ' записываем данные в файл, преобразуем их и ' занесем в буфер перед записью в файл данных. FOR I% = 1 TO 5 LSET Integer$ = MKI$(I%) LSET LongInt$ = MKL$(I% + CLNG(MaxInt%)) LSET SinglePre$ = MKS$(CSNG(I% * CSNG(MaxInt%))) LSET DoublePre$ = MKD$(MaxInt% I%) PUT #1,I% NEXT I% FOR I% = 1 TO 5 ' считывание данных из файла GET #1, I% "вывод на дисплей PRINT CVI (Integer$), CVL(LongInt$),_ CVS(SinglePre$), CVD(DoublePre$) NEXT I% CLOSE #1 'закрывает файл END Функции CVMD, CVMS. Функция: CVMD и CVMS преобразуют символьные переменные, считанные из файла с произвольным доступом, записанного в формате Microsoft, в числовой формат. Синтаксис: y! = CVMD(4-байтная символьная строка) y# = CVMS(8-байтная символьная строка) Комментарии: CVMS (ConVert Microsoft Single-precision string) (преобразование строки обычной точности в формате Microsoft) преобразует строку из 4 байтов, представляющую собой значение обычной точности в формате Microsoft, в значение с обычной точностью в формате IEEE, принятом в Turbo Basic. CVMD (ConVert Microsoft Double-precision string) (преобразование строки двойной точности в формате Microsoft) преобразует символьную строку из 8 байтов, представляющую собой значение двойной точности в формате Microsoft, в значение двойной точности в формате IEEE, принятом в Turbo Basic. Эти функции включены исключительно для обеспечения совместимости с существующими файлами с произвольным доступом интерпретирующего BASIC. Пример: ' открыть файл с произвольным доступом OPEN "CVMD.DTA" AS #1 LEN = 12 FIELD #1, 4 AS Single$, 8 AS Double$ FOR I = 1 TO 5 ' записать некоторые данные в файл ' преобразовать данные и присвоить файлу данных LSET Single$ = MKMS$(I) LSET Double$ = MKMD$(I^I) PUT #1,I NEXT I FOR I = 1 TO 5 ' читать данные из файла GET #1,I ' вывести данные на экран PRINT CVMS(Single$), CVMD(Double$) NEXT I% PRINT CVS(x$), CVMS(x$) CLOSE #1 ' закрыть файл END Оператор DATA Функция: DATA объявляет константы для операторов READ. Синтаксис: DATA константа[,константа]... Комментарии: "Константы" - это символьные или числовые константы в любом формате (с плавающей запятой или целые), разделенные запятыми. Константы могут быть как десятичными, так и шестнадцатеричными или восьмеричными. Символьные константы в операторах DATA должны быть ограничены двойными кавычками, только если они содержат разделители (запятые, двоеточия) или значащие пробелы в начале или в конце строки; они могут идти вперемешку с числовыми константами. Например: DATA Taco,.79, Chicken Supreme,2.29,"Dr.Pepper,large",.89 Оператор DATA может содержать столько констант, сколько уместиться на строке (разделенных запятыми), и в программе может использоваться любое количество операторов DATA, не обязательно следующих подряд друг за другом. Операторы READ в процессе выполнения программы считывают константы слева направо и сверху вниз в порядке, в котором они располагаются в исходной программе. Наиболее обшая ошибка, связанная с операторами DATA и READ - это их рассинхронизация и попытка загрузить символьные данные в числовую переменную; в результате возникает ошибка (ошибка 2 периода выполнения программы). К сожалению, при загрузке числовых констант в символьные переменные сообщение об ошибке не выводится, даже если вы сделали не то, что хотели. Константы в операторах DATA можно начать повторно считывать с самого начала, или с любого заданного DATA с помощью оператора RESTORE. Если оператор READ используется большее количество раз, чем имеется констант в программе, возникает ошибка 4 периода выполнения программы "Out of Data" (Нет данных). Ограничения: Нельзя использовать символ подчеркивания для продолжения строки в операторе DATA. Не используйте одиночную кавычку (') для комментариев в операторе DATA, так как Turbo Basic будет рассматривать последний элемент и ваш комментарий как часть одной длинной символьной константы. Например: DATA cats, dogs, pigs 'список животных интерпретируется как содержимое, содержащий три символьные константы: "cats", "dogs" и "pigs 'список животных."; Для этих целей можно безопасно использовать REM: DATA cats, dogs, pigs : REM список животных Смотри также: READ RESTORE Пример: ' эта программа демонстрирует метод использования ' оператора DATA SUB ProcessResults(StudentName$, StudentAverage%) LOCAL Total%, Value%, I% Total%=0 READ StudentName$ FOR I%=1 TO 10 READ Value% Total%=Total%+Value% NEXT I% StudentAverage%=Total%\10 END SUB FOR Student%=1 TO 3 CALL ProcessResults(SName$, Average%) PRINT USING "&'s average is ###";SName$,Average% NEXT Student% END 'конец программы DATA W. Perry, 78,65,35,79,86,93,79,85,99,96 DATA P. Watson, 98,94,70,88,99,100,75,96,100,95 DATA M. Ciccone, 65,59,75,82,56,79,82,76,69,89 Системная переменная DATE$ Функция: DATE$ задает или исправляет системную дату. Синтаксис: DATE$ = v$ (устанавливает дату в соответствии с информацией в s$) v$ = DATE$ (s$ теперь содержит информацию о дате) Комментарии: Назначением соответствующим образом сформатированного значения строки в DATE$ устанавливается системная дата. Назначение DATE$ символьной переменной делает системную дату доступной для обработки. При вводе v$ = DATE$, переменная DATE$ выдает 10-символьную строку в формате мм-дд-гггг, где мм - месяц, дд - день, гггг - год. При задании даты v$ может быть представлен в любом из следующих форматов: мм-дд-гг мм/дд/гг мм-дд-гггг мм/дд/гггг Например: DATE$ = "10-25-86" устанавливает системную дату - 25 октября 1986г. Ограничения: Год, присваиваемый системной переменной DATE$, должен быть в диапазоне от 1980 до 2099. Смотри также: TIME$ Пример: ' выводит на дисплей текущую системную дату PRINT "The current system date is "DATE$ INPUT "Please enter the new date in the form MM-DD-YY";_ New Date$ DATE$ = NewDate$ PRINT "The system date is now set to " DATE$ END 'конец программы Опертор DECR Функция: DECR уменьшает значение переменной. Синтаксис: DECR переменная [,размер] Комментарии: Аргумент "переменная" обозначает числовую переменную, а "размер" - необязательное числовое выражение, показывающее, какую величину нужно вычесть из "переменной". Если аргумент "размер" опущен, то вычитается 1. Использование DECR - удобный способ уменьшения значения переменной. Используйте оператор INCR для увеличения значения переменной. Смотри также: INCR Пример: I% = 15 ' инициализация переменных J% = 500 WHILE I% > 0 PRINT I%, J% ' вывести значение DECR I% ' уменьшить значение на 1 DECR J%, 5 ' уменьшить значение на 5 WEND END ' конец программы Оператор DEF FN/END DEF Функция: DEF FN/END DEF oпределяет функцию. Синтаксис: Определение одной строкой: DEF FNимя [(список аргументов)] = выражение Определение несколькими строками: DEF FNимя [(список аргументов)] [LOCAL список переменных] [STATIC список переменных] [SHARED список переменных] . . операторы . [EXIT DEF] [FNимя = выражение] END DEF Комментарии: Параметр "имя" должен быть допустимым именем функции, удовлетворяющий соглашениям присвоения имен меткам и переменным (т.е. буква с последующим любым количеством букв и/или цифр). Параметр "список_аргументов" - факультативный список формальных параметров, разделенных запятыми. Параметры, используемые в списке аргументов, служат только для определения функции. Они не имеют никакого отношения к другим переменным в программе с таким же именем. Операторы DEF FN и END DEF ограничивают и задают имя группе операторов, подобных подпрограмме, называемых функцией. Функции может быть передан один или несколько аргументов по значению. Функции возврашают значение (тип которого определяется именем функции, как если бы это была переменная) и могут быть, следовательно, вызваны из любого оператора, который может обрабатывать значения соответствующего типа. Определение функции и ход выполнения программы. Место определения функции в программе несущественно. Функция в программе может быть определена в строке 1 или в строке 1000, независимо от того, в каком месте программы она используется; вам не надо заботиться об управлении последовательностью выполнения операторов в программе с целью обхода определений функций ( хотя это вы должны делать для однострочных фукций в интерпретирующем Basic). Компьютер увидит ваши ваши определения, где бы они не располагались. Кроме того, в отличие от подпрограмм, управление не может быть случайно передано внутрь определения функции. С точки зрения хода выполнения программы, определения функций и процедур являются невидимыми. Например: t = FNPrintStuff DEF FNPrintStuff PRINT "Printed from within FNPrintStuff" END DEF В ходе выполнения этой программы из 4-х строк, сообщение появляется только один раз, так как PrintStuff вызывается в первой строке. Определения функций следует трактовать как изолированные участки программы: в них нельзя войти или выйти с помощью операторов GOTO, GOSUB или RETURN. Однако, в пределах определения функции такие операторы являются допустимыми. Запомните, что определения функций и процедур не могут быть вложенными, т.е. нельзя определять процедуру или функцию в процедуре или функции (хотя определение процедуры или функции может содержать вызовы других процедур или функций). Объявление локальных переменных (только для многострочных функций). Для объявления локальных переменных определении функции, используйте оператор LOCAL, который должен располагаться до исполняемых операторов в определении. Например: LOCAL a%, b#, bigArray%() создает три локальные переменные:a%, b# (целую и двойной точности, соответственно) и целочисленный массив bigArray. Размерность массива должна быть затем задана следующим образом: DIM DYNAMIC bigArray%(1000) Статические и общие переменные. По умолчанию, переменные, появляющиеся в определении функции, являются общими; т.е. они будут глобальными для всей остальной программы. Так как значения по умолчанию можно изменять, то вы должны объявить каждую переменную, используемую в функции. Объявляйте переменные с помощью аргумента STATIC, если для вас важно, чтобы переменная не потеряла свое значение при каждом обращении к программе, и при этом могла бы быть изменена только в функции. Многострочное определение функции обычно включает присваивание значения идентификатору функции и должно заканчиваться END DEF. Если вы решили не присваивать значения идентификатору функции, то значение, возвращаемое функцией будет неопределенным. Используйте оператор EXIT DEF, для выхода из функции не в конце. Смотри также: LOCAL SHARED STATIC Пример: $STACK &H7FFF Total = 1 DEF FNactorial%(I%) ' эта функция вычисляет факториал ' параметра I% Тotal = Total * I% IF I% > 1 THEN Subb% = FNactorial%(I% - 1) END IF FNFactorial% = Total END DEF 'конец функции FNFactorial PRINT "Input the number you wish to calculate the "; INPUT "factorial of: ",J% PRINT FNFactorial%(J%) END 'конец программы Операторы DEFINT, DEFLNG, DEFSNG DEFDBL, DEFSTR Функция: DEFINT, DEFLNG, DEFSNG, DEFDBL, и DEFSTR объявляет тип идентификаторов переменных по умолчанию. Синтаксис: DEFтип диапазон_букв [,диапазон_букв]... Комментарии: Параметр "тип" может принимать значения одного из пяти типов переменных, допустимых в Turbo Basic: INT, LNG, SNG, DBL или STR. Параметр "диапазон_букв" - либо одна буква (от А до Z, на каком регистре - неважно), либо диапазон букв алфавита (две буквы, разделенные чертой; например, А-М). Оператор DEFтип объявляет компилятору, что переменные и функции, определенные пользователем, имена которых начинаются с букв, указанных в операторе, будут относиться к соответствующему типу. это позволяет вам использовать в программе переменные без явного указания типа идентификаторов (например, %, #), которые не будут считаться переменными обычной точности с плавающей запятой. Если в программе не встречается ни одного оператора объявления типа, то в языке Turbo BASIC предполагается, по умолчанию, что все переменные без указателя типа являются числами обычной точностьи с плавающей запятой. Тип числа обычной точностьи является значением типа по умолчанию. Например, в следующем операторе, m и n предполагаются числами обычной точности: n = m + 16 Если, однако этому оператору предшествует DEFINT n, m тогда n и m будут переменными целого типа, как и все другие переменные, имена которых начинаются с букв n или m на нижнем или верхнем регистре. Выполнение оператора DEFтип в Turbo Basic отличается от интерпретирующего Basic. Интерпретатор выполняет распознавание типов в соотствии с тем, где встречается оператор DEFтип в ходе выполнения программы. Turbo Basic, как компилятор, рассматривает положение оператора DEFтип в исходном файле. Например, рассмотрим следующую программу: 10 GOTO 30 20 DEFINT A-M 30 j = 45.3; PRINT j Интерпретирующий Basic никогда не будет рассматривать оператор, вводимый в строке 20. Когда он встречает j в строке 30, j становится переменной обычной точности и печатается как 45.3. Turbo Basic, наоборот, принимает решение о типе переменной во время компиляции безотносительно пути выполнения программы,(о который во время компиляции он не знает ничего). Компилятор заботится только о том, чтобы оператор DEFINT появился физически раньше первого появления переменной j, таким образом он преобразует j в целочисленную переменную и печатает 45. Ограничения: Оператор DEF переопределяет тип любой соответствующей переменной, которая уже использовалась в программе. Пример программы демонстрирует это. Примеры: ' назначает значение числу с обычной точностью I = 35567.999 PRINT "Single Precision number",I ' выводит на дисплей значение ' явно объявляет переменную ' с тем же типом и именем DEFSNG I PRINT "Single Precision number",I ' явно объявляет переменную с тем же именем ' но другого типа DEFINT I ' печатает значение новой переменной PRINT "Integer number:",I ' Все идентификаторы, начинающиеся с букв ' от A до C - переменные с двойной ' точностью до тех пор, пока не встретится ' другой оператор DEF DEFDBL A-C ' Все идентификаторы, начинающиеся с букв ' от J до Z - имеют тип длинное целое ' до тех пор, пока не встретится ' другой оператор DEF DEFLNG J-Z ' назначает значение переменной с двойной точностью А = 32767.1 ' назначает значение длинной целой Z = -1 ' назначает значение ранее определенной ' целой переменной I = &HBFFF PRINT "Three different types: ",A,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 будет определяться смещение. Сегмент - адресная конструкция, используемая в семействе процессоров Intel 86. Aдреса должны задаваться двумя целочисленными значениями: сегментом и смещением в сегменте. DEF SEG без аргументов возвращает значение сегмента к его начальному значению по умолчанию. Первые 256 байтов сегмента по умолчанию содержат информацию, используемую системой поддержки выполнения вашей программы. Интерес представляет адрес со смещением &HF4E в данном сегменте. Значения, занесенные POKE в эту ячейку, изменяют цвет текста, выводимого на экран в любом графическом режиме. Цвет зависит от того, в каком режиме вы находитесь. Другой полезный адрес в сегменте данных по умолчанию - ячейки 0 или 1. Это слово содержит сегмент символьных строк Turbo Basic. Смотри также: COLOR Пример: ' эта программа заполняет экран символами А, ' занося их непосредственно в память дисплея ' Зададим функцию, которая определяет адрес ' памяти дисплея ' Получает тип видеоконтроллера пользователя DEF FN VideoScreen% LOCAL Screen Type% 'объявляет локальную переменную PRINT "Please enter the type of screen you are using" INPUT "[1 for Mono, 2 for Color]:";ScreenType% SELECT CASE ScreenType% 'назначает результат функции CASE 1 'основывается на вводе пользователя ' ячейка в памяти монохромного дисплея FN VideoScreen% = &HB000 CASE 2 ' ячейка в памяти цветного дисплея FN VideoScreen% = 8HB800 END SELECT END DEF 'конец функции ' определяет сегмент для POKE и BSAVE DEF SEG = FN VideoScreen% FOR I% = 0 to 4000 STEP 2 POKE I%,ASC("A") 'заполняет экран символами А NEXT I% END Оператор DELAY Функция: DELAY обеспечивает паузу в выполении программы. Синтаксис: DELAY секунды Комментарии: Аргумент "секунды" - числовое выражение, задающее число секунд, которое должна продолжаться пауза перед выполнением следующего оператора программы. Замечание: DELAY принимает аргумент с плавающей запятой, при этом можно задавать не целую величину задержки с разрешением примерно в 0.054 секунды. Рекомендуется использовать оператор DELAY, а не программные пустые циклы, ничего не выполняющие в программе, которые будут длиться разное время на машинах в различной скоростью процессора (например, в компьютерах на основе процессоров 8088 и 80286 тактовая частота равна 6MГц и 8МГц соответственно). Пример: PRINT "Press any key to terminate the program..." WHILE NOT INSTAT 'пока клавиша не нажата LOCATE 10,30 PRINT TIME$ 'вывести время DELAY 5 'задержка на 5 секунд WEND END 'конец программы Оператор DIM Функция: DIM объявляет массивы. Синтаксис: DIM {STATIC|DYNAMIC}перем.(индексы)[,перем.(индексы)]... DIM {STATIC|DYNAMIC}перем.(мин:мах[,мин:мах]...) [,перем.[,мин:мах]]... Комментарии: "перем." - идентификатор, используемый для обозначения массива. "индексы" - список, состоящий из одного или большего числа выражений целого типа, разделенных запятыми, и определяющих размерность массива. DIM объявляет массив переменных и определяет их размер и число размерностей. В отличие от интерпретирующего Basic, Turbo Basic позволяет определять диапазон значений индексов (мин:мах), а не только верхний предел. Например, DIM b(50:60) создает массив из 11 элементов обычной точности, пронумерованных от 50 до 60. Оператор DIM c(50:60, 25:45) создает двумерный массив из 11 х 25 элементов. Синтаксис задания диапазона может быть расширен для многомерных массивов: DIM births(1800:1899, 1:12) Oператор OPTION BASE, может также быть использован для определения нижнего значения индекса массива, хотя предпочтительнее использовать задание диапазона индексов. Turbo Basic при первом выполнении программы, устанавливает всем элементам числовых массивов нулевые значенияи всем элементам символьных массивов значения пустых строк (с длиной, равной 0). Если программа перезапускается вновь с помощью оператора RUN, значения числовых массивов вновь устанавливаются в ноль, а символьных - в пустые строки. Если массива переменных используется в программе без объявления его в операторе DIM, то максимальное значение индекса предполагается равным 10. Однако, рекомендуется в явном виде задавать размерность каждого массива. Минимальное значение, которое может быть использовано для индекса, равно 0, до тех пор, пока ему не будет присвоено другое значение с помощью команды OPTION BASE. Необязательные аргументы STATIC и DYNAMIC, определяют, соответственно, будет ли пространство под массив заранее выделено компилятором, или будет выделяться динамически. Если эти аргументы опущены, то по умолчанию, массив считается статическим, до тех пор, пока не встретится метаоператор $DYNAMIC, или в операторе DIM будет использовано выражение, или имя массива появится в двух операторах DIM, или массив будет объявлен локальным в процедуре или функции. Ключ проверки границ, доступный в меню Options, заставляет компилятор создавать программу, проверяющую значения индексов массива на допустимость, как только встречается ссылка на массив. Различия: Turbo Basic позволяет программисту определять начальный и конечный индекс массива. Интерпретирующий Basic размещает все массивы динамически, но Turbo Basic будет стараться разместить массивы статически (во время компиляции), что позволяет работать с ними более быстро. Вы можете в явном виде задать другой метод размещения массива. Смотри также: $DYNAMIC FRE $STATIC Примеры: ' DIM объявляет массив ' именованная константа, определяющая ' верхнюю границу массива %MaxDim = 20 ' именованная константа, определяющая ' нижнюю границу массива %MinDim = 1 ' размещает массив из %MaxDim целых элементов DIM Array%(%MinDim to %MaxDim) ' инициализирует массив случайных чисел FOR Count1% = %MinDim to %MaxDim Array%(Count1%) = INT(RND * 10) NEXT Count1% END Оператор DO/LOOP Функция: DO/LOOP является циклом с проверкой условия цикла в начале и/или в конце цикла. Синтаксис: DO [{WHILE|UNTIL}выражение] . . операторы [EXIT LOOP] . [LOOP|WEND] [{WHILE|UNTIL}выражение] Комментарии: Аргумент "выражение" задает числовое выражение, ненулевое значение которого воспринимается как ИСТИНА, а нулевое - как ЛОЖЬ. Зарезервированные слова 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 до тех пор, пока a не станет равным 13. В любой точке цикла DO/LOOP можно включать оператор EXIT/LOOP. Это эквивалентно выполнению оператора GOTO на оператор, следующий за завершающим цикл зарезервированным словом LOOP. (Для получения более полной информации см. оператор 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 По диагонали вниз и вправо Gn По диагонали вниз и влево Hn По диагонали вверх и влево ----------------------------------------------- n - расстояние, на которое необходимо выполнить перемещение. (смотри ниже описание масштабного коэффициента в Sn). Каждая из перечисленных команд перемещения начинает перемещение от LPR и, соответственно изменяет LPR. (LPR - "последняя обслуженная точка", обозначает для последнюю точку дисплея, к которой обращался один из графических операторов. Более подробная информация приведена в разделе, описания графики, в главе 4.) Например: DRAW "D10R5" рисует L-образную фигуру (вниз 10, вправо 5), начиная с LPR. LPR устанавливается на местo последней выведенной на экран точки. Mx,y Перемещение в точку с координатами x и y. Если перед x стоит + или -, то перемещение относительное, т.е. значения x и y прибавляются к координатам текущей графической позиции и полученная точка соединяется с текущей точкой прямой линией. В противном случае, линия соединяет текущую позицию с точкой с координатами x,y. Например: DRAW "D10 R5 M30,50" рисует такую же L-образную фигуру, а от ее конца проводит линию до точки с координатами (30,50). Следующие префиксы могут предшествовать любой из перечисленных выше команд движения: B Переместить, но не рисовать линию. N Переместить и вернуться в исходную позицию. Например: DRAW "BM 180, 20 NU10 ND10 NL10 NR10" выполняется перемещение в точку (180,20) без вывода линии на экран, затем рисуется знак +. Возможно также применение следующих команд: An задает угол n. n может быть от 0 до 3, где 0 соответствует 0 градусов, 1 - 90 градусов, 2 - 180 , 3 - 270 градусов. TAn повернуть на угол n. n может иметь любое значение от -360 до +360 градусов. Если значение, задаваемое n, положительно, то поворот осуществляется против часовой стрелки. Если значение, задаваемое n, отрицательно, то поворот осуществляется по часовой стрелке. Значения, находящиеся вне допустимых пределов, вызывают ошибку 5 период выполнения "Illegal Function Call" (Неправильный вызов функции). Заметим, что ТАn не кумулятивная операция. Cn задает цвет n. Диапазоны значений n в приведены в описании оператора PALETTE для каждого режима дисплея. Цвет по умолчанию - имеющий в данном режиме наибольший допустимый код. Sn задает значение масштабного коэффициента n/4, где n лежит в диапазоне от 1 до 255. Например, если n=8, масштабный коэффициент равен 2. Масштабный коэффициент умножается на расстояние, задаваемое командами U, D, L, R, E, F, G, H и относительной M, чтобы получить реальное расстояние, на которое должно быть осуществлено перемещение. Значение n по умолчанию равно 4, что в результате дает единичный масштабный коэффициент (т.е. отсутствует масштабирование). Соотношение сторон рамки экрана, с которым вы работаете, определяет соотношение между X и Y. Для идеального (несуществующего) дисплея с соотношением сторон рамки экрана 1/1 точка в в направлении оси X имеет тот же размер, что и в направлении оси Y. Однако, дисплеи для компьютеров фирмы IBM имеют следующее соотношение сторон рамки экрана: ------------------------------------------------------------- Монитор/Адаптер SCREEN 1 SCREEN 2 SCREEN 7/8/9 SCREEN 10 ------------------------------------------------------------- Цветной 5/6 5/12 N/A N/A Расширенный 5/6 5/12 8.76/12 N/A Расширенный Моно N/A N/A N/A 9.52/12 ------------------------------------------------------------- X VARPTR$(переменная); выполняет подстроку; т.е. т.е. отрабатывается вторая командная строка в пределах одного оператора DRAW. Команда X в чем-то подобна команде GOSUB, например: DRAW "X" + VARPTR$(X$) P цвет,граница; начинается от текущей координаты (x,y) и заполняет экран цветом, заданным аргументом "цвет", останавливаясь на зонах, заполненных цветом, заданных аргументом "граница". В каждой команде аргументы n, x или y могут быть либо константой (как было показано в примерах до сих пор), либо переменной в виде: =VARPTR$(переменная) Например: DRAW "e15" то же самое, что и a = 15 DRAW "e=" + VARPTR$(a) DRAW игнорирует пробелы в командной строке, вы можете использовать их, если хотите, чтобы ваша программа была лучше читаема. Ограничения: Turbo Basic не распознает имена переменных в символьных строках оператора DRAW. Следовательно, вы должны использовать VARPTR$(n) для доступа к переменным в операторе DRAW во время выполнения программы. Вместо DRAW "U = I%;" используйте DRAW "U =" + VARPTR$(I%) Пример: ' переключает в графический режим со средней ' разрешающей способностью SCREEN 1 House$ = U20 G5 E20 F20 H5 D20 L30" DRAW House$ DRAW "BE3" DRAW "P1,3" FOR I% = 1 TO 280 STEP 40 DRAW "BM= " +VARPTR$(I%) + ".40" DRAW House$ NEXT I% END 'конец программы Оператор END Функция: END завершает выполнение программы или определяет конец структурированного блока. Синтаксис: END[{DEF|IF|SELECT|SUB}] Комментарии: END без аргументов завершает выполнение программы. Операторы END могут располагаться в любом месте программы и их может быть больше одного. Встретившийся оператор END вызывает закрытие всех открытых файлов и возврат в DOS (или в Turbo Basic, в зависимости от того, откуда программа была загружена). Наличие оператора END в конце программы не является обязательным для компилятора, хотя использование его является хорошей практикой. Если программа заканчивает выполнение операторов, но не встречает END, выполняются те же самые действия. END, за которым идут DEF, IF, SUB или SELECT, определяет конец структурированного блока. Смотри также: DEF SELECT STOP SUB Пример: SUB DummyProc PRINT "Hello" END SUB 'конец определения процедуры DEF FN DummyFunc$ FN DummyFunc$="Hello again" END DEF 'конец определения функции INPUT "Execute the procedure or the function (1 or 2)";Which% IF Which%>0 THEN SELECT CASE Which% CASE 1 CALL DummyProc END 'конец программы CASE 2 PRINT FN DummyFunc$ END 'конец программы CASE ELSE PRINT "An illegal choice was made..." END SELECT 'конец оператора case END IF 'конец, блока IFTMEN END 'конец программы Функция ENDMEM Функция: ENDMEM возвращает адрес конца физической памяти. Синтаксис: y = ENDMEM Комментарии: ENDMEM возвращает длинное целое, представляющее адрес последнего байта физической памяти. ENDMEM вместе с оператором MEMSET может быть использован для размещения подпрограмм на ассемблере в верхней части памяти. При выполнении программы в памяти, ENDMEM в действительности возвращает адрес конца физической памяти минус размер таблицы символов. Во время компиляции в памяти Turbo Basic запоминает таблицу символов в старших адресах памяти. Смотри также: MEMSET Пример: ' выводит результат на дисплей PRINT "The end of addressable memory is: ".ENDMEM END 'конец программы Оператор ENVIRON Функция: ENVIRON дает возможность модифицировать информацию в таблице состояния среды. Синтаксис: ENVIRON символьное выражение Комментарии: Параметр "символьное выражение" определяет как имя изменяемого добавляемого или уничтожаемого параметра, так и новую информацию о нем. Эти элементы должны разделяться знаком равенства (=). ENVIRON и соответствующая ей функция ENVIRON$ используются для создания среды, которая должна быть передана программе, выполняемой через оператор SHELL. (Более подробная информация приведена в описаниях оператора SHELL в данном руководстве и команды SET в справочном руководстве по DOS). Например: ENVIRON "PATH=\TURBOBAS" устанавливает путь в DOS - "\TURBOBAS". Впоследствии созданная SHELL копия COMMAND.COM будет автоматически искать в справочнике \TURBOBAS файлы, не найденные в текущем справочнике. Для удаления параметра из таблицы среды, повставьте точку с запятой (;) после знака равенства: ENVIRON "PATH=;" удаляет параметр пути из таблицы среды. Ограничения: Вы не можете расширять пространство среды. Чтобы добавить новые элементы, вы должны освободить пространство, удалив существующие элементы. Смотри также: ENVIRON$ SHELL Пример: ' вывести на дисплей и изменить путь ' в среде переменных PRINT ENVIRON$("PATH") ENVIRON "PATH=\" Функция ENVIRON$ Функция: ENVIRON$ дает возможность получить заданную строку из таблицы параметров среды. Синтаксис: s$=ENVIRON$(строка параметров) s$=ENVIRON$(n) Комментарии: Параметр "строка параметров" должен быть допустимым символьным выражением, содержащим параметр для поиска. Параметр "n" должен быть целым выражением со значением в диапазоне от 1 до 255. ENVIRON$ и соответствующий ей оператор ENVIRON используются для создания среды, которая должна быть передана программе, выполняемой через оператор SHELL. (Более подробная информация приведена в описаниях оператора SHELL в данном руководстве и команды SET в справочном руководстве по DOS). Если используется символьный аргумент, то ENVIRON$ возвращает текст, который соответствует заданной строке параметров таблицы параметров среды. Функция ENVIRON$ делает различия между символами на верхнем и на нижнем регистре. Если заданная "строка параметров" не найдена, или нет текста, следующего за знаком равенства, то возвращается пустая строка. Если использован числовой аргумент, то ENVIRON$ возвращает строку, содержащую n-й от начала таблицы параметр. Если n-го параметра не существует, то возвращается пустая строка. Пример: Смотри пример в описании оператора ENVIRON. Функция EOF Функция: EOF возвращает признак достижения конца файла. Синтаксис: y = EOF(номер файла) Комментарии: Параметр "номер файла" - значение, заданное при открытии файла. EOF возвращает -1 (истина), когда будет достигнут конец заданного файла; иначе, возвращает 0 (ложь). EOF допустим только для дисковых файлов, открытых для последовательного ввода или файлов передаваемых по линии связи. Если EOF возвращает -1 для файлов, передаваемых по линии связи, то это означает, что буфер пуст. Пример: В следующем примере информация считывается из последовательного файла TEXT.DTA до тех пор, пока не будет достигнут конец файла. OPEN "TEXT.DTA" FOR INPUT AS #1 top: IF EOF(1) THEN PRINT c "records (lines) in file TEXT.DTA" END IF INPUT #1, dummy$ c=c+1 GOTO top или можно сделать это более красиво: OPEN "TEXT.DTA" FOR INPUT AS #1 WHILE NOT EOF(1) INPUT #1, dummy$ INCR c WEND PRINT c "records (lines) in file TEXT.DTA": END Функция ERADR Функция: ERADR возвращает адрес последней обнаруженной ошибки. Синтаксис: y = ERADR Комментарии: ERADR возвращает длинное целое значение, представляющее собой позицию, где обнаружена последняя ошибка. ERADR выдает то же самое значение счетчика команд, которое было бы напечатано, если бы не было запрещено прерывание по ошибке (т.е., это можно использовать выбором команды Run-time error в меню Options для поиска позиции исходной программы, на которой находится оператор, вызвавший ошибку). ERADR рассматривается как последнее средство в программах обработки ошибок. Если программа обработки ошибок не имеет возможности для обработки некоторой ошибки, последнее, что вы можете сделать, это напечатать код ошибки (ERR) и ее адрес (ERADR) на экране и предоставить вашим пользователям описание события. Смотри также: ERL ERR ERROR ON ERROR Пример: ON ERROR GOTO Trap ' задание программы обработки ' ошибок периода выполнения DIM X%(10) FOR I% = 1 TO 10 READ X%(I%) ' чтение X десять раз, PRINT X%(I%) ' имея только семь элементов данных, NEXT I% ' возвращает ошибку "отсутствие данных" ' Доступно недостаточное число элементов данных DATA 1,2,3,4,5,6,7 END ' конец программы ' Следующая программа обработки ошибок печатает ' номер ошибки и ее адрес Trap: LOCATE 10,15 ' печать сообщения посередине экрана PRINT "An error of type"ERR"has occurred at address" ERADR LOCATE 11,15 PRINT "Please note these values and check your manual" END ' конец программы Оператор ERASE Функция: ERASE стирает динамические массивы и сбрасывает в ноль элементы статических массивов. Синтаксис: ERASE имя_массива [,имя массива]... Комментарии: Аргумент "имя массива" задает имя массива (массивов), которые вы хотите установить в ноль или удалить из памяти. Заметим, что пустые круглые скобки не должны включаться после имени массива. Если заданный массив - динамический, то его пространство в памяти освобожлается и массив с тем же именем можно затем переопределить с помощью другого оператора DIM. Если заданный массив - статический, то ERASE просто очищает его элементы (для числовых массивов - присваивает им значения 0, для символьных - значение пустой строки). Ограничения: Нельзя применять оператор ERASE к массиву, который никогда не существовал, или, в случае динамического массива, который уже был удален. Различия: Turbo Basic допускает создание статических массивов, работа с которыми быстрее, чем с динамическими. Интерпретирующий BASIC допускает только динамические массивы. Смотри также: CLEAR DIM $DYNAMIC FRE $STATIC Пример: ON ERROR GOTO ErrorHandler ' задание программы ' обработки ошибок PRINT FRE(-1) ' вывести доступную область памяти массивов ' объявить динамический массив, происвоить ему данные ' и вывести доступную область памяти массивов DIM DYNAMIC BigArray(10000) BigArray(6666) = 66 PRINT FRE(-1) ERASE BigArray ' удалить массив из памяти PRINT FRE(-1) ' вывести доступную область памяти массивов ' Этот оператор будет возвращать ошибку периода выполнения, ' если программа запускается с проверкой границ массива PRINT BigArray(6666) END ' конец программы ErrorHandler: PRINT "An error of type" ERR; PRINT "has occurred at address" ERADR END Функции ERDEV и ERDEV$ Функция: ERDEV и ERDEV$ возвращают информацию о драйвере устройства. Синтаксис: y = ERDEV y$ = ERDEV$ Комментарии: При возникновении ошибки целая функция ERDEV возвращает инфорформацию об ошибке в младшем байте. Этот байт содержит код ошибки INT 24. Старший байт содержит 15, 14, 13, 3, 2, 1 и 0 биты слова состояния устройства. ERDEV$ содержит имя устройства: 8 байтов для символьных устройств и 2 байта для устройств с блочной структурой. (Более подробную информацию смотри в техническом справочном руководстве по DOS фирмы IBM). Примеры: ' установливает обработку ошибок ON ERROR GOTO ErrorHandler PRINT "Open the door to driver A and press any key..." WHILE NOT INSTAT : WEND 'ожидание клавиши ' старается получить справочник FILES "A:\*.** END 'конец программы ErrorHandler: 'обработка критической ошибки ' вывод на дисплей сообщения, указывающего ' на проблему и источник PRINT USING "Critical error ## occured with &"; ERDEV, ERDEV$ RESUME NEXT Функции ERR и ERL Функция: ERL и ERR возвращают строку и код ошибки, имевшей место пoследний раз. Синтаксис: y = ERR y = ERL Комментарии: ERL возвращает номер строки, в которой была зафиксирована ошибка последний раз. Если ошибка произошла в операторе, не содержащем номер строки, то ERL возвращает номер ближайшей пронумерованной строки возвращаясь к началу программы. Если между началом программы и точкой возникновения ошибки нет пронумерованных строк, ERL возвращает 0. ERR возвращает номер последней ошибки, имевшей место в период выполнения программы. Проверка его осуществляется в подпрограммах обработки ошибок, чтобы исполнить программу, соответствующую типу возникшей ошибки. Примечание: Операторы ERL, RESUME и RESUME NEXT вызывают генерацию компилятором 4-х байтового указателя для каждого оператора в программе. Следовательно, программисты, которых волнует размер объектной программы, должны учесть это замечание. Использование RESUME [Line #] генерирует единственную команду перехода. ERL обычно используется для целей отладки, поэВому для нее, вероятно, это замечание представляет малый интерес. Различия: Правила, касающиеся того, с какой стороны оператора отношения должен стать номер строки, сравниваемый со значением, возврашаемым функцией ERL, не применима к Turbo Basic. Это имеет место потому, что в Turbo Basic нет команды RENUM. Кроме того, результат, возвращаемый ERL, в интерпретирующем Basic в случае возникновения ошибки при выполнении оператора в DIRECT MODE не применима к Turbo Basic. Смотри также: ERADR ERROR ON ERROR Пример: ' установить обработку ошибок во время выполнения ON ERROR GOTO Trap DIM X%(10) FOR I%=1 TO 10 40 READ X%(I%) ' считывает х 10 раз PRINT X%(I%); ' только с 7 единицами данных NEXT I% ' возвращает ошибку "нет данных" ' недостаточное число ' элементов данных доступно 70 DATA 1,2,3,4,5,6,7 80 END 'конец программы 90 Trap: IF ERL=40 THEN RESTORE RESUME ELSE PRINT "Unknown Error":END END IF Оператор ERROR Функция: ЕRROR имитирует фиксацию ошибки в период выполнения программы. Синтаксис: ERROR код_ошибки Комментарии: Аргумент "код_ошибки" - выражение целого типа от 0 до 255. Если значение "код_ошибки" равно заранее заданному коду ошибки (смотри приложеие Е), то оператор ERROR имитирует фиксацию этой ошибки. Это предназначается для помощи при отладке программ обработки ошибочных ситуаций. Чтобы определить ваши собственные коды ошибок, используйте для аргумента "код_ошибки" значения, не используемые в Turbo Basic. Если процедура обработки ошибок для новых кодов ошибок не определена, Turbo Basic выводит на дисплей сообщение: Еrror n at pgm-str: адрес где n - код ошибки и адрес - значение счетчика команд процессора на момент фиксации ошибки. Пример: ' генерирует ошибку "Неправильный вызов функции" при неверном ' обращении DEF FN func%=(x%) IF X% > 65 THEN ERROR 5 'имитирует ошибку "Неправильный вызов функции" ELSE FNfunc%=X%*1000 END IF END DEF PRINT FN func(66) 'вызовет печать ошибки '"Неправильный вызов функции" Оператор EXIT Функция: EXIT осуществляет досрочный выход из программной структуры. Синтаксис: EXIT {SELECT | DEF | FOR | IF | LOOP | SUB} Комментарии: Оператор EXIT позволяет выйти из структурированного оператора или процедуры или функции в любом месте, не доходя до его конца. Тип структуры, из которой можно выйти с помощью оператора EXIT, должен быть включен как параметр оператора EXIT в соответствии со следующим: ------------------------------------------------------------- Параметр оператора Структура, из которой осуществляется выход ------------------------------------------------------------- SELECT Оператор SELECT DEF Определение функции FOR Цикл FOR/NEXT IF Блок IF LOOP Циклы DO/LOOP или WHILE/WEND SUB Определение процедуры ------------------------------------------------------------- Используя EXIT, можно избавиться от применения операторов. Ограничения: При использовании EXIT для выхода из функции, следует назначить функции возвращаемый результат перед выполнением EXIT. Пример: ' Программа демонстрирует все EXIT операторы. В процедуре и ' функции он используется для завершения их выполнения. ' В подпрограмме также демонстрируются различные доступные ' операторы EXIT, применяемые в конструкциях LOOP, ' SELECT CASE и IF THEN ELSE. SUB Controls (Sel%, Dummy%) ' оператор EXIT может быть использован для окончания ' конструкций SELECT CASE и IF THEN ELSE. EXIT также ' заканчивает выполнение процедуры SELECT CASE Sel% CASE 1 'пользуйтесь оператором CASE для сообщения пользователю ' о вводимом числе. SELECT CASE Dummy% CASE<0 PRINT "Number is less than zero" 'выход из оператора SELECT CASE EXIT SELECT CASE>0 PRINT "Number is greater than zero" 'выход из оператора SELECT CASE ЕXIT SELECT CASE ELSE PRINT "Number is 0" END SELECT EXIT SUB 'завершение процедуры CASE 2 ' используem IF THEN ELSE, чтобы делать то же, что и ' SELECT CASE IF Dummy% < 0 THEN PRINT "Number is less than zero" EXIT IF ELSEIF Dummy% > 0 THEN PRINT "Number is greater than zero" EXIT IF 'выход, из IF THEN ELSE PRINT "Number is 0" END IF END SELECT PRINT "You selected number 2" END SUB DEF FN Loops(Sel%) 'параметр, передаваемый функции, будет указывать, какой 'EXIT будет выполняться. Каждая структура цикла выполняет 'одно и то же, чтобы продемонстрировать, как EXIT может 'использоваться для завершения выполнения цикла. 'Также демонстрируется как EXIT может использоваться для 'завершения функции. 'EXIT DEF используется для выхода из первых двух вариантов 'выбора . Это предотвращает выполнение оператора PRINT. 'назначение значения результату функци FN Loops=-1 SELECT CASE Sel% CASE 1 'используйте EXIT для завершения цикла вместо 'нормального его завершения FOR I% = 1 TO 32767 PRINT RND(Dummy%) EXIT FOR ' завершение цикла for NEXT I% EXIT DEF 'завершение всей функции CASE 2 'используйте EXIT для завершения этого бесконечного 'цикла вместо нормального его завершения DO PRINT RND(Dummy%) EXIT LOOP 'завершение цикла LOOP EXIT DEF 'завершение всей функции CASE 3 'используйте EXIT для завершения этого бесконечного 'цикла вместо нормального его завершения WHILE 1 PRINT RND(Dummy%) ' то же самое, что и завершение EXIT LOOP WEND 'цикл DO END SELECT PRINT "You executed selection 3" END DEF 'конец определения функции ' начало главной программы ' сделаем три вызова функции LOOP для демонстрации различных ' операторов цикла PRINT FN Loops(1) PRINT FN Loops(2) PRINT FN Loops(3) INPUT "Enter a number: ";Dummy% 'ввод данных пользователя 'выполним CONTROL, выбирая каждую управляющую структуру FOR Count% = 1 TO 2 CALL Controls(Count%, Dummy%) CALL Controls(Count%, Dummy%) NEXT Count% END 'конец программы Функции EXP, EXP2, EXP10 Функция: EXP возвращает значениe е^x, EXP10 возвращает значение 10^x, EXP2 возвращает значение 2^x . Синтаксис: EXP: y = EXP(x) EXP2: y = EXP2(x) EXP10: y = EXP10(x) Комментарии: EXP возвращает значение e в степени x, где x - числовое выражение и е - основание натуральных логарифмов, приблизительно 2.718282. Тот же самый результат можно получить с помощью выражения е^х. С помощью EXP можно вычислить значение е: е = EXP(1) EXP2 возвращает значение 2 в степени x, где x - числовое выражение или переменная. Тот же самый результат можно получить с помощью выражения 2^х. EXP10 возвращает значение 10 в степени x, где x - числовое выражение или переменная. Тот же самый результат можно получить с помощью выражения 10^х. Функции EXP, EXP2 и EXP10 дают результат с двойной точностью. Пример: FOR I = 1 TO 10 PRINT USING "EXP of ## = #### ^^^^ ";I,EXP(I) NEXT I END Оператор FIELD Функция: FIELD определяет переменные полей в буфере файла с произвольным доступом. Синтаксис: FIELD [#]номер_файла,ширина AS симвпер[,ширина AS симвпер]... Комментарии: Параметр "номер_файла" определяет номер, под которым файл был открыт. Параметр "ширина" определяет число байтов, размещаемое в строке (поле), определяемой символьной переменной поля. Параметр "симвпер" определяет символьную переменную поля, которая будет использоваться для обращения к данному полю файла с произвольным доступом. Оператор FIELD определяет соответствие между символьными переменными и буфером ввода-вывода файла с произвольным доступом. После использования в операторе FIELD, с тими символьными переменными связываются области памяти в буфере файла с произвольным доступом и они получают специальный статус "переменных поля". Им может быть присвоено значение только в операторах LSET и RSET при подготовке к записи в указанный файл с произвольным доступом. Ограничения: Идентификатор, используемый в операторе FIELD, никогда не должен появляться в левой части оператора присваивания. В противном случае, идентификатор больше не будет связан с определением поля в файле с произвольным доступом. Смотри также: LSET RSET Пример: ' открыть файл с произвольным доступом OPEN "R", #1, "CVISLD.DTA" ,18 ' OPEN "FIELD.DTA" FOR OUTPUT AS #1 LEN = 18 ' дадим определение для каждого поля FIELD #1, 2 AS Integer$, 4 AS LongInt$,- 4 AS SinglePre$, 8 AS DoublePre$ FIELD #1, 2 AS A$, 4 AS B$, 4AS C$, 8 AS D$ MaxInt%=32767 ' запишем данные в файл FOR I%=1 TO 5 ' преобразуем данные и запишем их в буфер ' перед записью их в файл данных LSET Integer$ =MKI$(I%) LSET LongInt$=MKL$(I%+CLNG(MaxInt%)) LSET SinglePre$=MKS$(CSNG(I%*CSNG(MaxInt%))) LSET DoublePre$=MKD$(MaxInt%I%) PUT #1,I% NEXT I% ' считаем данные из файла FOR I%=1 TO 5 ' и выведем их на кран GET #1, I% PRINT CVI(A$), CVL(B$), CVD(D$) NEXT I% CLOSE #1 'закроем файл END 'конец программы Оператор FILES Функция: FILES выводит на дисплей содержимое справочника (аналогично команде DIR в DOS). Синтаксис: FILES [имя_файла] Комментарии: Параметр "имя_файла" - символьное выражение, удовлетворяющее соглашениям присвоения имен в DOS, которое дополнительно может содержать имя устройства и путь. Если параметр "имя_файла" опущен, то оператор FILES выводит все файлы, размещенные в текущем справочнике выбранного устройства. Параметр "имя_файла" может содержать замещающие символы: вопросительный знак (?), обозначающий любой символ в имени файла или в его расширении, и звездочку (*), обозначающую произвольное количество любых символов: FILES "*.*" выводит все файлы, размещенные в текущем справочнике. FILES "*.BAS выводит только исходные файлы Turbo Basic, имеющие тип .BAS. В конце списка файлов, Turbo Basic выводит число свободных байтов на устройстве, содержащем текущий справочник. Подсправочники обозначаются посредством суффикса , следующего за именем справочника. Ограничения: Задание несуществующего устройства или справочника в операторе FILES, вызовет фиксацию ошибки в период выполнения программы. Примеры: INPUT "Enter the drive and directory you would like_ to list"; Dir$ ' выводит на дисплей заданный справочник FILES Dir$ END 'конец программы Функция FIX Функция: FIX осуществляет усечение до целого числа. Синтаксис: y = FIX(числовое выражение) Комментарии: Функция FIX просто удаляет дробную часть аргумента и возвращает целую часть (в отличие от CINT и INT, которые выполняют округление). Смотри также: CEIL CINT INT Пример: FOR I = 50 TO 52 STEP RND PRINT USING "The integer part of ##.## is ##";I,FIX(I) 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), после чего цикл заканчивается. Циклы FOR/NEXT выполняются быстрее при целочисленных значениях счетчика и констант x, y и z. Тело цикла обходится, если начальное значение x превышает его конечное значение y или, если z - отрицательное и x меньше чем y. Циклы FOR-NEXT могут быть вложенными; т.е. цикл FOR-NEXT может быть расположен внутри другого цикла FOR-NEXT. Когда используются вложенные циклы, каждый из них должен иметь свое имя переменной, являющейся счетчиком. Кроме того, оператор NEXT внутреннего цикла должен идти до оператора NEXT внешнего цикла. Следующая программа имеет пересекающиеся циклы и не будет компилироваться: FOR n = 1 TO 10 FOR м = 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 ' NEXT n будет работать также, но не NEXT m Хотя компилятору это безразлично, располагайте операторы между FOR и NEXT, с отступом на два или три пробела от края, выделяя таким образом структуру цикла. Используйте оператор ЕXIT FOR для выхода из цикла FOR/NEXT до его завершения. Если NEXT встречается без соответствующего FOR, то фиксируется ошибка 1 периода выполнения "NEXT Without FOR" (NEXT без FOR). Пример: FOR I% = 1 TO 10 PRINT "For loop iteration" I% ' вывод итераций на дисплей NEXT I% PRINT "Press any key..." 'пауза WHILE NOT INSTAT WEND ' используем STEP для уменьшения счетчика FOR I% = 50 TO 1 STEP -5 PRINT "For loop iteration" (45-I%)\ 5 ' заметьте, отсутствие параметра для NEXT NEXT END Функция FRE Функция: FRE возвращает размер свободной памяти, доступной вашей программе. Синтаксис: y = FRE({символьное_выражение|-1|-2}) Комментарии: FRE с символьным аргументом возвращает длинное целое, представляющее число байтов свободного пространства в области памяти для символьных строк. FRE (-1) возвращает размер свободного пространства в области памяти массивов вашей программы. FRE(-2) сообщает сообщает размер свободного пространства в стеке. Различия: Функция FRE в Turbo Basic обеспечивает больше информации, чем в интерпретирующем Basic. Оператор FRE в интерпретирующем Basic возвращает количество свободной памяти в сегменте данных Basic; следовательно, вызовы FRE(S$) и FRE(0) возвращают одно и то же число. Однако, поскольку Turbo Basic обеспечивает для работы больший объем памяти, его оператор FRE имеет больше функций. Turbo Basic имеет отдельный сегмент символьных строк; таким образом, FRE(S$) возвращает доступное символьное пространство. В Turbo Basic под массивы отведено большое пространство памяти (> 64К), таким образом, FRE(-1) возвращает память доступную для массивов. И Turbo Basic поддерживает процедуры и рекурсию, так что FRE(-2) возвращает размер свободной памяти в стеке. Пример: ON ERROR GOTO ErrorHandler 'задает программу обработки 'ошибок 'выведем на дисплей размер свободной памяти в сегментах 'символьных строк, данных и стека PRINT FRE("String Space"), FRE(-1), FRE(-2) DIM DYNAMIC BigArray(10000) 'объявляет динамический массив BigArray(6666)=66 'присвоение значения его элементу 'выведем на дисплей размер свободной памяти в сегментах 'символьных строк, данных и стека S$="abc...z" PRINT FRE("String Space"), FRE(-1), FREE(-2) ERASE BigArray 'удаляет динамический массив 'выведем на дисплей размер свободной памяти в сегментах 'символьных строк, данных и стека S$="" PRINT FRE("String Space"), FRE(-1), FRE(-2) 'Оператор возвращает ошибку периода выполнения, 'если программа запущена с проверкой границ PRINT BigArray(6666) END 'конец программы ErrorHandler: PRINT "An error of type" ERR " has occured at address"ERADR END Оператор GET (файлы) Функция: GET считывает запись из файла с произвольным доступом. Синтаксис: GET [#]номер файла[,номер записи] Комментарии: Параметр "номер файла" - это число, под которым файл был открыт. Параметр "номер записи" - это номер записи для считывания, находящийся в диапазоне от 1 до 16777215 (2^24 -1). Если "номер записи" опущен, то в буфер считывается следующая (после предыдущего оператора GET или PUT) запись. Пример: ' открывает файл с произвольным доступом OPEN "GET.DTA" AS #1 LEN = 18 ' выполняет два определения поля для каждого лемента поля FIELD #1, 2 AS Integer$, 4 AS LongInt$,- 4 AS SinglePre$, 8 AS DoublePre$ FIELD #1, 2 AS A$, 4 AS B$, 4AS C$, 8 AS D$ MaxInt%=32767 FOR I%=1 TO 5 'записывает данные в файл ' преобразуем данные и запишем в буфер ' перед записью их в файл данных LSET Integer$ =MKI$(I%) LSET LongInt$=MKL$(I%+CLNG(MaxInt%)) LSET SinglePre$=MKS$(CSNG(I%*CSNG(MaxInt%))) LSET DoublePre$=MKD$(MaxInt%I%) PUT #1,I% NEXT I% FOR I%=1 TO 5 'считаем данные из файла GET #1,I% 'и выведем их на экран PRINT CVI(A$), CVL(B$), CVD(D$) NEXT I% CLOSE #1 'закроем файл END 'конец программы Оператор GET (графика) Функция: GET передает графический образ с экрана или часть его в массив. Синтаксис: GET (x1,y1)-(x2,y2), массив Комментарии: (x1,y1) и (x2,y2) определяют, соответственно, верхнюю левую и нижнюю правую границы, передаваемой прямоугольной зоны графического экрана. Параметр "массив" - числовой массив. GET и дополняющая его команда PUT используются сначала для считывания, а затем для записи графических образов на экран. Единственным ограничением на числовой массив, используемый для хранения данных, считанных с экрана, является то, что он должен иметь достаточно большой размер, чтобы вместить весь образ. Используйте следуююую формулу для вычисления размера массива, необходимого для сохранения данной зоны экрана: число_байтов = 4 + INT((x * бит_на_пиксель +7) / 8)* y где x и y - горизонтальный и вертикальный размеры сохраняемой зоны, соответственно; бит_на_пиксель - константа, относящяаяся к графическому режиму: 2 - для среднего разрешения и 1 - для высокого разрешения. --------------------------------- экранный режим бит на пиксель --------------------------------- 1 2 2 1 7 4 8 4 9 4 10 2 -------------------------------- Например, размер памяти, требуемый для того, чтобы записать в режиме среднего разрешения образ 35x45 пикселей, вам потребуется массив размером 4 + INT((35 * 2 + 7) / 8) * 45 байтов или 409 байтов. 409 байтов представляют массив целого типа, из 205 элементов, что может быть обеспечено оператором DIM buffer%(204). (Помните, что по умолчанию каждый массив имеет нулевой элемент; таким образом, массив buffer% имеет 205 2-байтовых элементов, от 0 до 204, всего 410 байтов.) Turbo Basic запоминает графические данные в буферном массиве в следующем формате: buffer%(0): число битов по горизонтали buffer%(1): число битов по вертикали buffer%(2) . . сама графическая информация . buffer%(204) Из-за организации памяти дисплея, перемещение фигур по экрану с помощью операторов GET и PUT, будет выполняться быстрее, если вы выберете области экрана, прилегающие к границам байта. Для среднего разрешения используйте значения x кратные 4; для высокого разрешения используйте значения х кратные 8. Основная стратегия использования операторов PUT и GET для перемещения фигуры из точки А в точку В заключается в следующем: Нарисовать фигуру GET фигура в массив позиция = старое положение = точка A DO UNTIL позиция = точка B PUT XOR фигура на старое положение 'стереть/нарисовать позиция = позиция + приращение PUT XOR фигура на позицию Задержка, если необходимо старое положение = позиции LOOP Пример: ' выделение буфера для запоминания графического изображения DIM Buffer%(143) ' переключение в графический режим со средним разрешением SCREEN 1 CIRCLE (16,16),8,2 'рисует окружность GET (0,0)-(31,31), Buffer% 'записывает окружность ' копирует все на экран FOR I% = 0 TO 9 PUT(I%*32,100), Buffer% NEXT I% END 'конец программы Функция GET$ Функция: GET считывает запись из файла, открытого в режиме BINARY (двоичный). Синтаксис: GET$ [#]номер файла, счетчик, символьная_переменная Комментарии: "счетчик" - выражение целого типа в диапазоне от 0 до 32767. GET$ считывает число байтов, заданное параметром "счетчик", начиная от текущей позиции в файле (которая была установлена с помощью оператора SEEK), номер которого задается параметром "номер_файла" и зaписывает их в строку, заданную праметром "символьная переменная". Файл с заданным номером должен быть открыт в режиме BINARY (двоичный). После выполнения функции GET$ текущая позиция файла будет изменена на число байтов, указанное в счетчике. GET, PUT и SEEK обеспечивают возможность обработки последовательных файлов и файлов с произвольным доступом на низком уровне, что позволяет работать с файлами по принципу побайтно. Смотри также: OPEN PUT$ SEEK Пример: SUB CreateFile ' GET$ открывает файл и записывает ' 256 символов в него LOCAL I% ' открывает файл для ввода-вывода в режиме BINARY OPEN "GET$.DTA" FOR BINARY AS #1 ' записывает данные в него FOR I% = 0 TO 255 PUT$ #1,I%, CHR$(I%) NEXT I% END SUB 'конец процедуры CreateFile DEF FNReadIt$(Start%,Size%) ' GET$ считывает указанное количество данных ' из файла LOCAL TempStr$,Char$, I% ' осуществляет установку указателя на правильную ' позицию в файле SEEK 1,Start% ' считывает Size% байтов GET$#1, Size%,TempStr$ FNReadIt$ = TempStr$ END DEF 'конец программы ReadIt CALL CreateFile 'создаает файл данных ' ввод информации пользователя PRINT "Enter the starting point [0...255] and how many" PRINT "bytes of data[0...255] you wish to" INPUT "read from the fil: ",St%, Sz% PRINT FNReadIt$(St%,Sz%) 'считывает данные END 'конец программы Оператор GOSUB Функция: GOSUB вызывает подпрограмму. Синтаксис: GOSUB метка Комментарии: Оператор GOSUB в Turbo Basic вызывает переход к оператору, помеченному меткой и затем сохраняет его текущий адрес в стеке. После выполнения RETURN передает управление оператору, непосредственно следующему за GOSUB. Процедуры и функции в Turbo Basic могут выполнять действия подпрограмм с дополнительными возможностями рекурсий, передачи параметров и локальных и статических переменных. Смотри также: DEF FN SUB RETURN Пример: PI# = ATN(1) * 4 'вычисляет значение pi Radius! = 55 'объявляет переменную обычной точности GOSUB CalcArea ' переход на подпрограмму Radius! = 13 GOSUB CalcArea ' переход на подпрограмму END 'конец программы ' вычисляет и выводит на дисплей площадь окружности CalcArea: Area = PI# * Radius^2 'вычисление площади PRINT Area 'выводит на дисплей результат RETURN 'возвращение из подпрограммы Оператор GOTO Функция: GOTO oсуществляет безусловный переход в программе на оператор, помеченный меткой. Синтаксис: GOTO метка Комментарии: GOTO oсуществляет безусловный переход в программе на оператор, помеченный меткой. Используемые умеренно, операторы GOTO - быстрое и эффективное средство программирования. Используйте их осторожно, так как они могут запутать программу так, что в ней будет невозможно разобраться (особенно, спустя месяцы и годы после ee написания). В практике современного программирования минимизируется использование GOTO с помощью подпрограмм, процедур, функций и структурированных операторов, таких как FOR/NEXT, WHILE/WEND, DO/LOOP, IF BLOCK и SELECT. Оператор EXIT может также помочь в уменьшении использований GOTO. Смотри также: EXIT Пример: X = 0 Start: 'определяет метку X = X + 1 'приращение X IF X < 20 THEN 'если Х < 20, тогда переход на PrintOut GOTO PrintOut END IF END PrintOut: 'выводит на дисплей значение Х PRINT "Variable X = "X GOTO Start 'переход обратно на Start