错误、漏洞、问题 - 页 1733

 
Комбинатор:

在MQL语言中,数组的引用是一个拐杖,而不是一个参考。

而如果[]是一个像*这样的类型修饰符,它应该有自己的const!而不是一个引用。

我只知道如何用MQL写东西。
 
A100:
这个错误是合理的--这些标识符在帮助中被列为只读(不与ChartSetInteger结合https://www.mql5.com/ru/docs/constants/chartconstants/enum_chart_property
已经想通了,但还是谢谢你 :)
 
coderex:
有帮助吗?

非常仔细地阅读它。C++比MQL更难理解。我从这篇文章中不太明白。而且我完全不明白这与这里讨论的内容有什么关系。

然而,我喜欢这个功能。

完美转发

在描述它是什么之前,让我们回到以前的标准,描述现有的问题。假设我们有一个模板函数foo接收一个参数,并将其传递给函数bar(T& something)。

template <typename T>
void foo(T& Object)
{
    bar(Object);
}

所以,一切都很好。但是,如果我们想把,比如说,数字100作为参数传给一个函数呢?

别担心,我们会这样写的。

template <typename T>
void foo(const T& Object)
{
    bar(Object);//Ooops
}

但在这种情况下,会出现编译错误,因为bar需要一个非常量引用。因此,我们必须提供2个函数吧--常数和非常数。现在让我们想象一下,不仅有一个参数,还有2个、3个或5个。事实证明,这项任务非常难以实现,因为我们有(2^n - 1)个重载函数,其中n是函数参数的数量。如果你认为这样的参数数量是不好的风格,根本没有人这样写,那么看看std::bind、std::make_shared等等。


现在让我们看看新标准为我们提供了什么解决方案。

template <typename T>
void foo(T&& Object)
{
    bar(std::forward<T>(Object));
}

使用上述代码,参数传递问题就完全解决了,这被称为完美传递,因为在调用外部函数foo和内部函数bar之间,参数类型是保留的。再也不需要重载一堆函数了--通用代码开发人员可以得到满足。


这个解决方案是可能的,因为如果模板参数是T&,那么传递的类型会自己保存,而std::forward是需要的,因为foo函数里面任何命名的类型都会变成lvalue,我们需要原始类型--这就是std::forward的作用--它保存原始类型并剥离参数的名称(结果是T&&),这允许它以后传递给精确的bar函数。

"(2^n - 1)重载函数,其中n是函数参数的数量" - 我在MQL中面临这样的不便。
 
2016.10.15 09:48:01.820 MQL5    wrong type, loading of Test9 failed
它是什么?
 
1455 - 历史数据的调试(CTRL+F5)不起作用。测试器窗口出现,可视化没有开始。
 
fxsaber:
1455 - 历史数据的调试(CTRL+F5)不起作用。测试器窗口出现,可视化没有开始。
并非如此。此外,没有技术细节或对你的行动的描述。这是一个专门的分支,在写一个据称发现的错误之前,你必须准备并提供额外的信息。
 
fxsaber:

非常仔细地阅读它。C++比MQL更难理解。我从这篇文章中不太明白。而且我完全不明白这与这里讨论的内容有什么关系。

然而,我喜欢这个功能。

我遇到过"(2^n - 1)重载函数,其中n是函数参数的数量" - 这是MQL中的一个不便之处。

这是关于理解rvalue / lvalue / prvalue / xvalue / gvalue 的问题,也就是说,你基本上说了好几页的内容 :)在我看来,MQ遵循C++的标准,从那里获取最有价值的东西,在他们看来,没有仅仅停留在rvalue/lvalue

我自己仍然没有完全意识到这些概念,尽管我从逻辑上理解它们 :)

顺便说一下,如果程序将内存用得很满,MT5中的内存管理器的工作原理令人费解。我还没有在小尺寸上测量过它。

例如,我在虚拟机上拥有4G内存,2个核心,MT5 v1455 x64。

我正在用对象加载内存,在任务管理器中,我看到每个终端使用1.5G的内存,每个虚拟内存使用1.5G的内存。MQL_MEMORY_USED 显示有400MB可用的内存。在开始之前,终端约为140 mb,虚拟应用程序为150 mb。

我还注意到,一旦内存使用量超过400 mb,内存管理器可能无法完全释放它,尽管对象实际上已被删除。调试器的行为是不可预测的--我开始删除对象,等待它们被完全删除,然后停止调试(通过调试器中的停止按钮),它停止了,MT5管理器还没有给系统分配内存,即还有1.5Gb挂在终端,1.5Gb是虚拟内存。МТ5本身还没有完成调试过程,尽管ME显示调试已经完成。如果对象内存小于400 mb,一切都很好,除了内存被释放

只有在将终端任务从运行任务列表中删除后,才会释放内存。

 
Karputov Vladimir:
它没有。此外,没有技术细节或对你的行动的描述。这是一个专门的分支,你需要在写你所谓的发现的错误之前准备和提供额外的信息。

服务台的开发人员已经把我的配置记了好几遍。

我采取任何标准的专家顾问,在MetaEditor中按CTRL+F5。策略测试器的主窗口将弹出,上面有MetaEditor中指定的设置。但可视化并没有开始。

日志

2016.10.15 10:06:09     Tester  Leverage 1:100 set error
 
fxsaber:
服务台的开发人员已经多次记住了我的配置。

你甚至没有意识到我在说什么。

在你开始对故事进行调试之前,你做了什么?你是否配置了MetaEditor(标签 "工具" - "设置" - "调试")?给一个MetaEditora的截图(标签 "工具"-"设置"-"调试"),在Tester的 "日志 "标签中写了什么?在查看器的 "日志 "选项卡中写了什么?

 
fxsaber:

服务台的开发人员已经把我的配置记了好几遍。

我采取任何标准的专家顾问,在MetaEditor中按CTRL+F5。策略测试器的主窗口将弹出,上面有MetaEditor中指定的设置。可视化不启动。

MACD样本将被正常启动。也许是设置出了问题?