Erreurs, bugs, questions - page 1991

 
fxsaber:

Moi, inattentif :) Pouvez-vous expliquer pourquoi cela est nécessaire ? Pourquoi ne peut-on pas utiliser le constructeur ?

Ou est-ce pour montrer une erreur d'initialisation de structure avec un champ fermé ?

 
Alexey Kozitsyn:

Moi, inattentif :) Pouvez-vous expliquer pourquoi cela est nécessaire ? Pourquoi ne peut-on pas utiliser le constructeur ?

Car en écrivant mon propre code, j'ai rencontré une situation où ma structure est impliquée dans une union. La solution d'un constructeur vide m'est immédiatement venue à l'esprit, mais le fait que mon code comporte une union m'a déçu. C'est pourquoi je posais cette question, non pas pour m'ennuyer, mais pour des raisons pratiques.


J'ai dû écrire ce twist pour éviter ce "bug" (est-ce un bug ou pas ?).

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


Jusqu'à présent, je n'ai pas vu d'autre solution.

 
fxsaber:
Je l'ai lancé, j'ai vu le problème. Il semble que seules les structures avec des champs publics soient autorisées avec des unions maintenant. Il serait alors possible d'écrire struct = {0} ;
 
Alexey Kozitsyn:
Je l'ai lancé, j'ai vu le problème. Il semble que seules les structures avec des champs publics soient autorisées avec des unions maintenant. Il serait alors possible d'écrire struct = {0} ;

Ce n'est pas le cas.

 
fxsaber:

Ce n'est pas le cas.

Peut-être ai-je encore mal compris, mais ce code fonctionne sans aucun avertissement :

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:

Peut-être ai-je encore mal compris, mais ce code fonctionne sans aucun avertissement :

C'est vrai, les structures publiques sont initialisées. Mais le syndicat n'a rien à voir avec cela.


Il est intéressant de noter que si une structure dont le champ est caché devient un champ public d'une nouvelle structure, cette dernière ne s'initialise pas non plus, même si tous les champs sont ouverts.

 

Bonjour, pouvez-vous me dire s'il est possible de déclarer un tableau en spécifiant le nombre d'éléments qu'il contient avec une variable ? Si non, comment faire ?

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

Bonjour, pouvez-vous me dire s'il est possible de déclarer un tableau en spécifiant le nombre d'éléments qu'il contient avec une variable ? Si non, comment faire ?

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

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

Bonjour, pouvez-vous me dire s'il est possible de déclarer un tableau en spécifiant le nombre d'éléments qu'il contient avec une variable ? Si non, comment faire ?


ArrayResize()

 
Raison: