Ошибки, баги, вопросы - страница 651

 
mql5:
Нет, это не только проблема 32битного терминала. Но на сегодня решение для 32битного готово, в 64битном пока остаётся ограничение по стеку в 256Кб.
Но если программист самостоятельно, через свойство, не укажет требуемый размер стека, то EX5 в терминале будет работать с размером стека по умолчанию ( 256Кб )

По поводу большого размера.
Под каждое объявление переменной внутри функции(кроме static переменных) отводится место на стеке, при этом выделение места на стеке под локальные переменные происходит при каждом вызове.

Поэтому если функция имеет локальные переменные размером в 64Кб, то стека хватит на 3 вложенных вызова, при 4 вызове произойдёт переполнение стека (т.к. часть стека уходит на внутренние нужды терминала). Поэтому если есть потребность в больших локальных данных, то лучше использовать динамическую память - при входе в функцию память под локальные нужды выделяется в системе (new, ArrayResize) и при выходе из функции производится удаление памяти (delete, ArrayFree).

Спасибо за подробное объяснение. Но у меня точно проблема не в этом. Я попробую написать тестового эксперта для выявления этой ошибки, так как та функция, из которой растут ноги уже найдена и там нет таких объёмов (64Кб - 256Кб). Ночью тогда вышлю эксперта в Сервисдеск с проблемной функцией.

 

Ещё вдогонку вопрос (и просьба освятить это в хелпе) о работе той же функции (CLBufferWrite()).

Если писать в буфер информацию непосредственно из индикаторного буфера с взведённым флагом ArrayIsSeries (==true), в каком направлении будет происходить чтение входного массива?

Подозреваю что флаг будет игнорироваться, и к тому же неясно с какого места будет читать? Указанное смещение будет таки отсчитываться от физического конца массива или от начала вовсе?

Я конечно пока на всяк случай на воду буду дуть (буду работать с ArrayIsSeries== false), однако всё же ?

 
На данный момент функционал работы с OpenCL буфером не полный и будет дополнен/дописан.
offset - в данных функциях действительно, смещение в байтах от начала OpenCL буфера, а переданный в функцию массив будет копироваться с нулевого элемента без учёта флага ArrayIsSeries.
 
mql5:
1.   На данный момент функционал работы с OpenCL буфером не полный и будет дополнен/дописан.
2.   offset - в данных функциях действительно, смещение в байтах от начала OpenCL буфера, а переданный в функцию массив будет копироваться с нулевого элемента без учёта флага ArrayIsSeries.

1.   Я кагбе так и подозревал...  :)

2.  Так.  Приплыли.  Значит напрямую писать из индикаторного буфера частями никак не получится (пока).  

По хорошему  нужно конечно же стартовые позиции делать подвижными и в источнике и в приёмнике. Вот как здесь:

int  ArrayCopy(
   void  dst_array[],       // куда копируем
   void  src_array[],       // откуда копируем
   int   dst_start=0,       // с какого индекса пишем в приемник
   int   src_start=0,       // с какого индекса копируем из источника
   int   cnt=WHOLE_ARRAY    // сколько элементов
   );

С индексированием (направление и единицы измерения (байты/элементы)) пожалуйста как-то аккуратнее в справке.  А то эта.. время сильно жалко.. :)))

--

Спасибо за ответ.  Я вапчета очень ценю ваши усилия по совершенствованию функционала.

Буду с нетерпением терпеливо ждать продолжения банкета. А пока придётся танцевать на острие кинжала. :)

 

Build  597 x64,   только что установился.

2012.02.23 21:43:24    OpenCLTest (EURUSD,M30)    SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:13    OpenCLTest (EURUSD,M30)    SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:12    OpenCLTest (EURUSD,M30)    SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:10    OpenCLTest (EURUSD,M30)    SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:09    OpenCLTest (EURUSD,M30)    SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:08    OpenCLTest (EURUSD,M30)    SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:07    OpenCLTest (EURUSD,M30)    SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 21:43:06    OpenCLTest (EURUSD,M30)    SaveBitmapToFile error opening 'Mandelbrot.bmp'

Раньше такого не было.

// Win7 x64

 
MetaDriver:

Build  597 x64,   только что установился.

Раньше такого не было.

// Win7 x64

Попробуйте перекомпилировать пример. Я проверил - у меня все работает.
 
Renat:
Попробуйте перекомпилировать пример. Я проверил - у меня все работает.

Уже сто раз перекомпилировал.  Щас перезагружусь ещё. 

 
MetaDriver:

... Щас перезагружусь ещё. 

Не, не помогло.

Renat:

...... Я проверил - у меня все работает.

Так у меня тоже работает.  Но раз в десять-сорок циклов вылетает така кака:

2012.02.23 23:16:44    OpenCLTest (EURUSD,M30)    SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 23:16:43    OpenCLTest (EURUSD,M30)    SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 23:16:42    OpenCLTest (EURUSD,M30)    SaveBitmapToFile error opening 'Mandelbrot.bmp'
2012.02.23 23:16:36    OpenCLTest (EURUSD,M30)    SaveBitmapToFile error opening 'Mandelbrot.bmp'
 
MetaDriver:

Не, не помогло.

Так у меня тоже работает.  Но раз в десять-сорок циклов вылетает така кака:

Тоже обнаружил.

Это от того, что идет работа с указанным файлом в двух разных потоках без синхронизации и периодически файл оказывается заблокированным:

  1. поток скрипта перезаписывает файл 10 раз в секунду (зависит от скорости карточки)
  2. чарт перезагружает картинку в своем потоке по запросу скрипта

Так как пример с картинкой был сделан лишь для демонстрации принципа работы с OpenCL, то это не является проблемой.

Документация по MQL5: Файловые операции / FileMove
Документация по MQL5: Файловые операции / FileMove
  • www.mql5.com
Файловые операции / FileMove - Документация по MQL5
 
Renat:

Так как пример с картинкой был сделан лишь для демонстрации принципа работы с OpenCL, то это не является проблемой.

Согласен.  К тому же всё равно уже пора сделать пересылку прямо в буфер объекта GraphLabel. :)
Причина обращения: