mql5におけるOOP、テンプレート、マクロ、微妙な使い分け - ページ 14 1...789101112131415161718192021...28 新しいコメント Ilya Malev 2019.01.26 21:44 #131 Artyom Trishkin:1.司会者ならどうするかと考えるより、その場にあるものを話したほうがいい。そうしないと、本当にすべてが2つのスレッドに曖昧になってしまい、今では、モデレーターが「あそことあそこで議論すべき」と判断しても、投稿順や意味を保ったまま普通に議論を進めるのは、かなり手間のかかる作業になっています。 2) 司会者の行動について議論することは、すべてのくしゃみではありません...。いちいちくしゃみをするわけではないが、公に挑むなら、秩序を回復するためでも、狂乱を鎮めるためでもいい。そして、もしあなたが意見を持っているならば、それを表明することを誰が禁じるのですか?もしかしたら、あなたの意見は非常に合理的な提案なのですが、司会者の愛されないメニューに該当しないように、言うのを恐れているのではありませんか?だから、それはデタラメだ :) 分かりやすい説明ありがとうございます。本スレの貴重なはずの情報を散らかさないためにも、別スレで議論してもらった方が良いと思いました。もし、ポストを移動することになったら、どこに移動させるか相談します。 Artyom Trishkin 2019.01.26 21:46 #132 Ilya Malev:どのスレッドで何が適切かを判断するのは、まだモデレーターとは言えません。そしてモデレーターは、機能に関する議論は機能ブランチそのものではなく、別のブランチ、つまりここで行うべきであるとすでに明言しています。 クラスメソッドを 参照とT型値で統一して参照する方法が、説明では全くわかりません。何を言っているのかわからないが、私はそこでまさにこのことを話していたのだ。ここで状況ですが、すべてがそのスレッドでフォーラムメンバーが期待する仕様に合わせられるわけではないことに気がつきました。ここでの議論は(そこそこだったので、ここに移しましたが)かなり特殊な話題なので、別スレッドに分けることにしました。より一般的で、機能の大部分を理解できるようにし、ここで - クラス、マクロを含む、それらを使用してトリッキーな方法(多くのためのどのようなパズル)。 Artyom Trishkin 2019.01.26 21:49 #133 Ilya Malev:分かりやすい説明ありがとうございます。本スレの貴重なはずの情報を散らかさないためにも、別スレで議論してもらった方が良いと思いました。もし、ポストを移動することになったら、どこに移動させるか相談します。これからはそうしていこう。ただ - 可能であれば - あなたがそこから議論している例を、その例を参照するあなた自身の投稿にコピーしてください(どこから始まったのかが分からなくて困っているのです)。あるいは、投稿を編集できなくなったのであれば、どこから何を貼り付ければいいのか、非公開で教えてください。 Ilya Malev 2019.01.26 21:50 #134 Artyom Trishkin:これからは、このままにしておいてください。ただ - 可能であれば - そこから議論された例をあなたの投稿にコピーして、その例を参照してください(ここで何が始まったのか、私にはわかりにくいのですが)。もしくは、すでに投稿を編集できないのであれば、どこから何を貼り付ければいいのか、プライベートで教えてください。すでに数回前のそのスレッドからここにコードをコピーしたので、追加のアクションは必要ありません、イミフ。 Artyom Trishkin 2019.01.26 21:51 #135 Ilya Malev:すでに数回前の投稿でそのスレッドからコードをコピーしているので、余分な手順は必要ありません。よかったです。 Ilya Malev 2019.01.27 00:07 #136 テンプレートとスタティックによるインターフェイスの話題について更新しました。正確には、インターフェースではなく、任意の型に対するパラメトリックな操作を、外部クラスを通じて便利に実装したものです。この場合、比較(Comparer)と鋳造(Caster)である。 前回の批判に一部対応し、「インターフェイス」クラスは(インターフェイスではないが)パラメータクラスから継承しない(そんな方法は流行っていない...)、もちろん dynamic_cast は使わないでいる。このモデルがよりロジカルに見えるようになることを期待しています。 #property strict #define tnm typename #define ttt template<tnm T> #define ttf template<tnm F> #define ttr template<tnm R> #define tft template<tnm T,tnm F> #define up(P) (CheckPointer(P)!=POINTER_INVALID) enum ECMP{ EQUAL=0, GREATER=1, LESSER=-1, UNDEF=INT_MAX }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ ttt class Type { private: T item; public: Type(){ ZeroMemory( item ); } Type *operator= (T par){ item = par; return &this; } T Get(){ return item; } ttf int operator!= ( Type<F>&par ) { int r = Comparer< Type< T > *, Type< F > * >::Get().Compare( &this, &par ); if( r == UNDEF ) printf("Cannot compare %s to %s!",tnm(T),tnm(F)); else{ printf("%s (%s) to %s (%s) is %s", Caster<Type<T>*,string>::Get().Cast(&this), tnm(T), Caster<Type<F>*,string>::Get().Cast(&par), tnm(F), Caster<ECMP,string>::Get().Cast((ECMP)r)); } return r; } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ tft class Comparer { private: static Comparer *handle; public: Comparer(){ if( handle == NULL ) handle = &this; } static Comparer *Get(){ return handle ; } virtual ECMP Compare( T, F ){ return UNDEF; } }; //--- tft Comparer *Comparer::handle=NULL; tft class Caster { private: static Caster *handle; public: Caster(){ if( handle == NULL ) handle = &this; } static Caster *Get(){ return handle ; } virtual F Cast( T ){ F r; ZeroMemory(r); return r; } }; //--- tft Caster *Caster::handle=NULL; ttt class ToStrCaster: public Caster<T,string> { public: virtual string Cast( T ){ return "N/A"; } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CmpIntToInt: public Comparer<Type<int>*,Type<int>*> { public: virtual ECMP Compare( Type<int>* op1, Type<int>* op2 ){ return ECMP(up(op1)&&up(op2)?(op1.Get()>op2.Get())-(op1.Get()<op2.Get()):UNDEF); } } citi; class CmpDoubleToDouble: public Comparer<Type<double>*,Type<double>*> { public: virtual ECMP Compare( Type<double>* op1, Type<double>* op2 ){ return ECMP(up(op1)&&up(op2)?int(op1.Get()-op2.Get()>DBL_EPSILON)-int(op2.Get()-op1.Get()>DBL_EPSILON):UNDEF); } } cdtd; class CmpStrToStr: public Comparer<Type<string>*,Type<string>*> { public: virtual ECMP Compare( Type<string>* op1, Type<string>* op2 ){ return ECMP(up(op1)&&up(op2)?StringCompare(op1.Get(),op2.Get()):UNDEF); } } csts; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class IntToStrCaster: public ToStrCaster<Type<int>*> { public: virtual string Cast( Type<int>* par ){ return up(par)?IntegerToString(par.Get()):NULL; } } itsc; class DoubleToStrCaster: public ToStrCaster<Type<double>*> { public: virtual string Cast( Type<double>* par ){ return up(par)?DoubleToString(par.Get(),6):NULL; } } dtsc; class StringToStrCaster: public ToStrCaster<Type<string>*> { public: virtual string Cast( Type<string>* par ){ return up(par)?par.Get():NULL; } } stsc; class ECMPToStrCaster: public ToStrCaster<ECMP> { public: virtual string Cast( ECMP par ){ return EnumToString(par); } } etsc; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnStart() { Type<int> t1=AccountNumber(), t2=AccountLeverage(); Type<double> t3=Ask, t4=Bid; Type<string> t5=_Symbol; t1!=t2; t4!=t3; t5!=t5; t1!=t3; t2!=t5; } Igor Makanu 2019.08.14 14:36 #137 このコード部分に対してマクロを書くことは、どの程度現実的なのでしょうか? input int InDealType_01=17; input int InDealType_02=22; ..... input double InVolume_01 = 0.1; input double InVolume_02 = 0.3; ..... EA.AddDealsSettings(InDealType_01,InVolType_01,InVolume_01,InPrice_01,InVolCoeff_01,InClosePips_01,Mirror); EA.AddDealsSettings(InDealType_02,InVolType_02,InVolume_02,InPrice_02,InVolCoeff_02,InClosePips_02,Mirror); EA.AddDealsSettings(InDealType_03,InVolType_03,InVolume_03,InPrice_03,InVolCoeff_03,InClosePips_03,Mirror); EA.AddDealsSettings(InDealType_04,InVolType_04,InVolume_04,InPrice_04,InVolCoeff_04,InClosePips_04,Mirror); EA.AddDealsSettings(InDealType_05,InVolType_05,InVolume_05,InPrice_05,InVolCoeff_05,InClosePips_05,Mirror); EA.AddDealsSettings(InDealType_06,InVolType_06,InVolume_06,InPrice_06,InVolCoeff_06,InClosePips_06,Mirror); EA.AddDealsSettings(InDealType_07,InVolType_07,InVolume_07,InPrice_07,InVolCoeff_07,InClosePips_07,Mirror); EA.AddDealsSettings(InDealType_08,InVolType_08,InVolume_08,InPrice_08,InVolCoeff_08,InClosePips_08,Mirror); EA.AddDealsSettings(InDealType_09,InVolType_09,InVolume_09,InPrice_09,InVolCoeff_09,InClosePips_09,Mirror); EA.AddDealsSettings(InDealType_10,InVolType_10,InVolume_10,InPrice_10,InVolCoeff_10,InClosePips_10,Mirror); 入力変数(input)の数がまだ決まっていないので、割り付け部分の修正に疲れました、1行のマクロは問題ないのですが、10~15行に増やすにはどうしたらいいのかわかりません 削除済み 2019.08.14 17:37 #138 Igor Makanu: このコード部分のマクロを作るのは現実的にどうなんでしょうか? 入力変数の数がまだ決まっていない(入力)、選択部分の修正に手間取る、1行のマクロは問題ないが、10~15行に増やす方法がわからない。 一応言っておきますが、µlで確認したわけではなく、テストのためにsishのプリプロセッサを通しただけです、µlには癖があるので、微調整が必要な場合は。 #define ARGS HLP(InDealType_) \ HLP(InVolType_), \ HLP(InVolume_), \ HLP(InPrice_), \ HLP(InVolCoeff_), \ HLP(InClosePips_), \ Mirror #define _CAT(L, R) L##R #define CAT(L, R) _CAT(L, R) #define HLP(ARG) CAT(ARG, INDEX) #define INDEX 01 EA.AddDealsSettings(ARGS); #undef INDEX #define INDEX 02 EA.AddDealsSettings(ARGS); #undef INDEX #define INDEX 03 EA.AddDealsSettings(ARGS); #undef INDEX が出力されました(gcc -E)。 EA.AddDealsSettings(InDealType_01 InVolType_01, InVolume_01, InPrice_01, InVolCoeff_01, InClosePips_01, Mirror); EA.AddDealsSettings(InDealType_02 InVolType_02, InVolume_02, InPrice_02, InVolCoeff_02, InClosePips_02, Mirror); EA.AddDealsSettings(InDealType_03 InVolType_03, InVolume_03, InPrice_03, InVolCoeff_03, InClosePips_03, Mirror); ARGSリストへの追加引数/寄贈。 Vladimir Simakov 2019.08.14 17:40 #139 Igor Makanu: このコード部分のマクロを書くのは現実的にどうなんでしょうか? 入力変数(input)の数がまだ決まっていないので、割り付け部分の修正に疲れました、1行のマクロは問題ないのですが、10~15行に増やすにはどうしたらいいのかわかりません #define TEST(dId) EA.AddDealsSettings(InDealType_##dId,InVolType_##dId,InVolume_##dId,InPrice_##dId,InVolCoeff_##dId,InClosePips_##dId,Mirror) #define TEST2(d1,d2) do {TEST(d1);TEST(d2);} while(false) #define TEST3(d1,d2,d3) do{TEST2(d1,d2);TEST(d3);} while(false) #define TEST4(d1,d2,d3,d4) do{TEST2(d1,d2);TEST(d3,d4);} while(false) .... #define TEST100(d1,...d100) do{TEST50(d1,...d50);TEST50(d51,...d100);}while(false) void OnStart() { .... TEST4(01,02,03,04); ...... } 今のところ、そう来るだけです。もし開発者がC言語のようにパラメータの数を可変にすれば、もっと短くできたかもしれません。 削除済み 2019.08.14 17:49 #140 Vladimir Simakov: 今のところ、これしか思いつきません。C言語のように開発者が可変のパラメータをねじ込めば、もっと短くすることができるはずです。 何か複雑化しすぎましたね)。 そして、最初の1枚を使わせる、それが一番いいんでしょうね。 #define TEST(dId) TESTは何度か書いても問題ないです。 1...789101112131415161718192021...28 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
1.司会者ならどうするかと考えるより、その場にあるものを話したほうがいい。そうしないと、本当にすべてが2つのスレッドに曖昧になってしまい、今では、モデレーターが「あそことあそこで議論すべき」と判断しても、投稿順や意味を保ったまま普通に議論を進めるのは、かなり手間のかかる作業になっています。
2) 司会者の行動について議論することは、すべてのくしゃみではありません...。いちいちくしゃみをするわけではないが、公に挑むなら、秩序を回復するためでも、狂乱を鎮めるためでもいい。そして、もしあなたが意見を持っているならば、それを表明することを誰が禁じるのですか?もしかしたら、あなたの意見は非常に合理的な提案なのですが、司会者の愛されないメニューに該当しないように、言うのを恐れているのではありませんか?だから、それはデタラメだ :)
分かりやすい説明ありがとうございます。本スレの貴重なはずの情報を散らかさないためにも、別スレで議論してもらった方が良いと思いました。もし、ポストを移動することになったら、どこに移動させるか相談します。
どのスレッドで何が適切かを判断するのは、まだモデレーターとは言えません。そしてモデレーターは、機能に関する議論は機能ブランチそのものではなく、別のブランチ、つまりここで行うべきであるとすでに明言しています。
クラスメソッドを 参照とT型値で統一して参照する方法が、説明では全くわかりません。何を言っているのかわからないが、私はそこでまさにこのことを話していたのだ。
ここで状況ですが、すべてがそのスレッドでフォーラムメンバーが期待する仕様に合わせられるわけではないことに気がつきました。ここでの議論は(そこそこだったので、ここに移しましたが)かなり特殊な話題なので、別スレッドに分けることにしました。より一般的で、機能の大部分を理解できるようにし、ここで - クラス、マクロを含む、それらを使用してトリッキーな方法(多くのためのどのようなパズル)。
分かりやすい説明ありがとうございます。本スレの貴重なはずの情報を散らかさないためにも、別スレで議論してもらった方が良いと思いました。もし、ポストを移動することになったら、どこに移動させるか相談します。
これからはそうしていこう。ただ - 可能であれば - あなたがそこから議論している例を、その例を参照するあなた自身の投稿にコピーしてください(どこから始まったのかが分からなくて困っているのです)。あるいは、投稿を編集できなくなったのであれば、どこから何を貼り付ければいいのか、非公開で教えてください。
これからは、このままにしておいてください。ただ - 可能であれば - そこから議論された例をあなたの投稿にコピーして、その例を参照してください(ここで何が始まったのか、私にはわかりにくいのですが)。もしくは、すでに投稿を編集できないのであれば、どこから何を貼り付ければいいのか、プライベートで教えてください。
すでに数回前のそのスレッドからここにコードをコピーしたので、追加のアクションは必要ありません、イミフ。
すでに数回前の投稿でそのスレッドからコードをコピーしているので、余分な手順は必要ありません。
よかったです。
テンプレートとスタティックによるインターフェイスの話題について更新しました。正確には、インターフェースではなく、任意の型に対するパラメトリックな操作を、外部クラスを通じて便利に実装したものです。この場合、比較(Comparer)と鋳造(Caster)である。
前回の批判に一部対応し、「インターフェイス」クラスは(インターフェイスではないが)パラメータクラスから継承しない(そんな方法は流行っていない...)、もちろん dynamic_cast は使わないでいる。このモデルがよりロジカルに見えるようになることを期待しています。
このコード部分に対してマクロを書くことは、どの程度現実的なのでしょうか?
入力変数(input)の数がまだ決まっていないので、割り付け部分の修正に疲れました、1行のマクロは問題ないのですが、10~15行に増やすにはどうしたらいいのかわかりません
このコード部分のマクロを作るのは現実的にどうなんでしょうか?
入力変数の数がまだ決まっていない(入力)、選択部分の修正に手間取る、1行のマクロは問題ないが、10~15行に増やす方法がわからない。
一応言っておきますが、µlで確認したわけではなく、テストのためにsishのプリプロセッサを通しただけです、µlには癖があるので、微調整が必要な場合は。
が出力されました(gcc -E)。
ARGSリストへの追加引数/寄贈。
このコード部分のマクロを書くのは現実的にどうなんでしょうか?
入力変数(input)の数がまだ決まっていないので、割り付け部分の修正に疲れました、1行のマクロは問題ないのですが、10~15行に増やすにはどうしたらいいのかわかりません
今のところ、そう来るだけです。もし開発者がC言語のようにパラメータの数を可変にすれば、もっと短くできたかもしれません。
今のところ、これしか思いつきません。C言語のように開発者が可変のパラメータをねじ込めば、もっと短くすることができるはずです。
何か複雑化しすぎましたね)。
そして、最初の1枚を使わせる、それが一番いいんでしょうね。
#define TEST(dId)
TESTは何度か書いても問題ないです。