О пользовательских буферах

 

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

В общем-то появилось несколько вопросов, о которых я раньше не задумывался. Обычно, в индикаторах в функции OnInit() инициализируют каждый массив-буфер. Хотя, объявляется данный массив, как правило, без задания размера оного, например:

double   ZZPrice[];
datetime ZZTime[];

 Так вопрос первый в том, что если нет чёткой длинны, то какой резон данный буфер-массив инициализировать нулём или пустым значением? Ведь по сути инициализациях некоторого диапазона данных некоторым значением, есть заполнение диапазона данных неким значением. Например:

int ZZTimeBuf[100];

void Initialize (int& fi_Array[],        // Переданный массив для инициализации значением fi_Value
                 int& fi_CountElements,  // Количество элементов в массиве, который требуется инициализировать
                 int& fi_Value)          // Значение, которым будем инициализировать переданный массив
{
   for (int i = 0; i <= fi_CountElements; i++)
   {
      fi_Array[i] = fi_Value;
   }
}

 В данном случае всё логично, а какой резон инициализировать массив, количество элементов в котором не ведомо?

 

Виктор, ты меня извини, но такой чуши я ещё не читал... Для чего в цикле заполнять массив значениями если существует специальная функция

ArrayFill()

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

void  ArrayFill(
   void&  array[],       // массив
   int    start,         // индекс начального элемента
   int    count,         // количество элементов
   void   value          // значение, которым заполняется массив
   );


А про индикаторный буфер вообще ничего не понятно. Кто и где инициализирует нулём индикаторный буфер?

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

 
Пока не окончилась работа init, никаких индикаторных буферов не существует. Осознайте это. 
 
AlexeyVik:

Виктор, ты меня извини, но такой чуши я ещё не читал... Для чего в цикле заполнять массив значениями если существует специальная функция

ArrayFill()

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

Алексей, а разница то какая? Функция ArrayFill() тоже самое, что я по ходу придумал когда писал свой вопрос. Разница лишь в том, что в ArrayFill() имеется множество перегрузок и она универсальна. И не более того. А я изобразил, как это выглядит изнутри в плане одной перегрузки и всё... Где тут тупость то? :)

Идём дальше.. На самом деле, у меня буферы инициализируются не в ИНИТЕ. А написал я так сверху неподумав. Но это сути вопроса не меняется. Возьмём, например, стандартный индикатор ZigZag. В нём имеется функция InitializeAll().

int InitializeAll()
{
   ArrayInitialize(ExtZigzagBuffer,0.0);
   ArrayInitialize(ExtHighBuffer,0.0);
   ArrayInitialize(ExtLowBuffer,0.0);
//--- first counting position
   return(Bars-InpDepth);
}

 Размер данным инициализируемым буферам не задаётся да момента их инициализации. Тогда какой резон их инициализировать? Я не представляю реализацию подобного алгоритма инициализации массива у которого нет чёткой длинны ! 

 
Может по вызову InitializeAll какая-то отложенная инициализация идет?
 
shanty:

Алексей, а разница то какая? Функция ArrayFill() тоже самое, что я по ходу придумал когда писал свой вопрос. Разница лишь в том, что в ArrayFill() имеется множество перегрузок и она универсальна. И не более того. А я изобразил, как это выглядит изнутри в плане одной перегрузки и всё... Где тут тупость то? :)

Идём дальше.. На самом деле, у меня буферы инициализируются не в ИНИТЕ. А написал я так сверху неподумав. Но это сути вопроса не меняется. Возьмём, например, стандартный индикатор ZigZag. В нём имеется функция InitializeAll().

 Размер данным инициализируемым буферам не задаётся да момента их инициализации. Тогда какой резон их инициализировать? Я не представляю реализацию подобного алгоритма инициализации массива у которого нет чёткой длинны ! 

Разница вот такая



И чушь это далеко не всегда тупость.

Я никогда не смотрел ZigZag, но судя по индикатору хуйкинАши, даже в базовых индикаторах МТ такой чуши можно встретить, что крышу трудно удержать чтобы не съехала.

 
RickD:
Может по вызову InitializeAll какая-то отложенная инициализация идет?
Ну так загляните, и проверьте это.. )
 
AlexeyVik:

Разница вот такая

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

Хотя, нам то какая разница. Вопрос не в том. Инициализация произойдёт как у меня заданным числом, так и при помощи ArrayFill(). Но я спрашивал  о том, зачем массив, размер которого не задан, инициализировать некоторым значением. Смысл в этом какой? Я это, кстати, не у метаквотовцев изначально встретил в терминале (эти индюки я особо не копал, т.к. мне не нравится как они написаны), а у некоторых других авторов, к которым я отношусь весьма положительно, за их профессионализм. Но как бы то ни было, инициализация часто реализуется. Зачем это делается?

 
shanty:

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

Хотя, нам то какая разница. Вопрос не в том. Инициализация произойдёт как у меня заданным числом, так и при помощи ArrayFill(). Но я спрашивал  о том, зачем массив, размер которого не задан, инициализировать некоторым значением. Смысл в этом какой? Я это, кстати, не у метаквотовцев изначально встретил в терминале (эти индюки я особо не копал, т.к. мне не нравится как они написаны), а у некоторых других авторов, к которым я отношусь весьма положительно, за их профессионализм. Но как бы то ни было, инициализация часто реализуется. Зачем это делается?

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

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

 
AlexeyVik:

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

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

На самом деле все проще. Это задание значения по умолчанию. Вот если в start() или onCalculate() делать инициализацию. Хотя и делается она там по другому
 
shanty:
Ну так загляните, и проверьте это.. )

А не проверить однозначно. Разработчики знают наверняка.

Есть вариант. Вызывать ArrayInitialize в OnCalculate при prev_calculated = 0

Причина обращения: