Переменные

Объявление переменных

Переменные должны быть объявлены перед их использованием. Для идентификации переменных используются уникальные имена. Описания переменных используются для их определения и объявления типов. Описание не является оператором.

Простыми типами являются:

  • char, short, int, long, uchar, ushort, uint, ulong – целые числа;
  • color – целое число, представляющее RGB-цвет;
  • datetime – дата и время, беззнаковое целое число, содержащее количество секунд, прошедших с 0 часов 1 января 1970 года;
  • bool – логические значения true и false;
  • double – числа двойной точности с плавающей точкой;
  • float – числа одинарной точности с плавающей точкой;
  • string – символьные строки.

Примеры:

string szInfoBox;
int    nOrders;
double dSymbolPrice;
bool   bLog;
datetime tBegin_Data   = D'2004.01.01 00:00';
color    cModify_Color = C'0x44,0xB9,0xE6';

 

Сложные или составные типы:

Структуры – это составные типы данных, построенные с использованием других типов.

struct MyTime
  {
   int hour;    // 0-23
   int minute;  // 0-59
   int second;  // 0-59
  };
...
MyTime strTime; // переменная типа объявленной ранее структуры MyTime

До тех пор пока структура не объявлена, нельзя объявлять переменные типа структуры.

Массивы

Массив - это индексированная совокупность однотипных данных:

int    a[50];       // Одномерный массив из 50 целых чисел.
double m[7][50];    // Двухмерный массив из семи массивов,
                    // каждый из которых состоит из 50 чисел.
MyTime t[100];      // массив содержащий элементы типа MyTime

 

Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Нумерация элементов массива начинается с 0. Последний элемент одномерного массива имеет номер на 1 меньший, чем размер массива, то есть обращение к последнему элементу массива из 50 целых чисел будет выглядеть как a[49]. То же самое относится и к многомерным массивам – индексация одного измерения производится от 0 до размер измерения-1. Последний элемент двумерного массива из примера будет выглядеть как m[6][49].

Статические массивы не могут быть представлены в виде таймсерий, то есть к ним не применима функция ArraySetAsSeries(), которая устанавливает доступ к элементам массива от конца массива к его началу. Если требуется обеспечить доступ к массиву как в таймсериях, используйте объект динамического массива.

При доступе за пределы массива исполняющая подсистема сгенерирует критическую ошибку и выполнение программы будет остановлено.

Встроенные методы для работы с массивами #

Для работы с массивами можно использовать функции из раздела Операции с массивами, а также встроенные методы:

Метод

Аналог

Описание

void array.Fill(const scalar value, const int start_pos=0, const int count=-1);

ArrayFill, ArrayInitialize

Заполняет массив указанным значением

void array.Free();

ArrayFree

Освобождает буфер динамического массива и устанавливает размер нулевого измерения в 0 (ноль)

int array.Resize(const int range0_size, const int reserve);

int array.Resize(const int range_sizes[], const int reserve);

ArrayResize

Устанавливает новый размер в первом измерении массива

int array.Print();

ArrayPrint

Выводит в журнал значения массива простого типа

int array.Size(const int range=-1);

ArraySize, ArrayRange

Возвращает количество элементов во всем массиве (range=-1) либо в указанном измерении массива

bool array.IsDynamic();

ArrayIsDynamic

Проверяет, является ли массив динамическим

bool array.IsIndicatorBuffer();

 

Проверяет, является ли массив индикаторным буфером

bool array.IsSeries();

ArrayIsSeries

Проверяет, является ли массив таймсерией

bool array.AsSeries();

ArrayGetAsSeries

Проверяет направление индексации массива

bool array.AsSeries(const bool as_series);

ArraySetAsSeries

Устанавливает направление индексации в массиве

int array.Copy(const src_array[], const int dst_start, const int src_start, const int cnt);

ArrayCopy

Копирует значения массива в другой массив

int array.Compare(const src_array[], const int dst_start, const int src_start, const int cnt);

ArrayCompare

Возвращает результат сравнения двух массивов простых типов или пользовательских структур

int array.Insert(const src_array[], const int dst_start, const int src_start, const int cnt);

ArrayInsert

Вставляет в массив-приемник из массива-источника указанное число элементов

int array.Remove(const int start_pos, const int count);

ArrayRemove

Удаляет из массива указанное число элементов начиная с указанного индекса

int array.Reverse(const int start_pos, const int count);

ArrayReverse

Разворачивает в массиве указанное число элементов начиная с указанного индекса

bool array.Swap(array& arr[]);

ArraySwap

Обменивается содержимым с другим динамическим массивом такого же типа

void array.Sort(sort_function);

ArraySort

Сортировка числовых массивов по первому измерению

int array.Search(scalar value, search_function);

ArrayBsearch

Возвращает индекс первого найденного элемента в первом измерении массива

int array.Find((scalar value, search_function);

 

Производит поиск в массиве с помощью переданной функции и возвращает индекс первого найденного элемента

array array.Select(scalar value, search_function);

 

Производит поиск в массиве с помощью переданной функции и возвращает массив со всеми найденными элементами

 

Спецификаторы доступа

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

Спецификатор const объявляет переменную константой, и не позволяет изменять значение этой переменной в процессе выполнения программы. Допускается однократная инициализация переменной при ее объявлении.

Пример

int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[]       // массив для расчета
   );

Для доступа к членам структур и классов используются следующие спецификаторы:

  • public – разрешает ничем неограниченный доступ к переменной или методу класса;
  • protected – разрешает доступ со стороны методов данного класса, а также со стороны методов публично наследуемых классов. Иной доступ невозможен;
  • private – разрешает доступ к переменным и методам класса только из методов данного класса.
  • virtual – применим только к методам класса (но не к методам структур) и сообщает компилятору, что данный метод должен быть размещен в таблице виртуальных функций класса.

Классы памяти

Существуют три класса памяти: static, input и extern. Эти модификаторы класса памяти явно указывают компилятору, что соответствующие переменные распределяются в предопределенной области памяти, называемой глобальным пулом. При этом данные модификаторы указывают на особую обработку данных переменных.

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

 

Смотри также

Типы данных, Инкапсуляция и расширяемость типов, Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов, Статические члены класса