D3 Reference Manual

Index | Help

Поиск по страницам

Разделы / FlashBASIC / Переменные и константы

Переменные и константы

Переменные

Динамический массив

Файловые переменные

Файловые переменные по умолчанию

Списковые переменные

Статический массив (dimensioned array)

Константы

Глобальные переменные

Обращение к элементам массива

Использование шаблонов при обращении к элементам массива

Изменение размерности статического массива

Переменные

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

Программная переменная подобна переменной в математической формуле. Термин "переменная" получил широкое распространение во времена популярности языка FORTRAN (FORmula TRANslation).

Например, переменной "x" в начале программы может быть присвоено значение 100, а позже - значение "abc".

Если цифровые строки используются в арифметических выражениях, они преобразуются в числовые выражения, a числовые выражения преобразуются в строковые, если используются со строковыми операторами.

Переменная идентифицируется по ее имени. Имена переменных состоят из буквенного символа, за которым могут следовать другие буквы, цифры, символы точки (.), знаки доллара ($), и символ подчеркивания. Имя переменной может иметь длину от 1 до 48 символов.

Может быть определено до 214 748 363 переменных.

Символы, которые не могут использоваться в именах переменных:

 : ; @ * ! & = # - + / ^ < > ' " \ [ ] ( )

Правила для зарезервированных слов:

  • Имена встроенных функций нельзя использовать в качестве имен статичееский массивов, но можно использовать в качестве имен переменных.
  • Специальные обозначения ("and", "do", "else",..) нельзя использовать в качестве имен переменных.
  • Любые другие слова могут быть именами как массивов, так и переменных.
Динамический массив

Строка, содержащая любые из трех основных системных разделителей: маркеры атрибутов, маркеры значений и маркеры подзначений. Такие массивы называются "динамическими" из-за возможности вставки и удаления элементов массива без предварительного объявления размера массива.

Обращаться к динамическому массиву можно так же, как и к любой другой переменной, - как с указателем (индексом) элемента, так и без него.

Примеры:

s = ''

Все элементы массива обнуляются.

s<3>=''

Обнуляется третий атрибут.

Файловые переменные

Определяет расположение файла в операторе "open".

open filename to file.variable ...
read variable from file.variable...
write variable on file.variable...

Символ, позволяющий обращаться к файлу после того, как он был открыт в программе FlashBASIC. Файловые переменные назначаются оператором "open".

Файловые переменные содержат назначенные указатели файла и используются в последующих операторах ввода/вывода файлов в программе FlashBASIC.

Если файловая переменная назначена явным образом, все последующие операторы "{mat}read{u}", "readv{u}", "{mat}write{u}", "delete", "clearfile", "release", "select" и "close" обращаются к данному файлу по этой файловой переменной.

В отличие от числовых и символьных переменных, файловые переменные не могут быть выведены операторами "print" или "crt". Кроме того, они не могут использоваться в строковых и арифметических выражениях и высвечиваться отладчиком FlashBASIC. Значение файловой переменной может быть присвоено другим переменным с помощью стандартного оператора присваивания. Однако, их можно копировать в другие переменные следующим образом:

file.varaiable.b = file.variable.a
Файловые переменные по умолчанию

Использование файловой переменной по умолчанию возможно в следующих операторах: "clearfile", "delete", "matread", "matreadu", "open", "read", "readu", "readv", "readvu", "release", "select", "write", "writev", "writevu", "matwrite" и "matwriteu".

Когда файл открывается оператором "open", ему обычно назначается файловая переменная (file.variable) для последующего обращения к этому файлу в программе при выполнении любого из вышеуказанных операторов. Общая форма выглядит следующим образом:

open "customers" to customer.file else ...

Здесь действующим словом является слово "to". В этом случае оно назначает действительное местоположение (представленное внутри системы как "база", "модуло" и "сепарация") переменной под названием "customer.file". Далее в программе при чтении элемента из файла файловая переменная будет представлена в соответствующей форме в операторе "read", а именно:

read customer.item from customer.file else ..

Здесь действующим словом является слово "from". Но если используется файловая переменная по умолчанию, во время открытия файла оператором "open" никакого явного назначения не производится, как показано в следующем примере:

open "customers" else ..

Следовательно, как показано ниже, при последующих попытках чтения или записи указания файловой переменной не требуется:

  read customer.item else ...

В программе FlashBASIC может быть только одна файловая переменная, используемая по умолчанию. В операторах "open" для остальных файлов, необходимых для ввода/вывода, файловая переменная должна быть назначена явно. В противном случае используется файл по умолчанию.

Списковые переменные
Используется оператором select, для ссылки на открытый список. Использование аналогично файловым переменным. Может быть одна списковая переменная по умолчанию (без имени) и списковую переменную можно присвоить.
Статический массив (dimensioned array)

Статический массив заданной размерности (dimensioned array) - это таблица, содержимое элементов которой можно изменить, но положение каждого элемента фиксировано. Иными словами, нельзя ни вставлять новые элементы, ни удалять имеющиеся.

Никакие изменения элементов такого массива-матрицы не оказывают прямого влияния на другие элементы. Более того, каждый элемент является отдельной переменной в отличие от "динамического" массива, представляющего собой строки, которые хранятся в одной переменной. Там любые изменения в массиве требуют перестройки всей строки.

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

Примеры:

print rec(7)<1,vmc>
Константы

Существует два вида констант - определяемые оператором equ/equate и встроенные константы.

Оператор equ или equate (другая форма оператора equ) определяет константу, которая подставляется компилятором FlashBASIC в момент компиляции текста программы. Это могут быть алфавитно-цифровые строки, имя переменной или алфавитно-цифровые строки с функцией char().

Встроенные константы начинаются с символа @ и возвращают системные символы или параметры среды.

Встроенные константы:

  • @am - возвращает маркер атрибута
  • @fm - возвращает маркер атрибута
  • @vm - возвращает маркер значения
  • @sm - возвращает маркер подзначения
  • @svm - возвращает маркер подзначения
  • @user - имя пользователя
  • @who - имя пользователя
  • @account - имя счета
  • @logname - имя счета
  • @pib - номер линии
  • @userno - номер линии
  • @time - текущее время во внешнем представлении
  • @date - текущая дата во внешнем представлении
  • @day - текущий день
  • @month - текущий месяц
  • @year - текущий год (2 цифры)
  • @id - то же что и "*a0"
  • @system.return.code - количество записей в активном списке
  • @$sys.compiler - текущая установка совместимости компилятора
  • @$prompt - строка приглашения
  • @$path - путь поиска программ
  • @$messages - имя файла системных сообщений
  • @$имя - обращение к пользовательской переменной

Переменные начинающиеся на @$ и пользовательские могут буть установлены командой TCL set.

Примеры:

a=1:@vm:'one'
open 'pointer-file'
write list on @pib
set [email protected]
set task=library
Глобальные переменные
common variable|array{,variable|array...}
common /id/ variable|array{,variable|array...}

Переменные и/или массивы могут использоваться для связи между программами и подпрограммами с целью обеспечения межпрограммных связей. Это обеспечивает использование области глобальных переменных. Область глобальных переменных может не иметь имени и быть поименована.

Неименовананная глобальная область должна быть приведена во всех вызываемых из головной программы подпрограмм. Обычно для этого используется оператор include.

Именованная область переменных FlashBASIC. Используется для хранения переменных и массивов в области с идентификатором, которая инициализируется только в момент подключения пользователя к системе.

Глобальная именованная "common"-область является общей для всех уровней одного и того же процесса (повышение уровня, команды "execute", коды обработки типа "bridge", выполняемые при занесении записей в файл, индексы и т.д.).

Глобальная "common"-область - это область для хранения переменных FlashBASIC. Используется для хранения переменных и массивов в области, имеющей идентификатор ("id"). Поименованная "common"-область инициализируется только в момент подключения пользователя к системе (logon) и освобождается при отключении (logoff).

Поименованная "common"-область является общей для всех уровней одного и того же процесса (повышение уровня, команды "execute", коды обработки типа "bridge", выполняемые при занесении записи в файл, индексы и т.д.).

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

Обращение к элементам массива
array.variable(ac.expression)
array.variable(row.number,col.number)
array.variable(adi)
dynamic.array.variable<ac.expression>
dynamic.array.variable<ac.expression, vc.expression>
dynamic.array.variable<ac.expression, vc.expression, sc.expression>

В программах FlashBASIC можно обращаться как к динамическим массивам (dynamic arrays), так и к массивам-матрицам заданной размерности (dimensioned arrays).

Форма обращения к статичекому массиву:

array.variable(num.expression)
-или-
array.variable(num.expression, num.expression)

Массивы-матрицы заданной размерности могут иметь не более двух измерений и должны быть предварительно определены с помощью оператора "dim" или "dimension".

Если массив-матрица используется в сочетании с оператором "file", обращаться к его элементам можно по реальному идентификатору записи описания атрибута ("attribute defining item" или "adi") в соответствующем словаре:

file entity
.
.
if fv.entity(name) = "" then

Обращение к динамическим (или "строковым") массивам производится следующим образом:

1) dynamic.array.variable<аc.expression>

Обращение к целому атрибуту в динамическом массиве.

2) dynamic.array.variable<аc.expression, vc.expression>

Обращение к значению внутри атрибута.

3) dynamic.array.variable<аc.expression, vc.expression, sc.expression>

Обращение к подзначению внутри значения.

Сочетание элементов массива-матрицы и динамического массива

Нужное значение или подзначение в элементе массива-матрицы может быть задано следующим образом:

array(ac.expression)<аc.expression,vc.expression>

В этом примере производится обращение к элементу массива-матрицы, определяемому выражением "ac.expression". Номер значения внутри элемента массива определяется выражением "vc.expression".

array(ac.expression)<аc.expression, vc.expression, sc.expression>

Этот пример аналогичен предыдущему, но обращение производится к конкретному подзначению, определяемому выражением "sc.expression".

Кроме того, D3 позволяет осуществлять сравнение по каждому элементу как динамическрнр массива, так и массива-матрицы, используя символ-маску "*". Расположение звездочки определяет, по каким элементам ведется поиск.

Примеры:

customer.item(1) = name

Значение "name" присваивается первому элементу массива-матрицы "customer.item".

customer.item<2,2> = address2

Содержимое "address2" присваивается второму значению второго атрибута динамического массива "customer.item".

if array(*) = "x" then...

В этом примере в массиве-матрице "array" ведется поиск всех элементов, равных символу "x".

if customer.item<2,*> = "" then...

В атрибуте 2 динамического массива "customer.item" ведется поиск любого значения, равного пустой строке ("").

if customer.item<*,*,*> = "" then...

Во всех значениях всех атрибутов динамического массива "customer.item" ведется поиск подзначения, равного пустой строке ("").

if array<*,1,*> = "xxx" then...

В первых значениях каждого атрибута динамического массива "array" производится поиск подзначения, равного "xxx".

Использование шаблонов при обращении к элементам массива

Краткое обсуждение обращения к массивам в языке FlashBASIC и использования специальных "символов-масок" ("wildcard") при поиске в массивах.

Отдельные элементы массивов заданной размерности и динамических массивов могут сравниваться в операторах отношения с использованием обычного синтаксиса. Все элементы массива можно сравнить с заданным значением, используя для указания элемента символ "*" (звездочка).

В многомерных массивах таким способом можно задать одно или несколько измерений (см. пример). Если используется символ "*", операторы "<", ">", "=", "<=", ">=" и "#" возвращают значение "истино", если хоть один элемент в массиве удовлетворяет отношению. Символ "*" может быть задан только в выражениях отношения, а в пределах оператора - в выражениях, относящихся к одному массиву.

