mql5言語の特徴、微妙なニュアンスとテクニック - ページ 112

 
Alexey Navoykov:
ところで、一般的なケースとして、関数の戻り値の型が絶対型である場合、この問題はMQLの手段では解決できないという結論に至りました。 ここでは存在しないdecltypeが必要です。

ポインタは戻るが、構造体は......そうとは思えなかった。やはり、参考までにすべきですね。

 
fxsaber:

同じです。

これで、関数に渡される引数が3つから2つになりました。

MacrosFunc(SelectHandle(Memory(A, false)), SelectHandle(Memory(A)) ? B : 0)
 
Alexey Navoykov:

現在では、一般的に3つの引数が関数に渡されるのではなく、2つの引数が渡されます。

2は絶対に元の問題です。そして3は、その一般化です。

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

エラー、バグ、質問

fxsaber さん 2018.12.21 22:15

NewHandle - は定数にすることができることを明確にしましょう。I.e. 有効な呼び出し
time = MACROS(0, TimeCurrent()); // TimeCurrent из 0-хендла.
time = MACROS(1, TimeCurrent()); // TimeCurrent из 1-хендла.

MACROS(0, SymbolInfoTick(_Symbol, Tick)); // SymbolInfoTick из 0-хендла.

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
Price = MACROS(3, Bid); // Bid из 3-хендла.
例を見る限り、マクロに求められているものは明らかなようです。
 

C++規格ではこの順番は定義されておらず、コンパイラに任されている。MQL開発者は、この順番が変更可能か、将来的に変更する予定があるかどうかを確認する必要があります。

したがって、これが一番いい方法だと思います。

template <typename T1, typename T2>
T2 MacrosFunc( const T1 handle, const T2 Value )
{
  SelectHandle(Memory(handle, false));
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(A,  SelectHandle(Memory(A)) ? (B) : NULL)
 
Alexey Navoykov:

C++規格ではこの順番は定義されておらず、コンパイラに任されている。MQL開発者は、この順番が変更可能か、将来的に変更する予定があるかどうかを確認する必要があります。

だから、こっちの方がいいんです。

はい、より信頼性が高くなりました。

 

編集部の皆様、お手上げです。

インタプリタがどのようにコードを解釈するかを理解せずに、インタプリタにコードを渡すこと...。王道ですね。

 

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

バグ、バグ、質問

fxsaber さん 2018.12.21 10:23

どうしても分からないので、ヒントを求めてください。そのような時間の取得があります

int GetHandle() { return(0); }

bool SelectHandle( int ) { return(true); }
  
int NewHandle = 0;  
int PrevHandle = GetHandle();    

datetime time = SelectHandle(NewHandle) ? TimeCurrent() : 0;  
SelectHandle(PrevHandle);


同じことをするマクロの書き方

time = MACROS(NewHandle, TimeCurrent()); // Макрос


問題は、マクロ内でPrevHandleが作成されていないことです。

なぜ私の解答の方が悪いのか理解できないので、ここにも貼り付けておきます。

//handle_t MACROS_helper_PrevHandle;
int MACROS_helper_PrevHandle;
template <typename T>
T macros_helper_fn(T t)  {SelectHandle(MACROS_helper_PrevHandle); return t;}     
#define  MACROS(NEW_HANDLE_, FN_)  ((MACROS_helper_PrevHandle=GetHandle())*0 == 0 ?     \
                                    SelectHandle(NEW_HANDLE_) ? macros_helper_fn(FN_) : 0 : 0)

注目すべきは、トレンド演算子によるカンマ演算子の実装です(まあ、何も素晴らしいことはないのですが、初めて遭遇しました)。

明確ではありません。なぜ、テンプレートを通してハンドルタイプを引くのですか?ハンドルに種類があるのでしょうか、大したことではありません。また、一般にハンドルの型はtypedef/defineで指定することになります。

 
pavlick_:

私の解答が悪いとは思えませんので、ここにも書いておきますね。

注目すべき点 - trend演算子によるカンマ演算子の実装(まあ、大したことはないのですが、初めて出会いました)。

なぜ、テンプレートを通してハンドルタイプを引く必要があるのか、明確ではありません。ハンドルに種類があるのでしょうか、大したことはありません。また、一般にハンドルの型はtypedef/defineで指定することになります。

全然ダメなんです。ハンドルネームとは?

 
Алексей Тарабанов:

全然ダメなんです。ハンドルネームとは?

タスクの条件は、「ディスクリプタ(ハンドル)を介して変化する環境があり、1つのマクロで実装する必要がある」というものでした。

1.現在のハンドルを記憶する

2.環境を新しいハンドルに切り替える

3.環境から必要なパラメータを取得する

4.旧ハンドルへの環境切替

5.リターンパラメータ

 
pavlick_:

タスクの条件は、「ディスクリプタ(ハンドル)を介して変化する環境があり、1つのマクロで実装する必要がある」というものでした。

1.現在のハンドルを記憶する

2.環境を新しいハンドルに切り替える

3.環境から目的のパラメータを取得する

4.旧ハンドルに環境を変更する

5.リターンパラメータ

ご返信ありがとうございました。

理由: