КАЗНИТЬ - НЕЛЬЗЯ - ПОМИЛОВАТЬ или особенности использования функции StringConcatenate()

 

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

Ниже приведен код, который компилируется без ошибок

//+------------------------------------------------------------------+
//|                                                            1.mq5 |
//|                      Copyright © 2014, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#property indicator_chart_window
#property indicator_plots   0


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   string name; 
   
   StringConcatenate(name,    "КАЗНИТЬ"    "-"    "НЕЛЬЗЯ"   "-"   "ПОМИЛОВАТЬ", "!");


   Print(name);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
// return value of prev_calculated for next call
   return(rates_total);
  }
Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
Eugene Myzrov:

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

Ниже приведен код, который компилируется без ошибок

И что же распечаталось?? Пустая строка? Ведь функция используется так

string name = "тест: ";
string result = StringConcatenate(name,    "КАЗНИТЬ"    "-"    "НЕЛЬЗЯ"   "-"   "ПОМИЛОВАТЬ", "!");
Print(result);

Забыл, как из вкладки эксперты правильно скопировать, чтобы не было таких кракозябр?

2016.02.08 12:35:52.809 sss EURUSD.e,M1: òåñò: ÊÀÇÍÈÒÜ-ÍÅËÜÇß-ÏÎÌÈËÎÂÀÒÜ!

 



 
Alexey Volchanskiy: И что же распечаталось?? Пустая строка? 

В журнале оказалась ожидаемая строка, так как будто бы в исходном коде был корректный вызов функции StringConcatenate(), т.е.


     КАЗНИТЬ-НЕЛЬЗЯ-ПОМИЛОВАТЬ!
 
Alexey Volchanskiy: Ведь функция используется так
string name = "тест: ";
string result = StringConcatenate(name,    "КАЗНИТЬ"    "-"    "НЕЛЬЗЯ"   "-"   "ПОМИЛОВАТЬ", "!");
Print(result);

Нет, не так, Вы привели пример на MQL4, я же обнаружил эту особенность в MQL5, там эта функция вызывается по-другому, в MQL4 не проверял.
 
Eugene Myzrov:
Alexey Volchanskiy: Ведь функция используется так
Нет, не так, Вы привели пример на MQL4, я же обнаружил эту особенность в MQL5, там эта функция вызывается по-другому, в MQL4 не проверял.
Нет ни какой особенности, у вас в примере две запятых
 
Alexey Volchanskiy:

И что же распечаталось?? Пустая строка? Ведь функция используется так

Забыл, как из вкладки эксперты правильно скопировать, чтобы не было таких кракозябр?

2016.02.08 12:35:52.809 sss EURUSD.e,M1: òåñò: ÊÀÇÍÈÒÜ-ÍÅËÜÇß-ÏÎÌÈËÎÂÀÒÜ!

 



Копируй при русской раскладке
 
Artyom Trishkin:
Копируй при русской раскладке
2016.02.08 12:35:52.809 sss EURUSD.e,M1: тест: КАЗНИТЬ-НЕЛЬЗЯ-ПОМИЛОВАТЬ!

Точно! Помню, какая-то фишка есть, а забыл какая. У меня инглиш по умолчанию 


 
pako: Нет ни какой особенности, у вас в примере две запятых

в справочнике по MQL5 сказано, что аргументами функции StringConcatenate() являются:

[in]  Любые значения, разделенные запятыми. От 2 до 63 параметров любого простого типа.


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

 string name; 
   
 StringConcatenate(name, "КАЗНИТЬ", "-", "НЕЛЬЗЯ", "-", "ПОМИЛОВАТЬ", "!");
 
Eugene Myzrov:

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

Ниже приведен код, который компилируется без ошибок

В справке это поведение явно описано

Длинные константные строки для удобства чтения исходного кода можно разбивать на части без операции сложения. Эти части при компиляции автоматически соберутся в одну длинную строку:

 
Eugene Myzrov:

в справочнике по MQL5 сказано, что аргументами функции StringConcatenate() являются:

[in]  Любые значения, разделенные запятыми. От 2 до 63 параметров любого простого типа.


Так что получается, что должно быть не 2, а 6 запятых

Должно быть не меньше одной запятой

одно значение может быть один знак, другое может быть сто знаков 

 
Slawa: В справке это поведение явно описано. Длинные константные строки для удобства чтения исходного кода можно разбивать на части без операции сложения. Эти части при компиляции автоматически соберутся в одну длинную строку:
   Ну вот все и стало на свои места. Сорри, давно не читал документацию...
Причина обращения: