错误、漏洞、问题 - 页 1733 1...172617271728172917301731173217331734173517361737173817391740...3184 新评论 fxsaber 2016.10.14 15:51 #17321 Комбинатор:在MQL语言中,数组的引用是一个拐杖,而不是一个参考。而如果[]是一个像*这样的类型修饰符,它应该有自己的const!而不是一个引用。 我只知道如何用MQL写东西。 coderex 2016.10.14 16:21 #17322 A100: 这个错误是合理的--这些标识符在帮助中被列为只读(不与ChartSetInteger结合)https://www.mql5.com/ru/docs/constants/chartconstants/enum_chart_property 已经想通了,但还是谢谢你 :) fxsaber 2016.10.15 06:35 #17323 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中面临这样的不便。 fxsaber 2016.10.15 06:50 #17324 2016.10.15 09:48:01.820 MQL5 wrong type, loading of Test9 failed 它是什么? fxsaber 2016.10.15 06:52 #17325 1455 - 历史数据的调试(CTRL+F5)不起作用。测试器窗口出现,可视化没有开始。 Vladimir Karputov 2016.10.15 07:00 #17326 fxsaber: 1455 - 历史数据的调试(CTRL+F5)不起作用。测试器窗口出现,可视化没有开始。 并非如此。此外,没有技术细节或对你的行动的描述。这是一个专门的分支,在写一个据称发现的错误之前,你必须准备并提供额外的信息。 coderex 2016.10.15 07:00 #17327 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,一切都很好,除了内存被释放。只有在将终端任务从运行任务列表中删除后,才会释放内存。 fxsaber 2016.10.15 07:03 #17328 Karputov Vladimir: 它没有。此外,没有技术细节或对你的行动的描述。这是一个专门的分支,你需要在写你所谓的发现的错误之前准备和提供额外的信息。服务台的开发人员已经把我的配置记了好几遍。我采取任何标准的专家顾问,在MetaEditor中按CTRL+F5。策略测试器的主窗口将弹出,上面有MetaEditor中指定的设置。但可视化并没有开始。日志2016.10.15 10:06:09 Tester Leverage 1:100 set error Vladimir Karputov 2016.10.15 07:09 #17329 fxsaber: 服务台的开发人员已经多次记住了我的配置。你甚至没有意识到我在说什么。在你开始对故事进行调试之前,你做了什么?你是否配置了MetaEditor(标签 "工具" - "设置" - "调试")?给一个MetaEditora的截图(标签 "工具"-"设置"-"调试"),在Tester的 "日志 "标签中写了什么?在查看器的 "日志 "选项卡中写了什么? coderex 2016.10.15 07:13 #17330 fxsaber:服务台的开发人员已经把我的配置记了好几遍。我采取任何标准的专家顾问,在MetaEditor中按CTRL+F5。策略测试器的主窗口将弹出,上面有MetaEditor中指定的设置。可视化不启动。 MACD样本将被正常启动。也许是设置出了问题? 1...172617271728172917301731173217331734173517361737173817391740...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
在MQL语言中,数组的引用是一个拐杖,而不是一个参考。
而如果[]是一个像*这样的类型修饰符,它应该有自己的const!而不是一个引用。
这个错误是合理的--这些标识符在帮助中被列为只读(不与ChartSetInteger结合)https://www.mql5.com/ru/docs/constants/chartconstants/enum_chart_property
会 有帮助吗?
非常仔细地阅读它。C++比MQL更难理解。我从这篇文章中不太明白。而且我完全不明白这与这里讨论的内容有什么关系。
然而,我喜欢这个功能。
完美转发
在描述它是什么之前,让我们回到以前的标准,描述现有的问题。假设我们有一个模板函数foo接收一个参数,并将其传递给函数bar(T& something)。
void foo(T& Object)
{
bar(Object);
}
所以,一切都很好。但是,如果我们想把,比如说,数字100作为参数传给一个函数呢?
别担心,我们会这样写的。
void foo(const T& Object)
{
bar(Object);//Ooops
}
但在这种情况下,会出现编译错误,因为bar需要一个非常量引用。因此,我们必须提供2个函数吧--常数和非常数。现在让我们想象一下,不仅有一个参数,还有2个、3个或5个。事实证明,这项任务非常难以实现,因为我们有(2^n - 1)个重载函数,其中n是函数参数的数量。如果你认为这样的参数数量是不好的风格,根本没有人这样写,那么看看std::bind、std::make_shared等等。
现在让我们看看新标准为我们提供了什么解决方案。
void foo(T&& Object)
{
bar(std::forward<T>(Object));
}
使用上述代码,参数传递问题就完全解决了,这被称为完美传递,因为在调用外部函数foo和内部函数bar之间,参数类型是保留的。再也不需要重载一堆函数了--通用代码开发人员可以得到满足。
这个解决方案是可能的,因为如果模板参数是T&,那么传递的类型会自己保存,而std::forward是需要的,因为foo函数里面任何命名的类型都会变成lvalue,我们需要原始类型--这就是std::forward的作用--它保存原始类型并剥离参数的名称(结果是T&&),这允许它以后传递给精确的bar函数。
1455 - 历史数据的调试(CTRL+F5)不起作用。测试器窗口出现,可视化没有开始。
非常仔细地阅读它。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,一切都很好,除了内存被释放。
只有在将终端任务从运行任务列表中删除后,才会释放内存。
它没有。此外,没有技术细节或对你的行动的描述。这是一个专门的分支,你需要在写你所谓的发现的错误之前准备和提供额外的信息。
服务台的开发人员已经把我的配置记了好几遍。
我采取任何标准的专家顾问,在MetaEditor中按CTRL+F5。策略测试器的主窗口将弹出,上面有MetaEditor中指定的设置。但可视化并没有开始。
日志
服务台的开发人员已经多次记住了我的配置。
你甚至没有意识到我在说什么。
在你开始对故事进行调试之前,你做了什么?你是否配置了MetaEditor(标签 "工具" - "设置" - "调试")?给一个MetaEditora的截图(标签 "工具"-"设置"-"调试"),在Tester的 "日志 "标签中写了什么?在查看器的 "日志 "选项卡中写了什么?
服务台的开发人员已经把我的配置记了好几遍。
我采取任何标准的专家顾问,在MetaEditor中按CTRL+F5。策略测试器的主窗口将弹出,上面有MetaEditor中指定的设置。可视化不启动。