StringToEnum "関数やその代替はありますか? - ページ 2

 

私はこれを追っていますが、あなたが成し遂げたいことが何なのか、はっきりと理解できていません。

私は通常、求めていた最終結果を得るために、さまざまな方法でコードを書き直します。

 
Marco vd Heijden:

私はこれを追っていますが、あなたが成し遂げたいことが何なのか、はっきりと理解できていません。

私は通常、求めていた最終結果を得るために、さまざまな方法でコードを書き直します。

マルコ ありがとうございます。もちろん、物事は多くの方法(と回避策)で行うことができ、時にはあなたの目標を達成するためにそれらのいずれかを選択する必要がありますが、他のものより簡単にいくつかの方法があります。この場合、私が取った回避策は、関数を 模倣することでした しかし、先ほども言ったように、eval関数(mql5には実装されていない)を使えば、このようなifを使わずに済みますし、定数の名前が変わっても、ifのブロックを変更する必要がないので、メンテナンスの面でも便利です。
 

私は何百、何千ものif行を一つのコードブロックの中に入れて、必要なものを得るということをよく分かっています。

自分のやっていることが好きなんだろうね。

 
cyberglassed:
ありがとうございます。もちろん、物事は多くの方法(と回避策)で行うことができ、時には目的を達成するためにそれらのいずれかを選択する必要がありますが、他のものより簡単にいくつかの方法があります。この場合、私が取った回避策は、関数を模倣することでした。しかし、前にも言ったように、eval関数(mql5には実装されていません)を使えば、これらのifを回避できますし、定数の名前が変わってもifのブロックを変更する必要がないので、メンテナンスの面でも便利です。

なぜこのStringToEnumが必要なのか、説明してください。明らかに、あなたはenum値を持つ文字列を持っていますが、なぜそれが文字列にあるのですか?私はそれを知りたいと思っています。

つまり、eval(...) 関数のサポートで、多くのことを同時に解決することができるのです。

そんなことは決して起こらないので、そんなことで時間を無駄にしないでください。Eval()関数は セキュリティリークへのオープンドアであり、Metaquotesはそのような関数を追加しません。

 
Marco vd Heijden:

私は何百、何千ものif行を一つのコードブロックの中に入れて、必要なものを得るということをよく分かっています。

自分のやっていることが好きなんだろうね。

あなたの問題はStringToEnum()で解決できるものではない、あなたはすでにそれを知っている(と思う)。
 
Alain Verleyen:
あなたの問題はStringToEnum()で解決 できるものではありません、あなたはすでにそれを知っています(と思います)。

正しいが、それは逆に行うことができます。

  int b=0;
  
  if(EnumToString(MODE_SMMA)=="MODE_SMMA"){b=2;Print("b= ",b);}

しかし、MODE_SMMAはすでに整数値2を持っているので、それは意味がないでしょう。だから私はcyberglassedが 達成しようとしていることを理解していないと書きました。

 
Marco vd Heijden:

正しいが、逆にすることもできる。

しかし、MODE_SMMAはすでに整数値2を持っているので、それは意味がありません。

Marco 私が使っている回避策は次のようなものです(非常にミニマルなバージョン)。

int StringToEnum(string strId) {
        if (false) {}
        else if (strId == "PRICE_CLOSE")     return 1;
        else if (strId == "PRICE_OPEN")      return 2;
        else if (strId == "PRICE_HIGH")      return 3;
        else if (strId == "PRICE_LOW")       return 4;
        else if (strId == "PRICE_MEDIAN")    return 5;
        else if (strId == "PRICE_TYPICAL")   return 6;
        else if (strId == "PRICE_WEIGHTED")  return 7;
        // ...
        return -1;
}

void OnStart() {
        string strId = "PRICE_MEDIAN";
        printf("%s: %d ", strId, StringToEnum(strId));
}

もちろん、私は定数から始めるのではなく、文字列から始めます。

EnumToString(MODE_SMMA)

定数そのものを最初から持っているようなものです。

私の英語はあまり上手ではないので、誤解していたらすみません。

ありがとうございます。

 
Alain Verleyen:

