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

 
fxsaber #:
这是一个有趣的结果。

奇怪的是,它还没有被修复:

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

错误、错误、问题

A100, 2020.08.01 05:42

执行过程中出错:
template<typename T>
void f( T ) { Print( __FUNCTION__); }
void OnStart()
{
        {
                f<ulong>( 1 );
        }
}

Result: OnStart::unnamed#00000216656562DC80::f<ulong>

预期: OnStart::f<ulong


 
fxsaber #:
编译器限制。

这是一个明显的缺陷--我认为编译器应该召集一个医疗小组来处理这样的代码了

从假设上讲,嵌套宏中的括号可以有这样的数量,但大括号不行。
 
结构/类对象的字段初始化顺序取决于字段的相互排列,而不是构造函数之后的条目,请问这种行为是否正确?
struct A
{
  int Count;
  
  A() : Count(0) {}
};

struct B : public A
{
  int i, j; // Единственная строка, отличающая от C.

  B() : i(this.Count++), j(this.Count++) {}
};

struct C : public A
{
  int j, i; // Единственная строка, отличающая от B.

  C() : i(this.Count++), j(this.Count++) {}
};

void OnStart()
{
  B b;  
  Print(b.i); // 0
  Print(b.j); // 1

  C c;
  Print(c.i); // 1
  Print(c.j); // 0
}

我们的期望是按照构造函数的规定从左到右进行初始化。

C() : i(this.Count++), j(this.Count++) {}

但事实证明,初始化是按字段从上到下进行的。而构造函数后指定的初始化顺序并不重要。这样做对吗?

 
fxsaber #:
结构/类对象的字段初始化顺序取决于字段的相互排列,而不是构造函数后的条目,请问这种行为是否正确?

我们的期望是按照构造函数的规定从左到右进行初始化。

但事实证明,初始化是按字段从上到下进行的。而构造函数后指定的初始化顺序并不重要。这样做对吗?

如果没人看,开发人员为什么还要写这么详细的帮助 呢?我建议将帮助简化为一句话:向论坛提问--他们会帮助你!

 
A100 #:

如果没人看,开发人员为什么还要写这么详细的帮助?我建议将帮助简化为一句话:在论坛上询问 - 他们会帮助你!

当在帮助中找到问题答案的方案明确之后,我就会减少使用论坛帮助的次数。

 
fxsaber #:

当我理解了在帮助中寻找问题答案的方案后,我就会减少使用论坛的次数。


在 "数据类型"->"结构和类 "中。

在初始化列表中,成员可以按照任意顺序排列,但所有类成员都将按照其声明顺序进行初始化。
 
Sergey Gridnev #:

在 "数据类型"->"结构和类 "中

在初始化列表中,成员可以按照任意顺序排列,但所有类成员都将按照声明的顺序进行初始化。

谢谢。遗憾的是,我们并不总是很清楚在哪里以及如何查找。

 
fxsaber #:

谢谢。不幸的是,我们并不总是很清楚该去哪里找,该怎么找。

是啊
 

我在指标工作(MT5 和 MT4)中发现了一个非常令人不快的问题。
事件会阻止定时器工作。
Expert Advisor 中没有这种情况。
我再次确信,在需要稳定定时器工作的情况下使用指标毫无意义。

这里有一个指标可以说明这个问题,其中定时器设置为 20 毫秒,如果定时器事件之间的时间超过 100 毫秒,就会显示出来。

#property indicator_chart_window
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetMillisecondTimer(20);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
void  OnTimer()
  {
   static uint last_time = GetTickCount();
   uint cur_time = GetTickCount();
   if (cur_time-last_time>100) Print(string(cur_time-last_time)+" ms");
   last_time = cur_time;
  }
//+------------------------------------------------------------------+



 
已添加。
template <typename T>
class A
{
public:  
  void f() const { ::Print(typename(T)); }
};

void OnStart()
{
  const A<MqlTick> a;
  
  a.f(); // struct MqlTick
}