Errores, fallos, preguntas - página 216

 
Vigor:

Me he encontrado con un problema de desbordamiento de pila de llamadas (eso creo).

Después de llamar a un método de uno de los objetos , véase el ejemplo siguiente. El código está simplificado, sólo lo esencial. La clase CClass1 es una clase base y list1 tiene diferentes objetos que son descendientes de esta clase y sus funciones init están implementadas de forma diferente. Así, en una clase en la que la función init obtiene una lista de este tipo (para decirlo de forma sencilla, inicializa una interfaz anidada, un panel en el panel) después de regresar de init en la línea

hay un error

2010.12.02 00:21:00 test1 (EURUSD,H1) Acceso de puntero no válido en 'Container.mqh' (74,10)

Es decir, el puntero t está muerto.

Cuando se depura, no hay tal error, después de la llamada al método el puntero está "vivo", se crean las interfaces anidadas y el Asesor Experto sigue funcionando.

Esta es la única manera de evitar el error:

#property stacksize pointer achieved nothing.

Es difícil decir algo con seguridad. Necesitas el código fuente.

Intenta escribir una solicitud a servicedesk.

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

Volví de vacaciones, inicié los terminales, actualicé a la build 360 y un indicador dejó de funcionar...

He leído los cambios: 6. MQL5: Se ha corregido el procesamiento del evento de clic en un gráfico.

Ahora cuando se hace clic en un objeto gráfico se generan dos eventos a la vez: CHARTEVENT_OBJECT_CLICK + CHARTEVENT_CLICK, mientras que antes sólo había un CHARTEVENT_OBJECT_CLICK, lo que permite simular un doble clic

¿Siempre será así o es un error?

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

Volví de las vacaciones, inicié los terminales, actualicé a la versión 360 y un indicador dejó de funcionar...

lectura en los cambios: 6. MQL5: Corregido el procesamiento del evento de clic en un gráfico.

Ahora cuando se hace clic en un objeto gráfico se generan dos eventos a la vez: CHARTEVENT_OBJECT_CLICK + CHARTEVENT_CLICK, mientras que antes sólo había un CHARTEVENT_OBJECT_CLICK, lo que permite simular un doble clic

¿Siempre será así o es un error?

Esto se hizo intencionadamente.
 

Una vez más me doy de bruces con el muro de la imposibilidad,

Necesito pasar un parámetro al constructor, para que la clase se inicialice con ciertos parámetros,

¿Cómo puedo evitar este problema? ¿Qué me recomiendan?

 
Urain:

Una vez más me doy de bruces con el muro de la imposibilidad,

Necesito pasar un parámetro al constructor para que la clase se inicialice con ciertos parámetros,

¿Cómo puedo evitar este problema?


к

bueno, no veo otra salida

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() );
  }

y, por supuesto, hay que poner los Inits en el orden correcto en el caso de las clases heredadas

Me gustaría que escribieran un artículo sobre el manejo de errores en proyectos complejos,Imprimir y devolver como aquí no es la solución.

 
gdtt:

Bueno, no veo otra salida.

Y, por supuesto, hay que poner los Inits en el orden correcto en el caso de las clases heredadas

En general, me gustaría que escribieran un artículo sobre el manejo de errores en proyectos complejos, Imprimir y devolver como aquí no es la solución.

Es decir, crear un pre-constructor que complete el proceso de construcción, y que a su vez muestre una bandera de inicialización.

En general, es una buena solución, pero hay algunos inconvenientes. Tenemos que sondear cada función con la bandera de inicialización, y con un gran número de funciones de clase, no es conveniente.

Y si tenemos que cambiar algo, habría que reescribir todas las funciones.

SZ He editado el código, he corregido la errata.

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:

Es decir, crear un pre-constructor que complete el proceso de construcción, y que a su vez establezca una bandera de inicialización.

En general, está bien, pero hay algunos inconvenientes. Tendremos que consultar cada función para la bandera de inicialización, y con un gran número de funciones de clase, esto no es conveniente.

El código tiene un gran número de funciones de clase, y esto no es conveniente.

SZ He editado el código, arreglado el descuido.

bueno, si hubiera un constructor, no significaría que la inicialización fuera exitosa. en todo caso, hay que verificar el hecho de la inicialización

por supuesto que puedes comprobarlo una vez:

void OnStart()
  {

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

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

Pero si usted utiliza su propio código, puede hacer una regla para comprobar el hecho de la inicialización en el momento de la llamada, y si va a ser utilizado por otros, no se puede escribir en las instrucciones: "usted debe utilizar sólo esta construcción, de lo contrario no puedo garantizar para las consecuencias". No, de todos modos hay que comprobar la inicialización en los métodos de la clase.

 

A los desarrolladores.

Inmediatamente después del reinicio de la nueva construcción


PS

La actualización de la terminal instalada en una carpeta diferente fue exitosa, los símbolos están en la lista (pero no había gráficos abiertos antes de la actualización)...

 

Dime si esto es un error o si no está permitido.

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()
  {
//---
   
  }
//+------------------------------------------------------------------+

Da un error

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

Por favor, díganme si esto es un error o no está permitido.

Obtendrá un error


Lo más probable es que ArrayInitialize() esté pensada para llenar sólo matrices de un tipo determinado, numérico para ser exactos (muy probablemente int o double).

Debido a que el array tiene el tipo ENUM_ORDER_TYPE la llamada de ArrayInitialize causará un error, diciendo que este método de llamada no está permitido.

En mi opinión, hay dos opciones en este caso:

1. cambiar el tipo de matriz ENUM_ORDER_TYPE por int, y al mismo tiempo tenerlo en cuenta en el código (al menos los tipos de orden pueden representarse fácilmente como int);

2. Implementar de forma independiente la "inicialización" del array.

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