Errores, fallos, preguntas - página 1991

 
Alexey Kozitsyn:
Añade un constructor por defecto a la estructura.

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

fxsaber, 2017.09.06 09:38

// Нужен только для того, чтобы показать необходимость решения без конструктора
union UNION
{
  STRUCT Struct; // конструктора не должно быть
  int i;
};
 
fxsaber:

Yo desatento:) ¿Puede explicar por qué es necesario? ¿Por qué no se puede utilizar el constructor?

¿O es para mostrar un error de inicialización de la estructura con un campo cerrado?

 
Alexey Kozitsyn:

Yo desatento:) ¿Puede explicar por qué es necesario? ¿Por qué no se puede utilizar el constructor?

Porque al escribir mi propio código me encontré con una situación en la que mi estructura está involucrada en una unión. La solución con un constructor vacío me vino inmediatamente a la mente, pero era un fastidio que mi código tuviera una unión. Por eso preguntaba, no por aburrirme, sino por la utilidad práctica.


Tuve que escribir esta vuelta de tuerca para evitar este "bug" (¿es un bug o no?).

// Зануляем структуру без конструктора со скрытыми полями
template <typename T>
void StructToNull( T& Struct )
{    
  union TMP_UNION
  {
    T Struct;
    
    struct TMP_STRUCT
    {
      uchar Array[sizeof(T)];
    } Tmp;
    
    TMP_UNION( T& Value )
    {
      ::ArrayInitialize(this.Tmp.Array, 0);
      
      Value = this.Struct;
    }
  } TmpUnion(Struct);    
}


Todavía no he visto ninguna otra solución.

 
fxsaber:
Lo he hecho funcionar y he visto el problema. Parece que ahora sólo se permiten estructuras con campos públicos con uniones. Entonces sería posible escribir struct = {0};
 
Alexey Kozitsyn:
Lo he hecho funcionar y he visto el problema. Parece que ahora sólo se permiten estructuras con campos públicos con uniones. Entonces sería posible escribir struct = {0};

Este no es el caso.

 

Tal vez te haya entendido mal de nuevo, pero este código funciona sin ninguna advertencia:

struct STRUCT
{
//private:
  int i;

};

// Нужен только для того, чтобы показать необходимость решения без конструктора
union UNION
{
  STRUCT Struct; // конструктора не должно быть
  int i;
};

// Обходим Warning "possible use of uninitialized variable"
template <typename T>
void StructInit( T& ) {}

STRUCT Func()
{
  STRUCT Res = {0}; // ок!
  
//  StructInit(Res); // с этой строкой Warning не появляется, но это какой-то абсурд!
  
  return(Res);  
}

void OnStart()
{
  Func();
}
 
Alexey Kozitsyn:

Tal vez te haya entendido mal de nuevo, pero este código funciona sin ninguna advertencia:

Así es, las estructuras públicas se inicializan. Pero la unión no tiene nada que ver.


Curiosamente, si una estructura con un campo oculto se convierte en un campo público de una nueva estructura, la nueva estructura tampoco se inicializará, aunque todos los campos estén abiertos.

 

Hola, ¿podríais decirme si es posible declarar un array especificando el número de elementos que contiene con una variable? Si no es así, ¿cómo se puede hacer?

extern int Period = 10;
int Massiv[Period]; //Выдаёт ошибку: "invalid index value"
 
giros:

Hola, ¿podríais decirme si es posible declarar un array especificando el número de elementos que contiene con una variable? Si no es así, ¿cómo se puede hacer?

https://www.mql5.com/ru/docs/array/arrayresize

Документация по MQL5: Операции с массивами / ArrayResize
Документация по MQL5: Операции с массивами / ArrayResize
  • www.mql5.com
Операции с массивами / ArrayResize - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
giros:

Hola, ¿podríais decirme si es posible declarar un array especificando el número de elementos que contiene con una variable? Si no es así, ¿cómo se puede hacer?


ArrayResize()