Новая версия платформы MetaTrader 5 build 2980: Push-уведомления о торговых операциях - страница 56

 
Artyom Trishkin #:

В контекстном меню файла в редакторе вместо пункта меню "Сравнить ревизии" случайно нажал на "Удалить файл/папку из хранилища":


и файл без предупреждения был удалён из хранилища. Мало того, он был удалён и из локального расположения! А это в корне не правильно.

Благо код остался в редакторе во вкладке и был успешно пересохранён. Но такие действия неверны - удаление необходимо подтвердить.

Тем более, если удаляется ещё и с моего накопителя (зачем??!!).

При этом потеряна вся версионность - ведь из хранилища-то файл был удалён. А мне необходимо было всего лишь поглядеть изменения...

С этим нужно решить вопрос простым окном подтверждения действий.

Неоднократно просил изменить поведени клавиши Del в метаедиторе при фокусе мышки в навигаторе - без запроса подтверждения удаляется текущая (селектированная ) директория или файл.

Запрос подтверждения удаления должен быть однозначно! 

 

b3042

template <typename T1, typename T2, typename T3>
T1 f11(T2 A, T3 B)
  {return T1(A + B);}

void OnStart()
  {
   Print(f11(1,2));     //3
  }


По F7 скрипт компилируется и выполняется без ошибок .

По F5 - "code generation error" и больше ничего.

 

Объясните, пожалуйста, как можно сделать функцию, которая принимает 2 аргумента шаблонного типа, производит арифметическую операцию, например, сложение (или деление), и возвращает результат?

Результат операции будет иметь старший из типов аргументов. Какого типа должна быть функция, чтобы корректно его вернуть?

Пробую делать так:

template <typename T1, typename T2, typename T3>
T1 add(T2 A, T3 B)
  {return (A + B);}     //предупреждение  компилятора "implicit enum conversion"
// пробовал return T1(A + B);- предупреждения больше нет, но результаты те же

void OnStart()
  {
   long a = long(INT_MIN)-2;
   int b = 1;

   Print(add(a, b));                // 2147483647 (== INT_MAX)
   Print(typename(add(a, b)));      // unknown
  }

Пример должен возвращать long(INT_MIN-1), но по факту он конвертируется в int.

P.S. поправил комментарии в коде

 
Ilyas #:

Это сообщение от ядра базы, очень полезная фича при ошибках в SQL запросах.

Возможно сделаем функцию получения текста последней ошибки в ядре, вместо безусловного вывода в лог

Спасибо, очень полезная была бы возможность!

 
Artyom Trishkin #:

В претензиях

🤔
 
mktr8591 #:

По F7 скрипт компилируется и выполняется без ошибок .

Ваш пример противоречит Документации: "Каждый формальный параметр в определении шаблона должен хотя бы один раз появиться в списке параметров функции"

Вывод: либо документация неправильная, либо пример

Если компилятор такое компилирует, то странно, почему более простой пример у него вызывает ошибку:

template<typename T>
T f() { return 0; }
void OnStart()
{
   Print(f()); //Error: template mismatch
}
 
A100 #:

Ваш пример противоречит Документации: "Каждый формальный параметр в определении шаблона должен хотя бы один раз появиться в списке параметров функции"

Вывод: либо документация неправильная, либо пример

Спасибо!

Да, пропустил этот момент в справке.

Значит, компилятор не отлавливает эту ошибку. Даже когда по F5 выдается "code generation error"- не указано место в коде.


Значит, такую функцию сделать невозможно? :

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 2980: Push-уведомления о торговых операциях

mktr8591, 2021.09.24 18:09

Объясните, пожалуйста, как можно сделать функцию, которая принимает 2 аргумента шаблонного типа, производит арифметическую операцию, например, сложение (или деление), и возвращает результат?

Результат операции будет иметь старший из типов аргументов. Какого типа должна быть функция, чтобы корректно его вернуть?

Пробую делать так:

template <typename T1, typename T2, typename T3>
T1 add(T2 A, T3 B)
  {return (A + B);}     //предупреждение  компилятора "implicit enum conversion"
// пробовал return T1(A + B);- предупреждения больше нет, но результаты те же

void OnStart()
  {
   long a = long(INT_MIN)-2;
   int b = 1;

   Print(add(a, b));                // 2147483647 (== INT_MAX)
   Print(typename(add(a, b)));      // unknown
  }

Пример должен возвращать long(INT_MIN-1), но по факту он конвертируется в int.

P.S. поправил комментарии в коде


 
mktr8591 #:

Значит, такую функцию сделать невозможно? :

Явно при вызове можно указать add<long>, но в MQL почему то только  add<long,long,long> компилируется

 
A100 #:

Явно при вызове можно указать f<int>

попробовал вызов add<int>(a, b) - Ошибка компиляции : 'add' - wrong template parameters count.


Видимо, проще возвращать тип первого аргумента.

 
mktr8591 #:

попробовал вызов add<int>(a, b) - Ошибка компиляции : 'add' - wrong template parameters count.

В MQL почему то все типы аргументов нужно перечислять. В C++ достаточно только недостающие