なぜこのStringToEnumが必要なのか、説明してください。明らかに、あなたはenum値を持つ文字列を持っていますが、なぜそれが文字列にあるのですか?私はそれを知りたいと思っています。

つまり、eval(...) 関数のサポートがあれば、同時に多くのことを解決できるのです。

そんなことは決して起こらないので、そんなことで時間を無駄にしないでください。Eval()関数は、セキュリティリークへのオープンドアであり、Metaquotesはそのような関数を追加することはありません。

こんにちは、アラン。あなたの好奇心を満たします。

もちろん、人間のように、それぞれの "enum "の値の文字列名を覚えておく方がよいでしょう。しかし、ある部分において、あるenumの値を文字列 形式で指定したい場合、直接指定することができないため、上に書いたような回避策を取らなければなりません。この方法には2つの大きな欠点があります。1つは、関係するすべてのenumの値を収集しなければならないこと、もう1つはメンテナンスの問題で、外部のmql5コードを更新したときに、開発者がint値をある定数表現に関連付けるのを変更すると、予期しない動作になることがあるので、コードの更新を調査し続けなければならないのです。

セキュリティリークの話ですが...私は、あなたが言った「セキュリティリークへのオープンドア」については、完全に同意しているわけではありません。もちろん、オープンドアであることは間違いないのですが、プログラマーとして限界を設定し、起こりうる危機的状況に対処する必要があります。つまり、PHPや、SQLのコードインジェクションのように、ユーザーがあなたのコードにアクセスした場合に、重要な入力データを解析しなければならない状況も完全に管理することができるのです。

将来的には運が良ければ、開発チームがこの方向性で手助けしてくれるかもしれませんし、今のところは回避策を使うことができます :P

 
cyberglassed:

マルコは 私が使っている回避策は次のようなものです(非常にミニマルなバージョン)。

もちろん、私は定数からではなく、文字列から始めます。あなたのコードでは、次のように書かれているので、私はこれを言う。

まるで、最初から定数そのものを持っていたかのように。

私の英語はあまり上手ではないので、誤解していたらすみません。

ありがとうございます。

だから、逆引きといって、文字列から 列挙 値を分解するために、すべての列挙値を比較することから始めるのです。

int b;
if(EnumToString(MODE_SMA)=="MODE_SMA"){b=0;}
if(EnumToString(MODE_EMA)=="MODE_EMA"){b=1;}
if(EnumToString(MODE_SMMA)=="MODE_SMMA"){b=2;}
if(EnumToString(MODE_LWMA)=="MODE_LWMA"){b=3;}

Print(b);


ということですが、同じことではありませんか?

というのは、文字列を比較するのはどちら側でもよくて、一致するものがあれば、その値をbに符号化するのです。

int b;
if("MODE_SMA"==EnumToString(MODE_SMA)){b=0;}
if("MODE_EMA"==EnumToString(MODE_EMA)){b=1;}
if("MODE_SMMA"==EnumToString(MODE_SMMA)){b=2;}
if("MODE_LWMA"==EnumToString(MODE_LWMA)){b=3;}

Print(b);

というわけで、ここでは文字列の値から始めますが、何が違うのでしょうか?

ありません。

 
Marco vd Heijden:

...

しかし、それは同じことではありませんか?

ということは、どちらの側で比較しても、一致するものがあれば、その値をbに符号化することになります。

int b;
if("MODE_SMA"==EnumToString(MODE_SMA)){b=0;}
if("MODE_EMA"==EnumToString(MODE_EMA)){b=1;}
if("MODE_SMMA"==EnumToString(MODE_SMMA)){b=2;}
if("MODE_LWMA"==EnumToString(MODE_LWMA)){b=3;}

Print(b);

では、ここでは文字列の値から始めますが、違いは何でしょうか?

ありません。

あなたのコードは、常に "b = 3"(最後の "if "は、あなたが "else if "を使用していないため)を返しますので、上記の無駄です。

もし "else if "を使えば、常に "b = 0 "を返します。

とにかく、情報です。とにかく、毎回「b = 3」という情報は、何の情報にもなりません。

理由: