Ошибки, баги, вопросы - страница 3604

 
Volodymyr Zubov #:

А вам это зачем ?

Я думал, что это, скорее всего, невозможно, а оказалось, что возможно. Для этого и спрашивал - чтобы узнать что-то новое для себя.

[Удален]  
Vladislav Boyko #:

Это интересно, спасибо! А что это за синтаксис? Что-то типа разыменования?

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

Компилятор MQL часто делает его неявно, но в Вашем примере он этого делать не стал, так как существует конструктор с точно соответствующим типом аргумента.

 

Почему нет ошибки при компиляции, если я убираю скобку(красным цветом выделил)?

if(iClose(Symbol(),Signal_TF_RSI,1)<Price_RSI_Center && iOpen(Symbol(),Signal_TF_RSI,1) && iOpen(Symbol(),PERIOD_M1,0)<Price_RSI_Center_0)<Price_RSI_Center)SellNow=true;
 
Koldun Zloy #:

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

Компилятор MQL часто делает его неявно

Похоже, так делать потенциально опасно.

class A {};

void f( const A& ) { Print(__FUNCSIG__); }

void OnStart()
{
  A* a = new A;    
  
  f(*a); // Однозначно всегда.
  f(a);  // Может начать вызываться другая функция, если кто-то подключит ниже какой-нибудь #include.
  
  delete a;
}

// #include
void f( const A* ) { Print(__FUNCSIG__); }


Можно возразить, что это касается и простых типов (int->long и т.д.). Но в данном случае можно самому разыменовывать, и тогда не будет подобной проблемы.

 
Aleksey Vyazmikin #:

Почему нет ошибки при компиляции, если я убираю скобку(красным цветом выделил)?

если функция/метод нигде не вызывается, то "по мнению компилятора" и хрен с ней :-) детальный анализ по поводу ошибков производится не будет

возможно по { } компилятор сориентировался в графе вызовов и проигнорил

 
Aleksey Vyazmikin #:

Почему нет ошибки при компиляции, если я убираю скобку(красным цветом выделил)?

Потому что все правильно.

iOpen(Symbol(),Signal_TF_RSI,1 && iOpen(Symbol(),PERIOD_M1,0)<Price_RSI_Center_0)

Это третий входной параметр функции iOpen (слева).

[Удален]  
fxsaber #:

Похоже, так делать потенциально опасно.


Можно возразить, что это касается и простых типов (int->long и т.д.). Но в данном случае можно самому разыменовывать, и тогда не будет подобной проблемы.

Полностью согласен.

 
Maxim Kuznetsov #:

если функция/метод нигде не вызывается, то "по мнению компилятора" и хрен с ней :-) детальный анализ по поводу ошибков производится не будет

возможно по { } компилятор сориентировался в графе вызовов и проигнорил

fxsaber #:

Потому что все правильно.

Это третий входной параметр функции iOpen (слева).

А разве может быть параметр вообще иметь такой вид (A && B) и как это интерпретировать?

 
Aleksey Vyazmikin #:

А разве может быть параметр вообще иметь такой вид (A && B) и как это интерпретировать?

Логическое выражение.

bool A = 1;
bool B = iOpen(Symbol(),PERIOD_M1,0)<Price_RSI_Center_0;
bool C = A && B;

// iOpen(Symbol(),Signal_TF_RSI,1 && iOpen(Symbol(),PERIOD_M1,0)<Price_RSI_Center_0)
iOpen(Symbol(),Signal_TF_RSI,C)
 
fxsaber #:
Можно возразить, что это касается и простых типов (int->long и т.д.).

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

void OnStart()
  {
   int a = 1;
   f(a);       // void f(int)
   f((long)a); // void f(long)
  }

void f(int) { Print(__FUNCSIG__); }

void f(long) { Print(__FUNCSIG__); }