错误、漏洞、问题 - 页 216

 
Vigor:

我遇到了一个调用堆栈溢出的问题(我是这么认为的)。

在调用其中一个对象的方法后,见下面的例子。代码被简化了,只是大意。类CClass1是一个基类,list1有不同的对象,它们是这个类的后代,它们的init函数的实现方式也不同。因此,在一个类中,init函数在从init返回后的一行中获取了这样一个列表(简单地说,它初始化了一个嵌套接口,即面板中的一个面板)。

有一个错误

2010.12.02 00:21:00 test1 (EURUSD,H1) 'Container.mqh'中无效的指针访问 (74,10)

也就是说,指针t已经死亡。

在调试时,没有这样的错误,在方法调用后,指针是 "活的",嵌套接口被创建,专家顾问进一步工作。

这是绕过错误的唯一方法。

#property stacksize pointer没有取得任何成果。

很难说什么是肯定的。你需要源代码。

尝试给servicedesk一份请求

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.
 

我放假回来,启动终端,更新到360构建,有一个指标停止工作......

我读到了这些变化:6.MQL5:固定处理图表上的点击事件。

现在,当你点击一个图形对象时,会同时产生两个事件:CHARTEVENT_OBJECT_CLICK+ CHARTEVENT_CLICK,而以前只有一个CHARTEVENT_OBJECT_CLICK,这可以模拟双击。

会一直这样吗,还是说这是个错误?

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - Документация по MQL5
 
AlexSTAL:

放假回来,启动终端,更新到360版本,有一个指标停止工作......。

在变化中阅读。 6.MQL5: 修正了图表上点击事件的处理。

现在,当你点击一个图形对象时,会同时产生两个事件:CHARTEVENT_OBJECT_CLICK+ CHARTEVENT_CLICK,而以前只有一个CHARTEVENT_OBJECT_CLICK,这可以模拟双击。

会一直这样吗,还是说这是个错误?

这是有意为之的。
 

我又一次撞上了不可能的墙。

我需要向构造函数传递一个参数,这样类就会被初始化为某些参数。

我怎样才能解决这个问题? 你有什么建议?

 
Urain:

我又一次撞上了不可能的墙。

我需要向构造函数传递一个参数,以便用某些参数对类进行初始化。

我怎样才能解决这个问题呢?


к

好吧,我看不出有什么其他的出路。

class test{
  private:
    bool inited;
    int value;  
  public:
    void test(){
      inited = false;
    }
    
  bool Set( int passed ){
    value = passed;
    return(true);
  }
  bool Init( int passed ){
    if ( Set( passed ) ){
      inited = true;
      return(true);
    }
    return(false);
  }
  int Get( ){
    if( !inited ){
      Print("Объект неинициализирован");
      return(-1);
    }
    return(value);
  }
};

void OnStart()
  {
  
  
  test var;
  if( !var.Init(1)){
    Print("Ошибка инициализации объекта");
    return;
}
  Print(var.Get());
  
  test var2;
  Print( var2.Get() );
  }

当然,在继承类的情况下,你必须把Inits放在正确的顺序上

我希望他们能写一篇关于复杂项目中错误处理的文章,打印 和返回,因为这里不是解决方案。

 
gdtt:

好吧,我没有看到任何其他的出路。

当然,在继承类的情况下,你需要把Inits放在正确的顺序上

一般来说,我希望他们写一篇关于复杂项目中错误处理的文章,打印和返回,因为这里不是解决方案。

也就是说,要创建一个能够完成构造过程的预构造器,而这个预构造器又会显示一个初始化标志。

总的来说,这是一个很好的解决方案,但它有一些不便之处。我们必须用初始化标志来轮询每个函数,而对于大量的类函数,这并不方便。

如果我们要改变什么,所有的功能都要重写。

SZ 我已经编辑了代码,修正了错别字。

class test
  {
private:
   bool              inited;
   int               value;
public:
                     test(void){inited=false;};
   bool Set(int passed){value=passed;return(true);};
   bool Init(int passed)
     {
      if(Set(passed))inited=true;    
      return(inited);
     };
   int Get()
     {
      if(!inited)
        {
         Print("Объект неинициализирован");
         return(-1);
        }        
      return(value);
     };
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {

   test var;
   var.Init(1);
   Print(var.Get());

   test var2;
   Print(var2.Get());
  }
 
Urain:

即创建一个预构造器来完成构造过程,并反过来设置一个初始化标志。

一般来说,它很酷,但也有一些不便之处。我们将不得不查询每个函数的初始化标志,而对于大量的类函数,这并不方便。

第一次的代码已经以与第二次相同的方式进行了更新。

SZ 我已经编辑了代码,修正了这个疏忽。

好吧,如果有一个构造函数,这并不意味着初始化成功了。无论如何,你需要验证初始化的事实

当然,你可以检查一次。

void OnStart()
  {

   test var;
   if( ! var.Init(1)){
     // здесь какято обрабтка
     return;
   };
   Print(var.Get());

   test var2;
   Print(var2.Get());
  }

但如果你使用自己的代码,你可以规定在调用时检查初始化的事实,如果它将被其他人使用,你不能在指令中写:"你必须只使用这种结构,否则我不能保证后果"。不,反正你必须在类方法 中检查初始化。

 

对开发商而言。

在重新启动新的构建后,立即


PS

更新安装在不同文件夹中的终端是成功的,符号在列表中(但更新前没有打开的图表)...

 

告诉我这是一个错误,还是不允许这样做。

ENUM_ORDER_TYPE Signal[21];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ArrayInitialize(Signal,WRONG_VALUE);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

它给出了一个错误

'ArrayInitialize' - no one of the overloads can be applied to the function call 
 
sergey1294:

请告诉我这是否是一个错误或不允许。

你会得到一个错误


最有可能的是,ArrayInitialize()的目的是只填充某种类型的数组,确切地说,是数字的(最可能是int或double)。

因为数组的类型是ENUM_ORDER_TYPE,调用ArrayInitialize会导致一个错误,说这个方法的调用是不允许的。

在我看来,在这种情况下有两种选择。

1. 将数组类型ENUM_ORDER_TYPE 改为int,同时在代码中考虑到它(至少订单类型可以很容易地表示为int)。

2.独立地实现阵列的 "初始化"。

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5