При трансляции в C++ транслятор создает два файла - unitname.cpp и unitname.h, где unitname - имя модуля, стоящее после ключевого слова unit. Если воспользоваться меню "Просмотр", то содержимое этих файлов будет открыто в самой программе, без создания файлов на диске. Оттранслированный код представляет из себя модуль на языке C++. Модуль экспортирует подпрограммы, указанные в разделе interface, локальные подпрограммы не видны вне модуля. Модуль может использоваться как через подключение его к программе через интегрированную среду разработки (т.е. для него будет создан отдельный obj-файл), так и через включение .cpp файла в другой модуль.
Язык C++ позволяет в полной мере реализовать функциональность языка AlgoPascal. Благодаря полному включению набора операций языка AlgoPascal в набор операций C++ выражения переводятся с сохранением своего вида и читаемости. Включение набора структурных операторов приводит к полному сохранению структуры кода. Несмотря на отсутствие в С++ средств для поддержки массивов с требуемой функциональностью можно написать набор классов, реализующих массивы, которыми можно оперировать как встроенными в язык типами данных. Такой набор классов является частью стандартной библиотеки и рассмотрен ниже.
Отличием языка C++ от Паскаля является то, что С++ чувствителен к регистру имён. В языке С++ имена Alpha
и alpha
будут считаться разными, но в Паскале они считаются одинаковыми. Поэтому при переводе на С++ все имена подпрограмм, переменных и констант приводятся к нижнему регистру.
Стандартная библиотека языка AlgoPascal в С++ находится в файлах ap.h, array_1d.h, array_2d.h, расположенных в каталоге StdLib\CPP. При включении файла ap.h подключаются стандартные функции и заголовочные файлы с классами-шаблонами динамических массивов. Подключать какие-либо ещё cpp или h файлы не требуется. Текущая версия стандартной библиотеки поддерживает только одномерные и двумерные массивы. Единственное, что из стандартной библиотеки нуждается в рассмотрении - это классы массивов.
Как использовать массивы из стандартной библиотеки? Во-первых, классы массивов являются шаблонами, т.е. массивы одной размерности обладают одинаковым набором функций-членов. Во-вторых, функции-члены массивов разных размерностей отличаются только количеством аргументов, но не типом, а потому можно ограничить рассмотрение только одномерными или двумерными массивами. Ниже рассмотрено применение двумерных массивов.
template<class T> class template_2d_array { public: template_2d_array(); const T& operator()(int i1, int i2) const; T& operator()(int i1, int i2); void setbounds( int iLow1, int iHigh1, int iLow2, int iHigh2 ); int getlowbound(int iBoundNum) const; int gethighbound(int iBoundNum) const; }; typedef template_2d_array<int> integer_2d_array; typedef template_2d_array<double> real_2d_array; typedef template_2d_array<BOOL> boolean_2d_array;
Работа с массивом начинается с создания массива. Следует различать создание экземпляра класса-массива и выделение памяти под массив. При создании экземпляра класса может использоваться конструктор без параметров, создающий массив без элементов, конструкторы копий и присваивания, копирующие один массив в другой. Если при копировании массив-источник не имеет выделенной памяти под элементы, то массив-копия тоже не будет содержать элементов. Если массив-источник имеет выделенную под элементы память, то массив-копия выделяет тот же объем памяти и копирует в неё элементы. Т.е. при копировании получаются два полностью независимых массива с одинаковым содержимым.
После создания пустого массива следует выделить память под элементы при помощи метода setbounds
. Параметры метода задают верхние и нижние границы индексов массива. Верхняя граница должна быть не меньше нижней. Для обращения к элементам массива используется перегруженный operator()
. Т.е. код, обращающийся к элементу a[i,j,k] будет выглядеть как a(i,j,k)
.
Ниже приведен пример вычисления массива факториалов, иллюстрирующий работу с массивами.
integer_1d_array factarr(int n) { integer_1d_array result; result.setbounds(1,n); result(1) = 1; for(int i=2; i<=n; i++) result(i) = result(i-1)*i; return result; }