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

 
fxsaber:

Скажите, в чем потенциальная опасность ZeroMemory, что в этой ситуации происходит ошибка?

private/protected и const (в большей его части) исключительно для программистов, компилятор лишь помогает придерживаться наложенных на код ограничений

Классический пример:
   Вы используете чужую библиотеку, под капотом тяжёлый код со связями, несанкционированное изменение которых приведёт к сбою, поэтому создатель библиотеки прячет часть объекта в private, чтобы запретить незапланированные изменения.

 
Ilyas:

private/protected и const (в большей его части) исключительно для программистов, компилятор лишь помогает придерживаться наложенных на код ограничений

Классический пример:
   Вы используете чужую библиотеку, под капотом тяжёлый код со связями, несанкционированное изменение которых приведёт к сбою, поэтому создатель библиотеки прячет часть объекта в private, чтобы запретить незапланированные изменения.

Понял, Спасибо за подробное объяснение!

 

Похоже, что поле real_volume в структуре MqlRates хотя и имеет тип long, но не способно хранить значения в диапазоне всех значений long (по документации - 0x7FFFFFFFFFFFFFFF). В частности, если записать в поле 0x40000000000000A8 по факту запишется 0xA8. Речь про кастом-символы.

Где-нибудь указан реальный диапазон допустимых значений? В принципе, причин для того, чтобы не работать как обычному long-у нет - похоже на баг.

PS. по tick_volume наверно такая же проблема

 
 Подскажите, если есть, способ сохранить в индикаторе предыдущее значение строковой переменной после наступления события Init? Глобальные переменные терминала со string не работают. Если быть точнее, то в конце OnCalculate() нужно сделать prev_val=val и чтобы после Init prev_val сохранилась, а val могла бы, как обычно, принимать новое значение. Но не хотелось бы извращений типа создать объект на графике, обозвать его требуемым именем, а после Init считывать старое значение. Это как-то дико уродливо, хотя и возможно вроде... да и имя может потребоваться длинное, а у объектов оно сильно ограничено.
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные - Переменные - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
x572intraday:
 Подскажите, если есть, способ сохранить в индикаторе предыдущее значение строковой переменной после наступления события Init? Глобальные переменные терминала со string не работают. Если быть точнее, то в конце OnCalculate() нужно сделать prev_val=val и чтобы после Init prev_val сохранилась, а val могла бы, как обычно, принимать новое значение. Но не хотелось бы извращений типа создать объект на графике, обозвать его требуемым именем, а после Init считывать старое значение. Это как-то дико уродливо, хотя и возможно вроде... да и имя может потребоваться длинное, а у объектов оно сильно ограничено.

можно через ресурсы и юнионы сохранять и передавать между ТФ простые структуры или даже массивы простых структур. 

для этого вам понадобятся: 

template <typename T>
union
sizeof(T)
ResourceReadImage
ResourceCreate
ResourceFree
_UninitReason
для хранения строк придется использовать статический массив uchar фиксированного размера. (см. CharArrayToString, StringToCharArray)
 
Nikolai Semko:

можно через ресурсы и юнионы сохранять и передавать между ТФ простые структуры или даже массивы простых структур. 

для этого вам понадобятся: 

для хранения строк придется использовать статический массив uchar фиксированного размера. (см. CharArrayToString, StringToCharArray)

 Ещё вспомнилось — через файлы, но тоже не хотелось бы, поскольку способ не самый естественный.

 Спасибо, буду пробовать.

 
x572intraday:

 Ещё вспомнилось — через файлы, но тоже не хотелось бы, поскольку способ не самый естественный.

 Спасибо, буду пробовать.

Если SSD, то нормальный способ тоже.
 
x572intraday:

 Ещё вспомнилось — через файлы, но тоже не хотелось бы, поскольку способ не самый естественный.

 Спасибо, буду пробовать.

Если речь идёт об MT5, то существует ненулевая вероятность, что OnInit нового состояния индикатора будет вызван раньше, чем OnDeinit предыдущего состояния индикатора
 
Slava:
Если речь идёт об MT5, то существует ненулевая вероятность, что OnInit нового состояния индикатора будет вызван раньше, чем OnDeinit предыдущего состояния индикатора
Поэтому сохранение данных должно происходить не в OnDeinit, а сразу после изменения данных или по какому-нибудь событию.
В OnDeinit можно оставить только сохранение в файл в случае закрытия терминала.
 
Nikolai Semko:
Поэтому сохранение данных должно происходить не в OnDeinit, а сразу после изменения данных или по какому-нибудь событию.
В OnDeinit можно оставить только сохранение в файл в случае закрытия терминала.
Да