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

 

Имеются ошибки в стандартной библиотеке для MQL4, а конкретно в индикаторных классах.

Для класса CiATR отсутствует тело метода GetData.

Для индикаторов, использующих параметр типа ENUM_APPLIED_VOLUME (CiForce, CiOBV), выдаётся ошибка:  improper enumerator cannot be used

И кстати, ENUM_APPLIED_VOLUME вроде штатное перечисление, в документации MQL4 оно присутствует, но по факту его нет ( 'ENUM_APPLIED_VOLUME' - undeclared identifier ).

В общем, проверьте пожалуйста все ваши библиотеки. А то такое ощущение что их наспех перенесли с MT5, даже не проверив работоспособность.

 

Ошибка компиляции, build 966

#property library
#define CLR     C'255,255,255'//White

class A {
        A() { clr = CLR; }
        color clr;
};
в build 932 все нормально
 
A100:
После прямой подстановки код не компилится из-за коммента же
 

зависит от содержания комментария

#define CLR     C'255,255,255'//не White

все нормально 

 
Ну должно в любом случае не компилиться )
 

Комментарии никогда не подставляются - компилятор их просто игнорирует, иначе #define в большинстве случаев вообще нельзя бы было использовать с комментариями //

#define ONE 1 //один
#define TWO 2 //два

int a = ONE + TWO;
приводит к int a = 1 + 2;
а не к int a = 1 //один + 2 //два;
В любом случае в https://www.mql5.com/ru/forum/1111/page1190#comment_993854 замените // на /**/
#define CLR     C'255,255,255'/*White*/

Результат тот же - ошибка компиляции

 
Вроде раньше на странице чужого профиля можно было переключиться по ссылке на Ленту новостей (того юзера). Теперь такого линка не вижу, но если добавить в конце URL /news, то данная страница нормально открывается. Это баг что линк пропал из UI?
 
marketeer:
Объясните, плиз, следующую ситуацию. Есть мультивалютный индюк, значения которого НЕ меняются в зависимости от того, на какой чарт он наброшен - он считает значения по заданным инструментам и с текущим окном никак не связан. На это индюке я вручную наношу объекты - линии поддержки и сопротивления. Теперь фокус: если в окно перетащить из обзора рынка другой инструмент, то внешний вид индюка остается прежним, а линии пропадают. Если вызвать диалог Список объектов, то там эти объекты по-прежнему числятся. Значения конечных точек (даты и значения) остаются прежними (т.е. должны быть видимы на прежних местах) - это и понятно, их никто не менял. Однако линии не видны. Если затем перетащить на окно прежний инструмент, который был там изначально, линии снова становятся видны. В чем проблема?

Нашли и исправили.

Спасибо за обращение. Оказался родовой косяк - оно и раньше всегда так работало

 

Нельзя применить сокращенную запись operator !() - ошибка компиляции

class A {
public:
        bool operator !() { return ( false ); }
};

bool f1( A* a ) { return ( f3( a ) ); }
bool f2( A* a ) { return ( !a ); }             //ошибка компиляции
bool f3( A* a ) { return ( a.operator!() ); }  //нормально
bool f4( A& a ) { return ( !a ); }

void OnStart()
{
        A *a = new A;
        Print( f1( a ));
        Print( f4( a ));
}

Если компилятор понимает (а он понимает), что f4( a ) означает, что в качестве 'а' имеется ввиду объект, а не указатель\описатель - как число)

то он должен и понимать, что !a означает для 'a' то же самое  (объект, а не указатель\описатель - как число) 

иными словами, если

class A {
    void f() {}

void OnStart()
{
        A a1;
        A *a2 = new A;
        a1.f();
        a2.f();
}
запись a1.f() и a2.f() означает одно и тоже, вне зависимости от того a1, a2 - это указатель или объект - то чем operator !() - хуже?
 

дополню, что например с operator+() - ошибки компиляции не возникает, также не возникает ее, если к первому примеру выше просто добавить operator+(), который вообще не используется

class A {
public:
        bool operator !() { return ( false ); }
        bool operator +() { return ( false ); }
};
но тогда возникает другая неопределнность
class A {
public:
        bool operator !() { return ( true ); }
        bool operator +() { return ( true ); }
};

int g( A& a )  { return ( 10 ); }
int g( int )   { return ( 20 ); }

void OnStart()
{
        A *a = new A;
        Print( !a );            //здесь    считает                 'a' - числом ???
        Print( a.operator!() ); //здесь не считает (что правильно) 'a' - числом
        Print( g( a ) );        //здесь не считает (что правильно) 'a' - числом, хотя есть g( int ) и нет g( A* )
}
Причина обращения: