错误、漏洞、问题 - 页 2952

 
Alexey Rassvetnyy:

请修复这个错误。MQL5不允许使用一些内置枚举作为通用参数,例如:ENUM_CHART_PROPERTY_DOUBLE,ENUM_CHART_PROPERTY_STRING

自定义枚举和其他嵌入式枚举都没有问题。

问题的出现是因为这个枚举没有一个值为零的元素。我设法创建了自己的枚举,产生了这个编译错误

#include <Generic\HashMap.mqh>
enum TEST_ENUM {
   ENUM1, ENUM2
};
enum TEST_ENUM2 { //отсутствует элемент с номером 0
   ENUM1=-10, ENUM2
};
void OnStart()
  {
   CHashMap<ENUM_CHART_PROPERTY_INTEGER,int> mapI;    // эта срока комилируется без ошибок
   CHashMap<ENUM_CHART_PROPERTY_DOUBLE,double> mapD;  // здесь ошибки компиляции: 'NULL' - cannot convert enum  HashMap.mqh     21      39. 'NULL' - cannot convert enum        HashMap.mqh     462     30
   CHashMap<ENUM_CHART_PROPERTY_STRING,string> mapS;  // здесь ошибки компиляции: 'NULL' - cannot convert enum  HashMap.mqh     21      39. 'NULL' - cannot convert enum        HashMap.mqh     462     30
   CHashMap<TEST_ENUM,double> mapE;    // эта срока комилируется без ошибок
   CHashMap<TEST_ENUM2,double> mapE2;    // здесь ошибки компиляции: 'NULL' - cannot convert enum       HashMap.mqh     21      39. 'NULL' - cannot convert enum        HashMap.mqh     462     30
  }
 
Alexey Rassvetnyy:

问题的出现是因为枚举中不包含一个空值的元素。我们已经设法创建了我们自己的枚举,它产生了这个编译错误

在你的情况下,修复库文件将有助于

//+------------------------------------------------------------------+
//| fix HashMap.mqh                                                  |
//|  line 21  | was | Entry(void): key(NULL) {}                      |
//|           | now | Entry(void): key((TKey)NULL) {}                |
//|  line 462 | was | m_entries[i].key=NULL;                         |
//|           | now | m_entries[i].key=(TKey)NULL;                   |
//+------------------------------------------------------------------+
 
DMITRII PECHERITSA:

在你的情况下,修复库文件将有助于

谢谢你,这很有效。

然而,如果我手工修改了一个支持MQ的文件,下一次更新将回滚我的修改。我们需要支持标准库 的开发者在整个标准库的代码中把NULL转为参数类型,或者收紧编译器,使NULL可以自动转为任何类型而不需要明确的指令。

 
Alexey Rassvetnyy:

支持标准库 的开发者应该在整个标准库代码中把NULL投给参数类型,或者收紧编译器,使NULL自动投给任何类型而不需要明确的指令。

开发人员有一个原则:越简单越好。嗯,这不是汇编程序,所以你可以使用它。也许应该是这样的。

 
DMITRII PECHERITSA:

在你的情况下,修复库文件将有助于

谢谢你的留言。

在SB中做了这些更正

 
Ilyas:

谢谢你的留言。

在SB中做了这些更正

不仅对键进行了纠正,对值也进行了纠正?

 
Stanislav Korotky:

不仅对键进行了纠正,对值也进行了纠正?

是的,也是为了价值

 
Ilyas:

调试器在显示一个结构的内容时,是否有可能能够从观察到的字段中删除一些字段?


有几个大型建筑。你需要用你的眼睛通过五个领域进行比较。它不起作用。

 

日安!请帮助我解决这个问题。

在MT5-advisor中发送和检查交易请求之前,我使用了type_filling 定义的以下变体。

// тип FILLING
int SYMBOL_FILLING = (int)SymbolInfoInteger(iNameSymbol, SYMBOL_FILLING_MODE);
switch(SYMBOL_FILLING)
{
   case SYMBOL_FILLING_FOK:   iЗапрос.type_filling = ORDER_FILLING_FOK;    break;
   case SYMBOL_FILLING_IOC:   iЗапрос.type_filling = ORDER_FILLING_IOC;    break;
   default:                   iЗапрос.type_filling = ORDER_FILLING_RETURN; break;
}

但我面临的事实是,这种结构并非对所有账户和所有经纪人都有效,在通过OrderCheck检查准备好的请求后,出现了错误10030(指定了不支持的 订单执行类型 的余额)。在这种情况下,SYMBOL_FILLING=3,并且选择了ORDER_FILLING_RETURN类型。

我不使用任何外部库(如 CTrade)。请帮助我或指导我在哪里可以得到我问题的答案。

提前感谢!

 
fxsaber:

调试器在显示一个结构的内容时,是否有可能能够从观察到的字段中删除一些字段?


有几个大型建筑。你需要用你的眼睛通过五个领域进行比较。它不起作用。

最好的方法是在源码中鼠标移动时显示任何变量的值--这样你就不需要在观察列表中添加任何东西,而且任何嵌套 的字段都可以使用,不需要一连串的取消引用(和邻近的字段)

原因: