Выпущена бета-версия MetaTrader 4 Build 582 с обновленным языком MQL4 и Маркетом приложений - страница 9

 
philips:


Ничего не понял. Если это какой-то ботанический стёб, то представим, что я оценил.

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


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

Сегодня после перезагрузки терминала (574) пропали данные о открытых счетах и в проводнике терминала пропали все загруженные советники и индикаторы.

Счета восстановил повторным вводом данных, а советники стали доступны после перенесения их в папку D:\Терминалы\Alpari\MQL4\Experts.

Вопрос: теперь храним экспертов в этой папке? Как в 509-м билде?

Или это временно?

 

MQ у вас полный бардак со строками (sting), который тянется со старого MT4:

void OnStart()
{
   if(true)
   {
      Alert("--------Test_1--------"); // Alert: false, false, false
      string name[3];
      for(int i = 0;  i < 3;  ++ i)
         Alert(name[i] == "");
      
   }
    
   if(true)
   {     
      Alert("--------Test_2--------"); // Alert: false, false, false
      string name[3] = {};
      for(int i = 0;  i < 3;  i++)
         Alert(name[i] == "");
   }
   
   if(true)
   {     
      Alert("--------Test_3--------"); // Alert: false
      string mes;
      Alert(mes == "");
   }  
   
   if(true)
   {     
      Alert("--------Test_4--------");
      // MessageBox:
      // Critical error while running script 'del USDCHF,H1'
      // Array out of range.
      // Continue in debugger?
      //            OK             Отмена
      string name[3] = {""};
      name[0] = "4";
      for(int i = 0;  i < 3;  i++)
         Alert(name[i] == "");
   }   
}
 

Такой код

        if (FileWriteInteger(M1Handle,BarOpenTime,LONG_VALUE) < 0) {
          Err=GetLastError();
          Print("New Bar M1 FileWriteInteger Error (",Err,"): ",ErrorDescription(Err));
        }
        FileFlush(M1Handle);
        M1FileSize = FileSize(M1Handle);
        FileWriteDouble (M1Handle,_Open,DOUBLE_VALUE);
        FileFlush(M1Handle);
        M1FileSize = FileSize(M1Handle);

FileWriteInteger в if'е не меняет результат FileSize, даже после FileFlush. Следующая операция правильно увеличивает размер файла.

Кстати, а насколько вообще нормально, что FileSize без FileFlush игнорирует дописывание файла? Казалось бы, хэндл всё-таки относится не к файлу на диске, а к объекту в памяти.

 
220Volt:

MQ у вас полный бардак со строками (sting), который тянется со старого MT4:


Скажите, где по-вашему полный бардак? Конкретно

Я здесь вижу только одну возможную ошибку

string name[3] = {""};

Несмотря на явное указание размерности 3, массив после инициализации содержит всего 1 элемент (тут мы будем разбираться, почему такое поведение)

 
stringo:


Скажите, C++ для вас эталон? Если да, то процитирую C++ стандарт:

8.5.1 Aggregates
1 An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no brace-or- equalinitializers
 for non-static data members (9.2), no private or protected non-static data members (Clause 11),
 no base classes (Clause 10), and no virtual functions (10.3).

7 If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member
 not explicitly initialized shall be initialized from an empty initializer list (8.5.4). [ Example:
 struct S { int a; const char* b; int c; };
 S ss = { 1, "asdf" };
 initializes ss.a with 1, ss.b with "asdf", and ss.c with the value of an expression of the form int(),
 that is, 0. —end example ]
 
220Volt:


Скажите, C++ для вас эталон? Если да, то процитирую C++ стандарт:


C++ для меня не является эталоном.

Тут есть один нюанс. В MQL4 тип данных string является базовым и не имеет аналога в C/C++.

Тем не менее по аналогии с C/C++ переменная типа string инициализируется нулями. Но эти нули не означают строку нулевой длины ("") и никогда не означали. Это означает совершенно определённую non-initialized string (в терминах MQL II, MQL4 и MQL5).

Между прочим, в MQL5 и новом MQL4 можно явно проинициализировать переменную типа string значением non-initialized string (в старом MQL4 это делалось только неявно, при отсутствии инициализатора)

string some_string=NULL;
 
Вряд ли у меня есть шанс что-то доказать, если у вас уникальные правила. Но по правилам C++ даже у базовых типов есть initializer list конструктор: int {} == 0 ... . Какое значение должно быть у string {} ? По-моему очевидно == "".
 
220Volt:
Вряд ли у меня есть шанс что-то доказать, если у вас уникальные правила. Но по правилам C++ даже у базовых типов есть initializer list конструктор: int {} == 0 ... . Какое значение должно быть у string {} ? По-моему очевидно == "".

Нет. Это не очевидно.

В документации описано внутреннее представление строки

Внутреннее представление - структура размером 8 байт. Первый элемент структуры - длинное целое, содержит размер распределенного для строки буфера. Второй элемент структуры - 32-разрядный адрес буфера, содержащего строку.


Обнулите структуру, получите размер буфера строки 0, адрес буфера строки NULL (это прямо соотносится с утверждением "даже у базовых типов есть initializer list конструктор: int {} == 0")
 
Это не мое дело как делать ваш компилятор, я не буду спорить. Но такое поведение очень не интуитивно.
Причина обращения: