— Указатели в СтарБейсике видишь?
— …
— А они там есть.
Вступление
Динамические массивы повышают интеграционную адаптивность программ.
Под динамическими массивами здесь и далее понимаем множественные данные, структура и число элементов которых становятся известны и могут меняться на этапе решения вычислительной задачи.
Без претензии на толкование динамических массивов, далее по тексту изложены:
• операторы языка StarBasic из Apache OpenOffice для работы с динамическими массивами;
• демонстрационные примеры с динамическими массивами на языке StarBasic.
Операторы языка StarBasic
Для практического применения динамических массивов необходимо и достаточно:
• создавать собственные структуры данных;
• обращаться к данным по‑значению и по‑адресу (ссылке);
• произвольно выделять и освобождать блоки памяти в куче.
Язык программирования StarBasic содержит необходимый и достаточный набор операторов:
Оператор объявления пользовательского типа данных:
Type TUserType
field_1 as EmbeddedType_1
field_2 as EmbeddedType_2(*)
End Type
(*) Для полиморфных данных применим встроенный тип Variant.
Оператор выделения блока памяти из кучи:
Dim userVar as New TUserType
Оператор возврата блока памяти в кучу:
userVar = Nothing
Оператор присваивания значения:
userVar_1 = userVar_2
Оператор присваивания ссылки:
Set userVar_1 = userVar_2
Передача параметров по-ссылке (ByRef) и по‑значению (ByVal).
Функции пользовательского типа возвращают результат по‑ссылке.
Далее на примерах.
Пример 1. Односвязный список
Главный структурный элемент односвязного списка — это указатель на следующий элемент списка.
Описание элемента односвязного списка на языке «С»:
struct sListItem
{
int item; //полезная информация элемента
sListItem *succ; //указатель на следующий элемент
};
Структурная схема односвязного списка:
Пример демонстрирует по‑элементное создание и удаление односвязного списка.
Описание структуры односвязного списка на языке StarBasic:
Type TListItem
n as Integer
succ as Variant
End Type
Точка запуска демонстрации односвязного списка:
'***************************************************************************
' Тест односвязного списка
Sub list_Test()
Детали и подробности в исходном тексте.
Исходный текст демонстрационного примера в финале публикации.
Пример 2. Двоичное дерево
В структуре элемента двоичного дерева содержится два указателя на предшествующий и последующий элементы.
Описание элемента бинарного дерева на языке «С»:
struct sBTreeItem
{
int item; //полезная информация элемента
sBTreeItem *pred; //указатель на предыдущий элемент
sBTreeItem *succ; //указатель на следующий элемент
};
Структурная схема двоичного дерева:
Пример демонстрирует адаптивное создание, реструктуризацию, частичное и полное удаление произвольного двоичного дерева согласно набора внутренних и внешних правил.
Описание структуры двоичного дерева на языке StarBasic:
Type BTreeNodeType
Expression as String
Left as Variant
Right as Variant
End Type
Точки запуска демонстрации двоичного дерева
'***************************************************************************
' Функция для формул листа
Public Function BOOLCALC(formula as String) as String
'***************************************************************************
' Тест динамического двоичного дерева
Sub btree_test()
Прикладная часть примера с двоичным деревом — простой логический вычислитель.
На вход вычислителя подаётся строка с логической формулой.
Вычислитель возвращает решение (упрощение) логической формулы, если это возможно. Например:
0 ^ 1 = 1
b | a & b | c = B | C
Словарь вычислителя:
• 0 — FALSE
• 1 — TRUE
• A, D, C, D, E, F, G — произвольные логические функции (всего 7)
• | — логический оператор OR
• & — логический оператор AND
• ^ — логический оператор XOR
• ~ — логический оператор NOT
• () — оператор повышения приоритета
Высший приоритет у оператора отрицания «~».
Другие операторы имеют равный приоритет, выполняются последовательно слева направо.
Оператор повышения приоритета «()» меняет порядок выполнения операторов по правилам арифметики.
Детали и подробности в исходном тексте.
Демонстрационный пример
Демонстрационный пример требует средний уровень безопасности макросов.
Во время открытия файла примера «включить» макросы.
Демонстрационный пример в формате электронной таблицы содержит два листа с формулами и два модуля с макросами.
На первом листе таблица основных логических преобразований. Первый лист служит для проверки программы.
На втором листе форма проверки произвольной логической формулы.
Первый модуль макросов содержит демонстрационный пример работы со связным списком.
Во-втором модуле макросов — демонстрационный пример работы с двоичным деревом.
Демонстрационный файл доступен по ссылке:
ApacheOpenOfficeDynarr.ods.
Вместо заключения
Дополнительная информация в завершение темы динамических массивов как средства повышения интеграционной адаптивности программ:
• примеры подготовлены в Apache OpenOffice 4.1.11;
• допускается применение других офисных пакетов;
• условия распространения кода — GNU GPL v3.