Трансляция в С++

При трансляции в 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;
}