Fehler, Irrtümer, Fragen - Seite 1991

 
Alexey Kozitsyn:
Fügen Sie der Struktur einen Standardkonstruktor hinzu.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2017.09.06 09:38

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

Ich bin unaufmerksam:) Können Sie erklären, warum dies notwendig ist? Warum kann der Konstruktor nicht verwendet werden?

Oder soll ein Fehler bei der Strukturinitialisierung mit einem geschlossenen Feld angezeigt werden?

 
Alexey Kozitsyn:

Ich bin unaufmerksam:) Können Sie erklären, warum dies notwendig ist? Warum kann der Konstruktor nicht verwendet werden?

Beim Schreiben meines eigenen Codes bin ich nämlich auf eine Situation gestoßen, in der meine Struktur an einer Vereinigung beteiligt ist. Die Lösung mit einem leeren Konstruktor kam mir sofort in den Sinn, aber es war schade, dass mein Code eine Union hatte. Deshalb habe ich diese Frage nicht gestellt, um mich zu langweilen, sondern aus praktischen Gründen.


Ich musste diese Wendung schreiben, um diesen "Fehler" (ist es ein Fehler oder nicht?) zu vermeiden.

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


Eine andere Lösung habe ich noch nicht gesehen.

 
fxsaber:
Starten Sie es und sehen Sie das Problem. Es scheint, dass nur Strukturen mit öffentlichen Feldern jetzt mit Gewerkschaften erlaubt sind. Dann wäre es möglich, struct = {0} zu schreiben;
 
Alexey Kozitsyn:
Starten Sie es und sehen Sie das Problem. Es scheint, dass nur Strukturen mit öffentlichen Feldern jetzt mit Gewerkschaften erlaubt sind. Dann wäre es möglich, struct = {0} zu schreiben;

Dies ist nicht der Fall.

 

Vielleicht habe ich Sie wieder falsch verstanden, aber dieser Code funktioniert ohne jegliche Warnungen:

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:

Vielleicht habe ich Sie wieder falsch verstanden, aber dieser Code funktioniert ohne jegliche Warnungen:

Das stimmt, die öffentlichen Strukturen werden initialisiert. Aber die Gewerkschaft hat damit nichts zu tun.


Interessanterweise wird, wenn eine Struktur mit einem verborgenen Feld zu einem öffentlichen Feld einer neuen Struktur gemacht wird, die neue Struktur auch nicht initialisiert, selbst wenn alle Felder offen sind.

 

Hallo, können Sie mir sagen, ob es möglich ist , ein Array zu deklarieren, indem Sie die Anzahl der Elemente in ihm mit einer Variablen angeben? Wenn nicht, wie kann dies geschehen?

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

Hallo, können Sie mir sagen, ob es möglich ist , ein Array zu deklarieren, indem Sie die Anzahl der Elemente in ihm mit einer Variablen angeben? Wenn nicht, wie kann dies geschehen?

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

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

Hallo, können Sie mir sagen, ob es möglich ist , ein Array zu deklarieren, indem Sie die Anzahl der Elemente in ihm mit einer Variablen angeben? Wenn nicht, wie kann dies geschehen?


ArrayResize()