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

 
Ilyas:

На выполнении будет критическая ошибка выполнения, подобная делению на ноль.


И все-таки, несмотря на UB, почему умножение INT_MIN на -1 не выдает ошибки и возвращает INT_MIN, а деление на -1 - критическая ошибка и возвращает 0

 
mktr8591:

И все-таки, несмотря на UB, почему умножение INT_MIN на -1 не выдает ошибки и возвращает INT_MIN, а деление на -1 - критическая ошибка и возвращает 0

проверил поведение в VS2019 на С++, тоже ошибка переполнения 

это довольно сложный вопрос, прогуглил: " C++ integer overflow "

все ответы крутятся вокруг знаковых и беззнаковых целых чисел, но пока сам не разобрался

 
Igor Makanu:

проверил поведение в VS2019 на С++, тоже ошибка переполнения 

это довольно сложный вопрос, прогуглил: " C++ integer overflow "

все ответы крутятся вокруг знаковых и беззнаковых целых чисел, но пока сам не разобрался

Ошибка переполнения - это конечно. Но если в mql нет обработки исключений, то желательно в данном случае ее подавлять.

Иначе при делении целых чисел придется везде проверять не только делитель на 0, но и делимое на INT_MIN/LONG_MIN.

P.S. хотя если это UB, то в любом случае надо проверять. Запутался я уже ((((.
 
mktr8591:

Ошибка переполнения - это конечно. Но если в mql нет обработки исключений, то желательно в данном случае ее подавлять.

Иначе при делении целых чисел придется везде проверять не только делитель на 0, но и делимое на INT_MIN/LONG_MIN.

P.S. хотя если это UB, то в любом случае надо проверять. Запутался я уже ((((.

вот неплохо написано: https://habr.com/ru/company/ruvds/blog/551216/

хотя почему деление вызывает переполнение..... ну в общем вот такая реализация, хотя в теории должно бы и работать INT_MIN / -1    

в общем какая-то магия со знаковыми int

 
Igor Makanu:

вот неплохо написано: https://habr.com/ru/company/ruvds/blog/551216/

Да, читал.

Причины понятны. Вопрос как с этим жить без гемороя.

 
mktr8591:

Да, читал.

Причины понятны. Вопрос как с этим жить без гемороя.

проверил совет из статьи, на Вашем примере

void OnStart()
{
   int min = INT_MIN;
   long i = (min + 0u) / -1;
   Print("i = ", i);
}

так работает при компиляции по F5

 
Как сделать для профайлера соответствующее значение входного параметра?
#ifdef _RELEASE
  input string inFileName = NULL; // Set-file
#else // #ifdef _RELEASE
  input string inFileName = "Profiler.txt"; // Set-file
#endif // #ifdef _RELEASE #else
 
Нет предупреждения.
void OnStart()
{
  int i = 0;
  
  if (i != i) // Нет предупреждения о невыполнимости условия.
    ;
}
 
fxsaber:
Нет предупреждения.

А можете пояснить, почему должно быть предупреждение?

 
Alexey Viktorov:

А можете пояснить, почему должно быть предупреждение?

+ мне тоже интересно, почему?

Причина обращения: