MQL4の新しい構文 - ページ 5

 
gchrmt4:
まだ理解できていませんが・・・。MQL4のインポートを void*と宣言することは出来ないと思います。インポートでは特定のデータ型を使用する必要があり、そのデータ型ではDLLインポートしか使用できません。もし、同じDLL関数を異なるデータ型で使いたい場合は、https://www.mql5.com/en/forum/148934 のような回避策がない限り、問題が発生します。


実際、私はある回避策を使っていますが、これはかなり弱いもので、どんな型でも汎用構造体にラップしてしまいます。汎用構造体をパラメータとして受け入れることは、将来のリリースで変更される可能性があります。ただし、これは配列では動作しません。

 
Ovo:


実は、私はある回避策を使っているのですが、これは非常に弱く、あらゆる型を汎用構造体にラップしてしまいます。汎用構造体をパラメータとして受け入れることは、将来のリリースで変更される可能性があります。

...どうやら、私が間違っているようです。私たちが忘れているのは、MQL4では関数の オーバーロードができるようになったので、このようなことができるようになったということです。

#import "AnyDll.dll"
   void Test(TestStruct &[]);
   void Test(int &[]);
#import 
 
gchrmt4:

...どうやら私が間違っているようです。私たちが忘れているのは、MQL4では関数のオーバーロードができるようになったので、このようなことができるようになったということです。


もちろん、それは私が最初から話していることです :)

今のところ、私のイン ポートは以下のような感じです。

bool ReadFile(int, MT4Structure&, uint, uint&[],int); // wrapper for all simple types / structures
bool ReadFile(int, double&[], uint, uint&[],int);
bool ReadFile(int, int&[], uint, uint&[],int);
bool ReadFile(int, uchar&[], uint, uint&[],int);
bool ReadFile(int, MT4Structure&[], uint, uint&[],int); // this does not work

そして、このリスト(1つのインポート用)が1年後にどれだけ長くなっているか...。

 

また、インクルード ファイルに依存するコードのコンパイルに小さな不一致があることにも気づきました。

複数のプロジェクトが 同じインクルードを共有し、インクルードファイルが変更された場合、最初のプロジェクトはそれを検知して再コンパイルしますが、次のプロジェクトはそうしません。しかし、これは深刻な問題ではありません(ex4はいつでも削除できます)。

 

今日は検索するのが面倒なので、簡単な回答だけお願いします。scope2が ブロック境界に到達する前に破壊することは可能でしょうか?私はそうは思いませんが、質問する方が良いでしょう。

{
   MT4Scope* scope = new MT4Scope(_Symbol, 222);
   MT4Scope scope2(_Symbol, 223);
   delete scope; // calls destructor
   // here I want to call scope2 destructor, but I do not know how

   // some additional code
}
 
Ovo: 今日は検索するのが面倒なので、簡単な回答だけお願いします。scope2が ブロック境界に到達する前に破壊することは可能でしょうか?私はそうは思いませんが、聞いたほうがいいでしょう。
いいえ。
 
ubzen:
いいえ。


ありがとうございます。
 

MT4 600+とMT5で「ArrayMaximum」が異なるのはなぜですか? MT4の構文をMT5の構文に移行した理由は、両方で動作するアプリケーションを簡単に開発できるようにするためだと思ったのですが......?


MT4

int  ArrayMaximum(
   const void&   array[],             // array for search
   int           count=WHOLE_ARRAY,   // number of checked elements
   int           start=0              // index to start checking with
   );


MT5

int  ArrayMaximum(
   const void&   array[],             // array for search
   int           start=0,             // index to start checking with
   int           count=WHOLE_ARRAY    // number of checked elements
   );
 
dlewisfl:

MT4 600+とMT5で「ArrayMaximum」が異なるのはなぜですか? MT4の構文をMT5の構文に移行した理由は、両方で動作するアプリケーションを簡単に開発できるようにするためだと思ったのですが......?

おそらく、後方互換性を維持しようとするためでしょう.
 
dlewisfl: MT4 600+とMT5で「ArrayMaximum」が異なるのはなぜですか? MT4の構文をMT5の構文に移行した理由は、両方で動作するアプリケーションを簡単に開発できるようにするためだと思ったのですが......?
まずいな。だから自分で作れ。
int iArrayMaximum(const void& array[], int iLimit=WHOLE_ARRAY, int iBeg=0){
   if(iLimit == WHOLE_ARRAY) iLimit = ArraySize(array);
#ifdef __MQL4__
   return( ArrayMaximum(array, iLimit - iBeg + 1, iBeg) );
#else
   return( ArrayMaximum(array, iBeg, iLimit - iBeg + 1) );
#endif
}
問題解決。