Примеры:

dim a(10)
if a(*) = "x" then ....

Здесь все элементы массива заданной размерности "a" сравниваются со значением "x". Если какой-либо элемент равен "x", выполняется оператор "then".

if s(*) >= "10" then....

Этот оператор проверяет, что любой элемент динамического массива "s" больше или равен "10".

dim a(10,10)
if a(*,*)<*,*,*> = "x" then....

Здесь проверяется каждый атрибут, значение и подзначение в каждой строке массива заданной размерности "a".

Изменение размерности статического массива

Каждое значение в массиве называется "элементом массива", и элементы упорядочены. Обращение к элементу массива производится по его позиции в массиве с помощью индексной переменной (subscript variable). Переменная должна иметь по одному индексу (указателю) на каждое измерение массива. Hапример, в плоском (двумерном) массиве первый индекс задает строку, а второй - колонку. Если второй индекс пропущен, по умолчанию принимается значение 1.

Во FlashBASIC имеется два типа массивов - динамические и статические.

Динамический массив - строка обрабатываться как трехмерный массив на основе трех главных системных разделителей: маркера атрибута, маркера значения и маркера подзначения. Такие массивы называются "динамическими" из-за возможности вставки и удаления элементов массива без предварительного объявления размера массива. Динамический массив - это не более, чем символьная строка.

Статический массив - массив заданной размерности - это одномерные или двумерные массивы отдельных переменных. Их название связано с необходимостью заранее объявлять компилятору или исполнительному модулю количество элементов массива с помощью операторa "dim" .

Статические массивы определяются также оператором "file". В этом случае компилятор FlashBASIC задает размерность массива, используя в качестве имени массива имя файла. Количество элементов массива компилятор определяет из самой программы и из словаря файла. Размерность массива определяется по максимальному количеству атрибутов, к которым обращается программа, плюс 1.

Индексы (указатели) в массивах заданной размерности указываются в скобках.

Массивы заданной размерности ограничены двумя измерениями - строками и колонками. Дополнительные измерения можно получить путем обращения к динамическим массивам из элементов массива заданной размерности.

Все элементы в динамических массивах отделены друг от друга разделителями. Динамические массивы состоят из полей (или наборов значений), разделенных маркерами атрибутов (char(254)). Каждый атрибут или поле в динамическом массиве может состоять из нескольких значений, разделенных маркерами значений (char(253)). Каждое значение может состоять из подзначений, разделенных маркерами субзначений (char(252)).

Размер динамических массивов не является постоянным и не определяется заранее.

Индексы (указатели) в динамических массивах указываются в угловых скобках (<>). Динамические массивы ограничены тремя измерениями (атрибут, значение и подзначение). Они называются "динамическими", поскольку количество элементов в них может автоматически увеличиваться или уменьшаться.

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

Динамический массив может быть элементом массива заданной рвзмерности. В этом случае индексы элементов динамического массива указываются после индексов массива заданной размерности.

Ниже показан элемент динамического массива, обращение к которому производится из массива заданной размерности "m":

m(a,b)<х,y,z>

где:

  • "a" - номер строки в массиве заданной размерности;
  • "b" - номер колонки в массиве заданной размерности;
  • "x" - номер атрибута в динамическом массиве;
  • "y" - номер значения в указанном атрибуте;
  • "z" - номер подзначения в указанном значении.

Элемент "m(a,b)" в массиве заданной размерности "m" указывает на начало динамического массива.

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

Примеры:

max = 100
n = 1
dim a(max)
execute "select md"
loop
  readnext id else exit
  a(n) = id
  if (n >= max) then
    max += 100
    dim a(max)
  end
  n += 1
repeat

Здесь все идентификаторы записей из текущего главного словаря (md) загружаются в массив заданной размерности "a".