Новая версия платформы MetaTrader 5 build 2085: Интеграция с Python и массовые улучшения в тестере стратегий - страница 17

 
Ilyas:

Вопрос по компилятору.

double f()
{
  return(0 ? 0 : MathRand()); // Заменит ли компилятор это на return(0) ?
}

double g()
{
  return(0 * _Point); // А это?
}
 
fxsaber:
return(0 ? 0 : MathRand()); // Заменит ли компилятор это на return(0) ?
Результатом этого выражения будет MathRand(), а не 0
 
Alexey Navoykov:
Результатом этого выражения будет MathRand(), а не 0

Да, перепутал. Спасибо. Думаю, смысл вопроса все равно понятен.

 
fxsaber:

Да, перепутал. Спасибо. Думаю, смысл вопроса все равно понятен.

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

А меня вот интересует возможность применения тернарного оператора в constexpr-выражениях.  Сейчас компилятор не даёт его так использовать:

int array[true ? 2 : 1];  // '[' - invalid index value

Приходится городить огород с кучей математических операций.

 

Зачем здесь выдаётся предупреждение?

bool a() { return false; }
bool b() { return false; }
bool c() { return false; }
bool d() { return false; }

void OnStart()
{
  a() && b() && c() && d(); // expression has no effect
}

Данная запись абсолютно нормальна.  Гораздо удобней, чем громоздить такое:

if (a()) if (b()) if (c()) d();

В Visual Studio нет никаких предупреждений.  Потому как результат каждой функции используется для определения дальнейшего поведения алгоритма.  Это же касается и тернарного оператора.  А предупреждение должно выдаваться только если значения никак не используются (т.е. математические операции и др.)

Иначе тогда предупреждения нужно выдавать и при вызове отдельных функций:  a();   b();   Ведь их результаты вообще никак не используется.

 
Alexey Navoykov:

Зачем здесь выдаётся предупреждение?

Данная запись абсолютно нормальна.  Гораздо удобней, чем громоздить такое:

В Visual Studio нет никаких предупреждений.  Потому как результат каждой функции используется для определения дальнейшего поведения алгоритма.  Это же касается и тернарного оператора.  А предупреждение должно выдаваться только если значения никак не используются (т.е. математические операции и др.)

Иначе тогда предупреждения нужно выдавать и при вызове отдельных функций:  a();   b();   Ведь их результаты вообще никак не используется.

не вижу ни какого смысла в такой строке

void OnStart()
{
  a() && b() && c() && d(); // expression has no effect
}


кроме того, предупреждения выдает не IDE, а компилятор, смею предположить, в VS у вас используется компилятор от Microsoft, а тут собственная разработка, основанная вероятно на каких то открытых исходниках, может даже gcc, хотя не факт

 

как эту лабуду привести к нормальному виду ?где кнопка индикаторы? куда тут тыкать? помогите народ

 
Yury Stukalov:

как эту лабуду привести к нормальному виду ?где кнопка индикаторы? куда тут тыкать? помогите народ

Visualize indicator on a chart - в левой колонке вторая сверху синяя строчка.

Либо просто киньте драг-дропом индикатор на окно тестера

 
fxsaber:

Вопрос по компилятору.

Да, если первый пример исправить, то компилятор вырезает всё оставляя только return(0);

 
Alexey Navoykov:

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

А меня вот интересует возможность применения тернарного оператора в constexpr-выражениях.  Сейчас компилятор не даёт его так использовать:

Приходится городить огород с кучей математических операций.

Спасибо за сообщение, видимо где -то я пропустил вызов свёртки константных выражений - буду разбираться


ИСПРАВЛЕНО
Причина обращения: