エラー、バグ、質問 - ページ 1991

 
Alexey Kozitsyn:
構造体にデフォルトコンストラクタを追加する。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

fxsaber さん 2017.09.06 09:38

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

不注意な私:)なぜこれが必要なのか、説明していただけますか?なぜコンストラクタが使えないのですか?

それとも、閉じたフィールドで構造体を初期化した場合のエラーを表示するためでしょうか?

 
Alexey Kozitsyn:

不注意な私:)なぜこれが必要なのか、説明していただけますか?なぜコンストラクタが使えないのですか?

というのも、自分でコードを書いているときに、自分の構造体がユニオンに関与している場面に出くわしたからです。空のコンストラクタを使った解決策はすぐに思い浮かびましたが、私のコードにはユニオンがあるのが玉に瑕でした。だから、私を退屈させるためではなく、実用のためにこの質問をしたのです。


この「バグ」を回避するために、このような工夫をしたのです(バグなのか、 そうでないのか?)

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


他の解決策はまだ見ていません。

削除済み  
fxsaber:
実行し、問題を確認した。現在、ユニオンを使用できるのは、パブリックフィールドを持つ構造物のみとなっているようです。そうすると、struct = {0}と書くことが可能になります。
 
Alexey Kozitsyn:
実行し、問題を確認した。現在、ユニオンを使用できるのは、パブリックフィールドを持つ構造物のみとなっているよう です。そうすると、struct = {0}と書くことが可能になります。

ということはありません

削除済み  
fxsaber:

ということはありません

また誤解していたのかもしれませんが、このコードは警告を出さずに動作します。

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:

また誤解していたのかもしれませんが、このコードは警告を出さずに動作します。

そうです、パブリック構造体が初期化されるのです。しかし、組合は関係ない。


興味深いことに、非表示フィールドを持つ構造体を新しい構造体の公開フィールドにすると、すべてのフィールドが開かれていても、新しい構造体も初期化されません。

 

こんにちは、配列の 要素数を変数で指定して宣言 することは可能かどうか教えてください。そうでない場合は、どうすればよいのでしょうか。

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

こんにちは、配列の 要素数を変数で指定して宣言 することは可能かどうか教えてください。そうでない場合は、どうすればよいのでしょうか。

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

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

こんにちは、配列の 要素数を変数で指定して宣言 することは可能かどうか教えてください。そうでない場合は、どうすればよいのでしょうか。


ArrayResize()