Обновление платформы MetaTrader 4 билд 625: Журналы в MetaTrader Market и новый MetaViewer - страница 35

 
Sergey_Mechanic:


Вы вопрос читали, на который я отвечал? ) Там ничего не было про константные структуры, которые вообще нельзя изменить (потому что константные), соответственно и обнулить - тоже. Мой ответ никак не претендовал на универсальность, он относился к конкретному случаю, о котором спросил VOLDEMAR: как попроще инициализировать нулями структуру сразу после создания. В его случае это проще всего сделать прямым обнулением памяти.

С "проще" для данного вида объектов - не спорю.

Sergey_Mechanic:


В студии:

Результат:

Впрочем, я согласен, что это неправильно.

Тут важно описание функции прочитать. ZeroMemory() в "студии" - совсем не то, что в MQL4.

В "студии" ZeroMemory() "Fills a block of memory with zeros". И - всё, без вариантов. Блок памяти рассматривается как обезличенный, никак не структурированный, неконстантный блок памяти, адрес которого передаётся функции.

void ZeroMemory(
  [in]  PVOID Destination,
  [in]  SIZE_T Length
);

Поэтому в "студии" - всё правильно, поскольку в неструктурированном обезличенном блоке памяти не может быть никаких константных полей, хотя, вопрос, насколько правомерно в C++ неявное приведение типа "S *" к "void *" при наличии в структуре S константных полей - это вопрос открытый.

А в MQL4 передаётся не адрес памяти, а ссылка на переменную, и действия ZeroMemory() сильно зависят от того, ссылка на какого типа переменную ей передана. И эта функция в MQL4, например, не испортит объект полиморфного класса (разве что, по случаю bug'а в своей реализации), а в MQL4, насколько я помню, все классы полиморфны, то есть, используют механизм виртуальных функций.

В C++ же попытка обнулить объект полиморфного класса приведёт к краху программы, поскольку обнулятся также скрытые поля объекта, добавленные компилятором и используемые сгенерированным им же кодом, также добавленным для организации работы механизма виртуальных функций.

Поэтому нельзя просто так сравнивать ZeroMemory() из MQL4 и из "студии". Но, коль скоро ZeroMemory() из MQL4 ведёт себя "полиморфно" и интеллектуально в зависимости от типа объекта, то изменение ею константных полей является ошибкой.

Ещё раз, на всякий случай: с "проще" по поводу неконстантной структуры, у которой все поля являются неконстантными, - не спорю. :)

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

 
simpleton:

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


Вот только лингвистических споров нам тут не хватало. :) Инициализация - это присвоение начальных значений. А полезность чего-либо определяется уместностью его использования, эдак ведь и с полезностью молотка можно поспорить: может палец отбить, может на ногу упасть... :)

За сим, пошёл пить кофе. :)

 

Вопрос задавал на другой ветке, никто не ответил.

Нужны классы Trade.mqh, SymbolInfo.mqh, DealInfo.mqh из MQL5 в MQL4. Пробовал скомпилировать их в MQL4 выходит куча ошибок.

Скажите, возможно ли их включить в четверку? Планируется ли разработчиками подключить данные классы в последующих обновлениях MQL4?

 
А "Presets" всё же теряется при обновлении.
 
Sergey_Mechanic:


Вот только лингвистических споров нам тут не хватало. :) Инициализация - это присвоение начальных значений. А полезность чего-либо определяется уместностью его использования, эдак ведь и с полезностью молотка можно поспорить: может палец отбить, может на ногу упасть... :)

За сим, пошёл пить кофе. :)


Какой же он лингвистический?

Инициализация - это задание начальных значений в момент создания переменной. Переменная создаётся, и один из этапов при её создании состоит в задании для неё начальных значений. Присвоить ещё не созданной переменной ничего нельзя.

Присвоение - это изменение значений уже существующих полностью созданных (сконструированных) переменных, если под изменением подразумевать в том числе и присвоение того же самого значения, которое переменная имела до присвоения.

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

И не случайно при инициализации объекта вызывается не что иное, как конструктор копирования, а при присвоении - именно "operator =":

#property strict

struct A {
  A() { Print("A()"); }
  A(const A &a) { Print("A(A const &)"); }
  void operator =(const A &) { Print("void operator =(A const &)"); }
};

void OnStart() {
  Print("Creation"); A a1;
  Print("Initialization"); A a2 = a1;
  Print("Assignment"); a2 = a1;
}

Лог:

00:28:34 Script 1 EURUSD,H1: loaded successfully
00:28:34 1 EURUSD,H1: initialized
00:28:34 1 EURUSD,H1: Creation
00:28:34 1 EURUSD,H1: A()
00:28:34 1 EURUSD,H1: Initialization
00:28:34 1 EURUSD,H1: A(A const &)
00:28:34 1 EURUSD,H1: Assignment
00:28:34 1 EURUSD,H1: void operator =(A const &)
00:28:34 1 EURUSD,H1: uninit reason 0
00:28:34 Script 1 EURUSD,H1: removed

Какая уж тут лингвистика?

Если и пытаться провести аналогию с молотком, то насколько полезен такой молоток, который гвозди некоторых типов забивает нормально, без последствий для гвоздей, а гвозди некоторых других типов после забивания молотком оказываются забитыми, но при этом "чудесным образом" разорваны внутри доски на несколько частей?

 
Y.A.K._:
А "Presets" всё же теряется при обновлении.

Более того файлы *.ini в папке config при обновлении пришли в исходное состояние, потеряв, в том числе, номера счетов и пароли. Хорошо что вовремя заметил при обновлении одного терминала и скопировал заранее до обновления папки config и mql4 всех установленных терминалов.
 
Посылаю сообщение на почтовый ящик (скрипт из одной строчки)
   SendMail("Эксперимент","Первая строка\nVtoraya stroka");

Приходит следующее письмо

тема письма:

Эксперимент

cодержание письма:

Oepb` qrpnj`

Vtoraya stroka

Почему в теле письма русские буквы выходят абракадаброй?

 
agvozdezkiy:
Посылаю сообщение на почтовый ящик (скрипт из одной строчки)

Приходит следующее письмо

тема письма:

Эксперимент

cодержание письма:

Oepb` qrpnj`

Vtoraya stroka

Почему в теле письма русские буквы выходят абракадаброй?


Попробуйте так

SendMail("Эксперимент","Первая строка","\n","Vtoraya stroka");
 
Не замечал раньше. Если изменить параметры эксперта, уже размещённого на графике, функция OnInit() вызывается два раза подряд. Так задумано или баг? Если в ней есть диалоговые окна (уведомляющие о неверных входных параметрах, например), они тоже выскакивают дважды. Это для тех, кто с первого раза не понял, да? :)
 
VOLDEMAR:


Попробуйте так


Все то же. И в аллертаках такая же ерунда: в теме русский текст нормально выглядет, в теле письма крокозяблами. Кто сталкивался? Это баг МТ или в чем-то ином проблема?
Причина обращения: