Erros, bugs, perguntas - página 1991

 
Alexey Kozitsyn:
Acrescentar um construtor padrão à estrutura.

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Insectos, insectos, perguntas

fxsaber, 2017.09.06 09:38

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

Desatenta-me:) Pode explicar porque é que isto é necessário? Porque é que o construtor não pode ser utilizado?

Ou será para mostrar um erro de inicialização da estrutura com um campo fechado?

 
Alexey Kozitsyn:

Desatenta-me:) Pode explicar porque é que isto é necessário? Porque é que o construtor não pode ser utilizado?

Porque ao escrever o meu próprio código deparei com uma situação em que a minha estrutura está envolvida num sindicato. A solução com um construtor vazio veio imediatamente à mente, mas foi uma chatice que o meu código tivesse um sindicato. É por isso que estava a fazer esta pergunta não para me aborrecer mas para uso prático.


Tive de escrever esta reviravolta para evitar este "insecto" (é ou não um insecto?).

// Зануляем структуру без конструктора со скрытыми полями
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);    
}


Ainda não vi nenhuma outra solução.

 
fxsaber:
Corra-o, viu o problema. Parece que apenas as estruturas com campos públicos são agora permitidas com sindicatos. Então seria possível escrever estrutura = {0};
 
Alexey Kozitsyn:
Corram-no, viram o problema. Parece que apenas as estruturas com campos públicos são agora permitidas com sindicatos. Então seria possível escrever estrutura = {0};

Não é este o caso.

 

Talvez o tenha compreendido mal outra vez, mas este código funciona sem qualquer aviso:

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:

Talvez o tenha compreendido mal outra vez, mas este código funciona sem qualquer aviso:

É verdade, as estruturas públicas são inicializadas. Mas a união não tem nada a ver com isso.


Curiosamente, se uma estrutura com um campo oculto for feita um campo público de uma nova estrutura, então a nova estrutura também não será inicializada, mesmo que todos os campos estejam abertos.

 

Olá, poderia dizer-me se é possível declarar uma matriz especificando o número de elementos nela contidos com uma variável? Se não, como é que isto pode ser feito?

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

Olá, poderia dizer-me se é possível declarar uma matriz especificando o número de elementos nela contidos com uma variável? Se não, como é que isto pode ser feito?

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

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

Olá, poderia dizer-me se é possível declarar uma matriz especificando o número de elementos nela contidos com uma variável? Se não, como é que isto pode ser feito?


ArrayResize()

Razão: