Errori, bug, domande - pagina 1991

 
Alexey Kozitsyn:
Aggiungere un costruttore predefinito alla struttura.

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

fxsaber, 2017.09.06 09:38

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

Io disattento:) Può spiegare perché questo è necessario? Perché non si può usare il costruttore?

O è per mostrare un errore di inizializzazione della struttura con un campo chiuso?

 
Alexey Kozitsyn:

Io disattento:) Può spiegare perché questo è necessario? Perché non si può usare il costruttore?

Perché scrivendo il mio codice mi sono imbattuto in una situazione in cui la mia struttura è coinvolta in un'unione. La soluzione con un costruttore vuoto mi è venuta subito in mente, ma era un peccato che il mio codice avesse un'unione. Ecco perché facevo questa domanda non per il gusto di annoiarmi, ma per un uso pratico.


Ho dovuto scrivere questo twist per evitare questo "bug" (è 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);    
}


Non ho ancora visto altre soluzioni.

 
fxsaber:
Eseguirlo, ha visto il problema. Sembra che solo le strutture con campi pubblici siano permesse con le unioni ora. Allora sarebbe possibile scrivere struct = {0};
 
Alexey Kozitsyn:
Eseguirlo, ha visto il problema. Sembra che solo le strutture con campi pubblici siano permesse con i sindacati ora. Allora sarebbe possibile scrivere struct = {0};

Questo non è il caso.

 

Forse ti ho frainteso di nuovo, ma questo codice funziona senza alcun avvertimento:

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:

Forse ti ho frainteso di nuovo, ma questo codice funziona senza alcun avvertimento:

Esatto, le strutture pubbliche sono inizializzate. Ma l'unione non c'entra niente.


È interessante notare che se una struttura con un campo nascosto è resa un campo pubblico di una nuova struttura, allora anche la nuova non si inizializzerà, anche se tutti i campi sono aperti.

 

Ciao, potresti dirmi se è possibile dichiarare un array specificando il numero di elementi in esso con una variabile? Se no, come si può fare?

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

Ciao, potresti dirmi se è possibile dichiarare un array specificando il numero di elementi in esso con una variabile? Se no, come si può fare?

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

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

Ciao, potresti dirmi se è possibile dichiarare un array specificando il numero di elementi in esso con una variabile? Se no, come si può fare?


ArrayResize()