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

 
fxsaber:

デフォルトのコピー演算子が発動する。

難しくないのであれば、どこで読めますか?

 

MQL4/5を使って、メールやSMSから情報を読み取る方法を教えてください。例えば、私が情報シグナルをメールで受信し、Expert Advisorがそれを読んでポジションをオープン/クローズ します。

 
fxsaber:

デフォルトのコピー演算子が発動する。

ドキュメントにはこんなことも書いてありました(下から3行目に注目)。

https://www.mql5.com/ru/docs/basis/types/casting

class CBar { };
class CFoo : public CBar { };
 
void OnStart()
  {
   CBar bar;    
//--- динамическое приведение типа указателя *bar к указателю *foo разрешено 
   CFoo *foo = dynamic_cast<CFoo *>(&bar); // критической ошибки выполнения не возникнет   
   Print(foo);                             // foo=NULL      
//--- попытка явного приведения ссылки объекта типа Bar к объекту типа Foo запрещено
   foo=(CFoo *)&bar;                       // возникнет критическая ошибка выполнения
   Print(foo);                             // эта строка не будет выполнена
  }

単純な構造体へのコピー(memcpy風)は可能だったと記憶していますが、私の構造体は単純ではありません。

 
pavlick_:

単純な構造体へのコピー(ダムmemcpy風)は可能だったと記憶しているが、単純な構造体は持って いない。

MQL5が変わりました。

 
fxsaber:

MQL5が変わりました。

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

MetaTrader 5 build 1640の新バージョン:独自の金融商品の作成とテスト

メタクォーツ・ソフトウェア株式会社, 2017.07.19 18:03

MetaTrader 5プラットフォームビルド1640の新バージョン:独自の金融商品の作成とテスト

  1. MQL5: 構造体やクラスのオブジェクトに対する暗黙のコピー演算子の自動生成 機能を追加しました。これでコンパイラはコピー演算子を自動的に生成し、b=aのようなオブジェクトの簡単なレコードを書くことができるようになった。
    class Foo
      {
       int               value;
    public:
       string Description(void){return IntegerToString(value);};
       //--- конструктор по умолчанию
                         Foo(void){value=-1;};
       //--- конструктор с параметрами   
                         Foo(int v){value=v;};
      };
    //+------------------------------------------------------------------+
    //|  структура, содержащая объекты типа Foo                          |
    //+------------------------------------------------------------------+
    struct MyStruct
      {
       string            s;
       Foo               foo;
      };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       MyStruct a,b;
       Foo an_foo(5);
       a.s="test";
       a.foo=an_foo;
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    //---
       Print("b=a");
       b=a;
    //---
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    /*
       Результат выполнения;
       a.s=test a.foo.Description()=5
       b.s= b.foo.Description()=-1
       b=a
       a.s=test a.foo.Description()=5
       b.s=test b.foo.Description()=5
    */
      }
    暗黙演算子は、オブジェクトを心でコピーする。

    • メンバがオブジェクトの場合、このオブジェクトに対応するコピー演算子が呼び出される。
    • メンバーがオブジェクトの配列である場合、各要素に対して適切なコピー演算子を呼び出す前に、受信配列はArrayResizeによって必要なサイズに拡大または縮小されます。
    • メンバが単純型の配列である場合、コピーには ArrayCopy 関数を使用する。
    • メンバーがオブジェクトへのポインタの場合、ポインタそのものがコピーされ、それが指すオブジェクトはコピーされません。

    必要であれば、オーバーロードを 使用して暗黙のコピー演算子の代わりに、動作をオーバーライドして独自のバリアントを作成することができます。
 

ファクスセーバー

ありがとうございます、これで納得です。喜ぶべきか、喜ばざるべきか、わからない。旧コードとの互換性が崩れている。このような重要な変更には、コンパイルスイッチや#pragmaを使用して、新しい機能を強制的に起動させるようにするのが良い方法です。


例えば、私のauto_ptr:

template <typename T_>
class auto_ptr
{
public:
   T_ *p;
   void reset()  {if(this.p) delete this.p; this.p=NULL;}
   auto_ptr(void *ptr=NULL): p(ptr)  {}
   ~auto_ptr()  {this.reset();}
   void swap(auto_ptr<T_> &other)
   {
      T_ *buf = this.p;
      this.p = other.p;
      other.p = buf;
   }
};

さて、新しいコードでは(コピー演算子/コンストラクタが沈黙していない限り)auto_ptrがコピーできることが判明し、1つのポインタが複数削除されることになります。

 
 

File MQL5⇄Include⇄Controls⇄SpinEdit.mqh

intMaxValue(void) const { return(m_min_value); }.

 

MT4のダウンロード方法を教えてください。
mt4setup.exeをダウンロードし、インストールしましたが、mt5がインストールされました。

 
lukyF: MT4の入手方法を教えてください。

mt4setup.exeをダウンロードし、インストールしましたが、mt5がインストールされました。

mt4はブローカーからダウンロードすることができます。この質問は毎週のように出てくるのですが...。