Однократный расчет массива при оптимизации - страница 6

 
Alexey Viktorov:

Вот пример записи и чтения массива

Запусти дважды в режиме отладки и посмотри сколько времени тратится на запись и чтение массива. Первый запуск запишет массив в файл, а второй запуск прочтёт его и начнёт печатать даты из массива. Потом разберись с выделенной частью, надо убрать IS_DEBUG_MODE и надо-ли вставить в условие IsOptimization()

Спасибо!
 
Dmitry Fedoseev:

Есть функции, что-то типа FileWriteInteger(). Идентифицировать по расположению, переменная должна быть в начале файла, после ее прочтения указатель переместится на ее конец, т.е. на начало массива, после считывания массива указатель будет перед следующей переменной...

Скоро будет статья по работе с файлами. 

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

 

Попробовал объявить массив на глобальном уровне (код mql4)

datetime T[];

 в ините заполнить его

ArrayResize(T,40);
datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };

 при распринтовке в старте выводит дату 1971 года, то есть массив пустой

for (int x=0;x<=39;x++)
   {
   Print("T[x]=",T[x],"x=",x);   
   }

 Если заполнять массив в старте, то значения появляются. Может причина, в том , что массив по новой инициализирую datetaime, но без него не компилируется код?

Вообщем массив пропадает. Что делаю не правильно? 

 
forexman77:

Попробовал объявить массив на глобальном уровне (код mql4)

 в ините заполнить его

 при распринтовке в старте выводит дату 1971 года, то есть массив пустой

 Если заполнять массив в старте, то значения появляются. Может причина, в том , что массив по новой инициализирую datetaime, но без него не компилируется код?

Вообщем массив пропадает. Что делаю не правильно? 

посмотри warning которые высветил компилер.

ArrayResize(T,40);
datetime T[40]=

вот таким лёгким движением ты определил локальный массив T который по выходу из OnInit тю-тю..

 
Maxim Kuznetsov:

посмотри warning которые высветил компилер.

вот таким лёгким движением ты определил локальный массив T который по выходу из OnInit тю-тю..

Пишет, что на глобальном уровне уже есть)

 declaration of 'T' hides global declaration at line 40

Но, как сделать правильно. Раньше фигурными скобками не объявлял массив. Инициализировал нолем и размер устанавливал и дальше циклом заполнял. Тут, как-то по другому надо делать? 

Если в ините  datetime убираю, то не компилируется пишет две ошибки:

 '{' - expression expected

'=' - illegal operation use



 
forexman77:

Пишет, что на глобальном уровне уже есть)

 declaration of 'T' hides global declaration at line 40

Но, как сделать правильно. Раньше фигурными скобками не объявлял массив. Инициализировал нолем и размер устанавливал и дальше циклом заполнял. Тут, как-то по другому надо делать? 

Если в ините  datetime убираю, то не компилируется пишет две ошибки:

 '{' - expression expected

'=' - illegal operation use



объявление массива вместе с константной инициализаций можно (и нужно) было сделать на глоб.уровне.

datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };
void OnInit() 
{
 ....
}
 
forexman77:

Пишет, что на глобальном уровне уже есть)

 declaration of 'T' hides global declaration at line 40

Но, как сделать правильно. Раньше фигурными скобками не объявлял массив. Инициализировал нолем и размер устанавливал и дальше циклом заполнял. Тут, как-то по другому надо делать? 

Если в ините  datetime убираю, то не компилируется пишет две ошибки:

 '{' - expression expected

'=' - illegal operation use



через = массивы можно инициализовать только при объявлении. Как-бы пережиток C , но тут так принято :-)
 
Maxim Kuznetsov:

объявление массива вместе с константной инициализаций можно (и нужно) было сделать на глоб.уровне.

Да, попробовал работает. А без глобального уровня никак, просто это делал для снижения вычислительных затрат, чтобы один раз заполнить массив в ините и дальше использовать значения массива?

Хотя по логике переменные на глобальном уровне всегда неизменны, значит расчет производится один раз в начале программы?

 
forexman77:

Да, попробовал работает. А без глобального уровня никак, просто это делал для снижения вычислительных затрат, чтобы один раз заполнить массив в ините и дальше использовать значения массива?

Хотя по логике переменные на глобальном уровне всегда неизменны, значит расчет производится один раз в начале программы?

да, при подготовке бинарника ex4 ex5 к исполнению терминалом. Можете считать что просто ссылки перекидываются на описанный (и сохранённый внутри ex4/5 при компиляции) массив данных, а это очень быстро..
 
forexman77:

Пишет, что на глобальном уровне уже есть)

 declaration of 'T' hides global declaration at line 40

Но, как сделать правильно. Раньше фигурными скобками не объявлял массив. Инициализировал нолем и размер устанавливал и дальше циклом заполнял. Тут, как-то по другому надо делать? 

Если в ините  datetime убираю, то не компилируется пишет две ошибки:

 '{' - expression expected

'=' - illegal operation use



Да абсолютно не важно как массив заполняется. Просто надо поставить условие, если размер массива равен нулю, то его надо просчитать, заполнить и записать в файл. А в OnInit() по моему примеру попытаться прочесть в объявленный массив. Соответственно если есть файл массива, он прочитан, массив заполнен, то вновь пересчитываться и заполняться массив не будет.
Причина обращения: