mql5语言的特点、微妙之处以及技巧 - 页 214

 
fxsaber #:

我以前没有遇到过这样的条目。

使用它)))

 
Vladimir Simakov #:

使用它))))

弗拉基米尔,你从哪里得到这样的方案?,我当时得到了帮助,在我的主题是寻找酒吧,最小的周期,是否有一个现成的图像的地方? 我是自学成才的,在一个不同的配置文件原来

只是把逻辑电路放在一起,加起来,在循环中滚动......。
 
Vladimir Simakov #:

嗯,这是一个凶猛的错误。例子。

内存被分配,当它被释放时,析构器被调用(这是根据RAII的预期行为的提示),但是当对象被创建 时,构造器被忘记调用))。

这是第2个{}错误。

关于交易、自动交易系统和策略测试的论坛

mql5的特殊性,技巧和窍门

A100, 2021.11.16 13:43

F5挂起。另外, 也是一个 矛盾的 解决方法

提醒:第1次有盘旋,第3次有联合

 
Vladimir Simakov #:

利用优势)))

哦,那些增员后的轻声细语...。)
 
Fast235 #:

弗拉基米尔,你从哪里得到这样的方案?,我当时在寻找酒吧的话题中得到了帮助,通过最小的周期,在某个地方有现成的图像吗? 我是自学成才的,在一个不同的配置文件中,原来

只要把逻辑电路放在一起,把它们加起来,通过循环滚动...

不要在不了解的情况下使用这样的东西,出了现成的。有了这样的记录,如果你需要比这里更复杂一点的东西,虫子,不一定容易找到,你可以在瞬间填满))))。

 
Vladimir Simakov #:

不要在不了解的情况下使用这样的东西,现成的。有了这样的记录,如果你需要比这里更复杂一点的东西,你可以在瞬间做出bug,并不总是容易找到的))))。

你对酒吧的搜索,是用枚举和模板))。

我几乎把模板推迟了很久,但我在大约一个小时内就进入了它们。

把它们和枚举一起从代码中拿出来,你可能有一个更严肃的任务来使用它们

--

增加

这一切都在论坛上,只是谢谢你。

 
Vladimir Simakov #:

嗯,这是一个凶猛的错误。例子。

内存被分配,释放内存时调用析构器(这暗示了根据RAII的预期行为),但在创建对象 时忘记调用构造器))。

谢谢你的帖子。
纠正了。

这段代码将导致编译错误,因为MQL中的初始化序列仍然不完整。

对于结构,通过序列初始化没有被带有相关参数的构造函数调用所取代--我们正计划增加这一点(目前无限期推迟,但一些新代码已经 "泄露 "到生产中)。



 

@A100

关于交易、自动交易系统和交易策略测试的论坛

mql5的特殊性,技巧和窍门

A100, 2021.11.16 13:43

这没有意义,因为。

struct X {
    int i;
};
void OnStart()
{
    X x[200000] = {};
}

F5挂断电话。另外,这也是一个矛盾的 解决方法。


关于交易、自动交易系统和交易策略测试的论坛

mql5的特殊性,技巧和窍门

fxsaber, 2021.11.17 02:07

struct MqlTick2 : private MqlTick {};

void OnStart()
{
  MqlTick2 Ticks[4] = {}; // OK
  
  ZeroMemory(Ticks); // 'Ticks' - not allowed for objects with protected members or inheritance
}

关于交易、自动交易系统和交易策略测试的论坛

mql5的特殊性,技巧和窍门

A100, 2021.11.17 02:20

你自己犯了第四个错误。为什么ZeroMemory比{}差?也就是说,我们有一些未经批准的对私有的访问机制,而编译器由于某种原因无法检测到。

你认为开发商不会解决这个问题吗?从前,编译器对ZeroMemory没有反应


如果你记得mql是从C++中衍生出来的,这两个例子(它们的对应物)在那里都很好用,因为这些类没有构造函数(即隐式构造函数)。

  • 声明ClassX x[n]={};的结果是对数组的每个元素进行值初始化
  • 如果ClassX没有自定义构造函数(但有一个默认的未设置的构造函数),那么类对象的零初始化就完成了--不管是否有私有字段。
  • 但如果有常量字段,默认构造函数将被隐式删除,所以编译器错误。

在C++中的例子。

#include <iostream>
using namespace std;

class X
{
    int a;
    public:
    int get(){return a;}

    //X(){}   //так массив x не обнуляется
    //а если нет конструктора - то обнуляется
};

int main()
{
    X x[10]={};
    for (int i=0; i<10;i++)   cout<<x[i].get()<<endl;
}

因此,如果结构/类中没有常量字段,那么逻辑是正确的。

 
我忘了补充,如果一个类有非琐碎的字段(对象),其默认的c-tor将在整个对象的零init后为这类字段调用。
 
fxsaber #:

我以前没有见过这样的记录。

我看了看我在MQL5中的研究,可能更糟糕,我甚至在指标中抽出了几个TF的历史。

void FindHighLow(THL &hl[], const ENUM_TIMEFRAMES tf, const datetime start_time, const int sz_buf = 1000)
{
   ZeroMemory(hl);//hl структура
   datetime st = start_time;
   MqlRates rates[];
   for(int i = 0, c = CopyRates(_Symbol, tf, st, sz_buf, rates); ArraySize(rates) > 0 && i < ArraySize(hl);
         st = rates[0].time - PeriodSeconds(tf), c = CopyRates(_Symbol, tf, st, sz_buf, rates))
   {
        for(int j  = ArraySize(rates) - 1; j >= 0 && i < ArraySize(hl); j--)
      	{
		....	
	}
   }


我可以在for语句中写很多东西 ))))