mql5におけるOOP、テンプレート、マクロ、微妙な使い分け - ページ 28 1...2122232425262728 新しいコメント Maxim Kuznetsov 2020.08.30 09:39 #271 Vladimir Simakov:あなたの特別な問題は、このように解決されるはずです。 string MakeRequest(string md5txt){ static ENUM_STATISTICS intIndex[]={STAT_CONPROFITMAX_TRADES, STAT_MAX_CONPROFIT_TRADES, STAT_CONLOSSMAX_TRADES, STAT_MAX_CONLOSS_TRADES, STAT_DEALS, STAT_TRADES, STAT_PROFIT_TRADES, STAT_LOSS_TRADES, STAT_SHORT_TRADES, STAT_LONG_TRADES, STAT_PROFIT_SHORTTRADES, STAT_PROFIT_LONGTRADES, STAT_PROFITTRADES_AVGCON, STAT_LOSSTRADES_AVGCON}; string ret="INSERT INTO \"TesterStatistics\" + StringFormat(" set md5= %d ,md5txt), for (int i=0,ii=0;i<=STAT_LOSSTRADES_AVGCON;++i){ ret+=","; if (i==intIndex[ii]){ ret+=StringFormat("%s = %d,",EnumToString((ENUM_STATISTICS)i),(int)TesterStatistics((ENUM_STATISTICS)i) )); ++ii;} else ret+=StringFormat("%s =%G",EnumToString((ENUM_STATISTICS),i),TesterStatistics((ENUM_STATISTICS)i));} return ret;} DatabaseExecute(handleDB, MakeRequest("md5txt")); a small fix, with more brackets to fix :-) 本題は、UPDATE x VALUES () ではなく、UPDATE x SET name1=value1,name2=value2 にすることです。データベース構造が変更されたときに、リストされたフィールドの順序に依存せず、クエリーが正しく動作するようにするため Igor Makanu 2020.09.01 15:12 #272 データベースからテキストフィールドを 読み込んでenumに変換する場合、およそ次のようなコードがあります。 class MyClass { public: enum A {Aq, Aw, Ae, Ar, At, Ay}; enum B {Bq, Bw, Be}; enum C {Cq, Cw, Ce, Cr}; static bool txtToEnumA(const string txt, A &result); static bool txtToEnumB(const string txt, B &result); static bool txtToEnumC(const string txt, C &result); }; //+------------------------------------------------------------------+ static bool MyClass::txtToEnumA(const string txt, A &result) { for(int i = 0; i <= (int)A::Ay; i++) { if(StringCompare(EnumToString((A)i), txt) == 0) { result = (MyClass::A)i; return(true); } } return(false); } //+------------------------------------------------------------------+ static bool MyClass::txtToEnumB(const string txt, B &result) { for(int i = 0; i <= (int)B::Be; i++) { if(StringCompare(EnumToString((B)i), txt) == 0) { result = (MyClass::B)i; return(true); } } return(false); } //+------------------------------------------------------------------+ static bool MyClass::txtToEnumC(const string txt, C &result) { for(int i = 0; i <= (int)C::Cr; i++) { if(StringCompare(EnumToString((A)i), txt) == 0) { result = (MyClass::C)i; return(true); } } return(false); } //+------------------------------------------------------------------+ void OnStart() { MyClass::A a; MyClass::B b; MyClass::C c; string txt[] = {"Aq", "Bw", "No"}; if(MyClass::txtToEnumA(txt[0], a)) Print(txt[0], " in A = ", EnumToString(a)); else Print("Error, ", txt[0], " not in A"); if(MyClass::txtToEnumB(txt[1], b)) Print(txt[1], " in B = ", EnumToString(b)); else Print("Error, ", txt[1], " not in B"); if(MyClass::txtToEnumC(txt[2], c)) Print(txt[2], " in C = ", EnumToString(c)); else Print("Error, ", txt[2], " not in C"); } //+------------------------------------------------------------------+ 2020.09.01 18:59:02.593 tst (EURUSD,M5) Aq in A = Aq 2020.09.01 18:59:02.593 tst (EURUSD,M5) Bw in B = Bw 2020.09.01 18:59:02.593 tst (EURUSD,M5) Error, No not in C すべてうまくいくのですが、最適なコードについて再び質問です。 txtToEnumA() , txtToEnumB() , txtToEnumC() の代わりに書く方法があれば教えてください。 1つのテンプレートメソッド ( テンプレート ) 問題は、列挙される要素の数が異なることです。 OOP, templates and macros A quick and free Errors, bugs, questions Dmitry Fedoseev 2020.09.01 15:44 #273 enumがあったらどうしよう。 enum A {Aq=10, Aw=9, Ae=8, Ar=7, At=6, Ay=5}; ? Igor Makanu 2020.09.01 16:27 #274 Dmitry Fedoseev:enumがあったらどうしよう。? enumの要素に番号を付けることは問題ではなく、これが何を意味するのかは不明です。 4つの列挙だけで、番号がついていない 問題は、列挙に新しい要素を追加したい場合です。私のコードでは、新しい要素を一番外側の要素に追加します。 しかし、あらゆる場面で使える普遍的なコードの話ではなく、現在のタスクをテンプレート化する必要があります。 SZY: 列挙は便利だし、ソースとデータベースの両方で同じようにデータを読めるし、データベースではいくつかのフィールドを手動で修正することもできる......から、なくてはならない存在ですね。われなべにとじぶた Maxim Kuznetsov 2020.09.01 17:49 #275 Igor Makanu:列挙の要素に番号をつけることは問題ない、これが何をもたらすかは不明である4つの列挙だけで、番号がついていない問題は、リストに新しい項目を追加したい場合です。私のコードでは、新しい項目は一番外側ではないものに追加します。しかし、あらゆる場面で使える普遍的なコードの話ではなく、現在のタスクをテンプレート化する必要があります。SZY: 列挙は便利だし、ソースとデータベースの両方で同じようにデータを読めるし、データベースではいくつかのフィールドを手動で修正することもできる......と、なくてはならない存在です。痛快無比グローバル配列を作成し、ペア { EnumToString(x) , x } で埋める。 struct StringID { string str; int id; }; StringID IDS[]; とテンプレートが不要になります。 Igor Makanu 2020.09.01 18:08 #276 Maxim Kuznetsov:グローバル配列を作成し、ペア { EnumToString(x) , x } で埋める。 struct StringID { string str; int id; }; StringID IDS[]; を使えば、テンプレートは不要になります。 あなたのやり方は私とあまり変わりませんね。私も面倒ですし、もしコードに変更があれば、配列も編集しなければなりません。 Igor Makanu 2020.09.01 18:10 #277 は、私の願いをこう解決してくれました。 class MyClass { public: enum A {Aq, Aw, Ae, Ar, At, Ay}; enum B {Bq, Bw, Be}; enum C {Cq, Cw, Ce, Cr}; template<typename T> static bool txtToEnum(const T LastElement, const string txt, T &result); }; //+------------------------------------------------------------------+ template<typename T> static bool MyClass::txtToEnum(const T LastElement, const string txt, T &result) { for(int i = 0; i <= (int)LastElement; i++) { if(StringCompare(EnumToString((T)i), txt) == 0) { result = (T)i; return(true); } } return(false); } //+------------------------------------------------------------------+ void OnStart() { MyClass::A a; MyClass::B b; MyClass::C c; string txt[] = {"Aq", "Bw", "No"}; if(MyClass::txtToEnum(MyClass::Ay, txt[0], a)) Print(txt[0], " in A = ", EnumToString(a)); else Print("Error, ", txt[0], " not in A"); if(MyClass::txtToEnum(MyClass::Be, txt[1], b)) Print(txt[1], " in B = ", EnumToString(b)); else Print("Error, ", txt[1], " not in B"); if(MyClass::txtToEnum(MyClass::Cr, txt[2], c)) Print(txt[2], " in C = ", EnumToString(c)); else Print("Error, ", txt[2], " not in C"); } //+------------------------------------------------------------------+ 2020.09.01 22:08:47.417 tst (EURUSD,M5) Aq in A = Aq 2020.09.01 22:08:47.417 tst (EURUSD,M5) Bw in B = Bw 2020.09.01 22:08:47.417 tst (EURUSD,M5) Error, No not in C LastElementを入力しないようにするための定義が必要ですが、全体としてこのコードの方がコンパクトです。 bankova.elizabet 2020.09.27 15:54 #278 いろいろなことを書くのに必要な金額 1...2122232425262728 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
あなたの特別な問題は、このように解決されるはずです。
a small fix, with more brackets to fix :-)
本題は、UPDATE x VALUES () ではなく、UPDATE x SET name1=value1,name2=value2 にすることです。データベース構造が変更されたときに、リストされたフィールドの順序に依存せず、クエリーが正しく動作するようにするため
データベースからテキストフィールドを 読み込んでenumに変換する場合、およそ次のようなコードがあります。
2020.09.01 18:59:02.593 tst (EURUSD,M5) Aq in A = Aq
2020.09.01 18:59:02.593 tst (EURUSD,M5) Bw in B = Bw
2020.09.01 18:59:02.593 tst (EURUSD,M5) Error, No not in C
すべてうまくいくのですが、最適なコードについて再び質問です。
txtToEnumA() , txtToEnumB() , txtToEnumC() の代わりに書く方法があれば教えてください。
1つのテンプレートメソッド ( テンプレート )
問題は、列挙される要素の数が異なることです。
enumがあったらどうしよう。
?
enumがあったらどうしよう。
?
enumの要素に番号を付けることは問題ではなく、これが何を意味するのかは不明です。
4つの列挙だけで、番号がついていない
問題は、列挙に新しい要素を追加したい場合です。私のコードでは、新しい要素を一番外側の要素に追加します。
しかし、あらゆる場面で使える普遍的なコードの話ではなく、現在のタスクをテンプレート化する必要があります。
SZY: 列挙は便利だし、ソースとデータベースの両方で同じようにデータを読めるし、データベースではいくつかのフィールドを手動で修正することもできる......から、なくてはならない存在ですね。われなべにとじぶた
列挙の要素に番号をつけることは問題ない、これが何をもたらすかは不明である
4つの列挙だけで、番号がついていない
問題は、リストに新しい項目を追加したい場合です。私のコードでは、新しい項目は一番外側ではないものに追加します。
しかし、あらゆる場面で使える普遍的なコードの話ではなく、現在のタスクをテンプレート化する必要があります。
SZY: 列挙は便利だし、ソースとデータベースの両方で同じようにデータを読めるし、データベースではいくつかのフィールドを手動で修正することもできる......と、なくてはならない存在です。痛快無比
グローバル配列を作成し、ペア { EnumToString(x) , x } で埋める。
struct StringID {
string str;
int id;
};
StringID IDS[];
グローバル配列を作成し、ペア { EnumToString(x) , x } で埋める。
struct StringID {
string str;
int id;
};
StringID IDS[];
あなたのやり方は私とあまり変わりませんね。私も面倒ですし、もしコードに変更があれば、配列も編集しなければなりません。
は、私の願いをこう解決してくれました。
2020.09.01 22:08:47.417 tst (EURUSD,M5) Aq in A = Aq
2020.09.01 22:08:47.417 tst (EURUSD,M5) Bw in B = Bw
2020.09.01 22:08:47.417 tst (EURUSD,M5) Error, No not in C
LastElementを入力しないようにするための定義が必要ですが、全体としてこのコードの方がコンパクトです。