错误、漏洞、问题 - 页 1172

 

在MQL4的标准 库中存在错误,特别是在指标类中。

对于CiATR 类,缺少GetData方法的主体。

对于使用ENUM_APPLIED_VOLUME类型参数的指标(CiForceCiOBV)有一个错误:不能使用不适当的枚举器。

顺便说一下,ENUM_APPLIED_VOLUME似乎是一个标准的枚举;它出现在MQL4文档中,但事实上它是不存在的('ENUM_APPLIED_VOLUME' - 未声明的标识符)。

因此,请检查你所有的图书馆。我感觉它们是从MT5匆忙移植过来的,甚至没有检查它们的功能。

 

编译错误,构建966

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

class A {
        A() { clr = CLR; }
        color clr;
};
构建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,这个页面就能正常打开。链接从用户界面上消失了,这是一个错误吗?
 
marketeer:
请解释以下情况。我有一个多货币指标,它的值不会因为它连接在什么图表上而改变--它为指定的工具计算值,与当前窗口无关。我在这个指标上手动画出支撑线和阻力线。现在的诀窍是:如果我从市场概览中拖动另一个工具到窗口,指标的外观保持不变,线条消失。如果你打开 "对象列表"对话框,那些对象仍然被列在那里。端点值(日期和数值)保持不变(即应该在相同的地方可见)--这是可以理解的,没有人改变它们。然而,这些线条是不可见的。如果你再把原来的工具拖到窗口上,线条又变得可见了。问题是什么?

发现并纠正了。

谢谢你与我联系。结果发现是一个通用的错误--以前一直是这样工作的。

 

你不能应用缩写运算符!() -编译错误

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'对'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+(),也不会有编译错误

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* )
}