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

 
Andrey Dik:


サードパーティのエディタでテキストの外観を変更することで変更されていることはわかるのですが、どのエンコーディングをどう見分ければいいのかがわからないのです。
Andrey Khatimlianskii:
ME 1580でEAを作成 しただけです: Win-1251 (ANSI)です。

はい、AkepadではエンコーディングがWin-1251(ANSI)になっていますが、古いファイルではUTF-16LE 1200になっていますね。

つまり、新しいファイルのデフォルトエンコーディングを変更するのですね。

 

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

mql5言語の特徴、微妙なニュアンスとコツ

fxsaber さん 2017.04.14 11:40

そう、悪徳ブローカーだ。マイナスの数字も入れてくるし。

ブローカーがシンボルを設定する際に、開発者が各パラメータの値の取り得る範囲に制限を設けると良いと思うのです。

 

マーケットプレイスから商品を更新すると、チャート上のその商品のすべての設定がデフォルトにリセットされることに気づきました。

これはおかしい、どうしたら回避できるのか?

 

ArrayMaximum() および ArrayMinimum() - パラメータを渡す順序がヘルプと一致しない。


削除済み  
fxsaber:
ちょっとしたノウハウ代入演算 子のバイパス

結果

チップではなく、変態です。

まさか、そんなことを言われるとは思わなかった。

 
Koldun Zloy:

スマートな仕掛けではなく、倒錯しているのです。

私はあなたにそれを期待していませんでした。

だから、これはあなたのためのものです

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

ライブラリ: TypeToBytes

fxsaber さん 2017.04.13 13:34

この機能が潜在的なエラーを発見するのに有効な例です。

スクリプトを書き、実行する。

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}


結果

_WRONG_ASSIGN_OPERATOR(STRUCT) = true

これは、代入演算子が構造体を同じ型の構造体にコピーしないことを示す。


これ以上、構造を増やしたら

  void operator =( STRUCT &Value ) { this.i = 0; }

を選択しても、結果は同じです。


この演算子を変更することで、一見すると

  void operator =( STRUCT &Value ) { this.i = Value.i; }

が、図書館にはそうでないと書いてある。


これが、この例の最も微妙なポイントかもしれません。

で修正します。

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}

  void operator =( const STRUCT &Value ) { this.i = Value.i; }
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}

という結果が得られます。

_WRONG_ASSIGN_OPERATOR(STRUCT) = false


これで、コピー演算子が正しくなりました

また、単純な構造 であれば、割り当てやコピーの演算子の正しさも同様に確認することができる。

削除済み  

1.このように書くと

STRUCT StructCopy1 = Struct;
呼び出すべきはoperator=ではなく、コピーコンストラクタです。

とはいえ、それはどちらかというとメタクオーツへの質問ですね。

2.コンパイラが作成したコピーコンストラクタが呼ばれない場合は、自分で書けばよい。

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = other.i;
  }
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

これでoperator=は呼ばれなくなった。

3.構造体のメンバが 用意されているのだから、そのように書けばいいだけだ。

StructCopy1.i = Struct.i;

でも、プライベートにしてしまうと、ティップフックも役に立ちません。

4.そして最も重要なことは、すべての代入がoperator=を経由し、それを回避しないことを保証するために使用されることです。

通常、コピーコンストラクタも一緒に定義します。

はい、サンプルに目を通しました。あまり利益は見込めませんでした。

 
Koldun Zloy:

1.このように書くと

呼び出すべきはoperator=ではなく、コピーコンストラクタです。

とはいえ、それはどちらかというとメタクオーツへの質問ですね。

2.コンパイラが作成したコピーコンストラクタが呼ばれない場合は、自分で書けばよい。

これでoperator=は呼ばれなくなった。

3.構造体のメンバが 用意されているのだから、そのように書けばいいだけだ。

でも、プライベートにしてしまうと、ティップフックも役に立ちません。

4.そして最も重要なことは、すべての代入がoperator=を経由し、それを回避しないことを保証するために使用されることです。

通常、コピーコンストラクタも一緒に定義します。

はい、サンプルに目を通しました。あまり利益は見込めませんでした。

Lifehackはコピーコンストラクタもバイパスします。そして、その特典はこちら
#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = 2;
  }
  
  void operator =( const STRUCT& )
  {
//    Print(__FUNCSIG__);
    
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Struct(1);  

  ArrayPrint(_R(Struct).Bytes); // 1 0 0 0
  
  STRUCT StructCopy1 = Struct;  // STRUCT( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 2 0 0 0
    
  StructCopy1 = Struct;         // void STRUCT::operator=( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 5 0 0 0
}

_Rは普遍的なものです。だから、エイリアンの構造を独自の演算子で再定義する必要はないんです。

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Structs[] = {{1}, {2}};
  
  ArrayPrint(_R(Structs).Bytes); // 1 0 0 0 2 0 0 0
}
 
Andrey Dik:

はい、AkepadではエンコーディングがWin-1251(ANSI)になっていますが、古いファイルではUTF-16LE 1200になっていますね。

ということは、やはり新しいファイルのデフォルトエンコーディングが変わったのでしょうか?

いいえ、ずっとWin-1251(ANSI)で、いつのまにかUTFが追加されていました。ただし、非Ansi文字を含むソースファイルのみ。
 
Andrey Khatimlianskii:
いや、ずっとWin-1251(ANSI)で、ある時期からUTFが追加されたんです。ただし、非Ansi文字が含まれるソースに限ります。
なるほど。ありがとうございます。