エニュメレーションを一貫して行うにはどうしたらいいですか? - ページ 2

 

そして、もう少し頭を使えば、次のような関数が得られます。

int GetPeriodEnumerator(
uchar i,              // индекс перечисления 
ENUM_TIMEFRAMES &tf,  // сюда принимаем числовое значение таймфрейма 
string &tfs           // сюда принимаем строковое значение таймфрейма
)
  {
   switch(i)
     {
      case 0:  {tf=PERIOD_M1;tfs="M1";return(0);}
      case 1:  {tf=PERIOD_M2;tfs="M2";return(0);}
      case 2:  {tf=PERIOD_M3;tfs="M3";return(0);}
      case 3:  {tf=PERIOD_M4;tfs="M4";return(0);}
      case 4:  {tf=PERIOD_M5;tfs="M5";return(0);}
      case 5:  {tf=PERIOD_M6;tfs="M6";return(0);}
      case 6:  {tf=PERIOD_M10;tfs="M10";return(0);}
      case 7:  {tf=PERIOD_M12;tfs="M12";return(0);}
      case 8:  {tf=PERIOD_M15;tfs="M15";return(0);}
      case 9:  {tf=PERIOD_M20;tfs="M20";return(0);}
      case 10: {tf=PERIOD_M30;tfs="M30";return(0);}
      case 11: {tf=PERIOD_H1;tfs="H1";return(0);}
      case 12: {tf=PERIOD_H2;tfs="H2";return(0);}
      case 13: {tf=PERIOD_H3;tfs="H3";return(0);}
      case 14: {tf=PERIOD_H4;tfs="H4";return(0);}
      case 15: {tf=PERIOD_H6;tfs="H6";return(0);}
      case 16: {tf=PERIOD_H8;tfs="H8";return(0);}
      case 17: {tf=PERIOD_H12;tfs="H12";return(0);}
      case 18: {tf=PERIOD_D1;tfs="D1";return(0);}
      case 19: {tf=PERIOD_W1;tfs="W1";return(0);}
      case 20: {tf=PERIOD_MN1;tfs="MN1";return(0);}
     }
   return(-1);
  }
 
sergey1294:

そして、もう少し頭を働かせると、次のような機能を得ることができます。

なぜ

return(0)

この関数はint型なので、returnでも大丈夫です。

int GetPeriodEnumerator(
uchar i,              // индекс перечисления 
ENUM_TIMEFRAMES &tf,  // сюда принимаем числовое значение таймфрейма 
string &tfs           // сюда принимаем строковое значение таймфрейма
)
  {
   switch(i)
     {
      case 0:  {tf=PERIOD_M1;tfs="M1";return(PeriodSeconds(tf)/60);}
      case 1:  {tf=PERIOD_M2;tfs="M2";return(PeriodSeconds(tf)/60);}
      case 2:  {tf=PERIOD_M3;tfs="M3";return(PeriodSeconds(tf)/60);}
      case 3:  {tf=PERIOD_M4;tfs="M4";return(PeriodSeconds(tf)/60);}
      case 4:  {tf=PERIOD_M5;tfs="M5";return(PeriodSeconds(tf)/60);}
      case 5:  {tf=PERIOD_M6;tfs="M6";return(PeriodSeconds(tf)/60);}
      case 6:  {tf=PERIOD_M10;tfs="M10";return(PeriodSeconds(tf)/60);}
      case 7:  {tf=PERIOD_M12;tfs="M12";return(PeriodSeconds(tf)/60);}
      case 8:  {tf=PERIOD_M15;tfs="M15";return(PeriodSeconds(tf)/60);}
      case 9:  {tf=PERIOD_M20;tfs="M20";return(PeriodSeconds(tf)/60);}
      case 10: {tf=PERIOD_M30;tfs="M30";return(PeriodSeconds(tf)/60);}
      case 11: {tf=PERIOD_H1;tfs="H1";return(PeriodSeconds(tf)/60);}
      case 12: {tf=PERIOD_H2;tfs="H2";return(PeriodSeconds(tf)/60);}
      case 13: {tf=PERIOD_H3;tfs="H3";return(PeriodSeconds(tf)/60);}
      case 14: {tf=PERIOD_H4;tfs="H4";return(PeriodSeconds(tf)/60);}
      case 15: {tf=PERIOD_H6;tfs="H6";return(PeriodSeconds(tf)/60);}
      case 16: {tf=PERIOD_H8;tfs="H8";return(PeriodSeconds(tf)/60);}
      case 17: {tf=PERIOD_H12;tfs="H12";return(PeriodSeconds(tf)/60);}
      case 18: {tf=PERIOD_D1;tfs="D1";return(PeriodSeconds(tf)/60);}
      case 19: {tf=PERIOD_W1;tfs="W1";return(PeriodSeconds(tf)/60);}
      case 20: {tf=PERIOD_MN1;tfs="MN1";return(PeriodSeconds(tf)/60);}
     }
   return(-1);
  }

で、呼び出しはおそらく次のようなものです。

   ENUM_TIMEFRAMES tf;
   string tfs;
   Print(" мин=",GetPeriodEnumerator(11,tf,tfs),"  ENUM=",tf,"  string=",tfs);

その結果

 мин=60  ENUM=16385  string=H1
 
エニュメレーションについて、議論がある。
1)列挙のための++の導入
2)列挙型から文字列への変換
ENUM_TIMEFRAMES t=PERIOD_M1;
string s=(string)t;

s будет иметь значение "PERIOD_M1"
 
mql5:
エニュメレーションについて、議論がある。
1)列挙のための++の導入
2)列挙型から文字列への変換

強く支持する。特に1点目。標準パッケージだけでも数百の列挙型があり、それぞれの列挙型に対して個別の関数を書くのはコストがかかりすぎる。
 
Ilyas:
移籍については、議論がある。
1)列挙のための++の導入


この機能はすでにあるのでしょうか?

あるいは、アイテムを順次リストアップする別の選択肢は?

 
イテレータを出せ!
 

列挙型に対してインクリメントするのは、正しい手順ではないような気がします。

デフォルトの列挙は必ずしも連続である必要はなく、また、開発中に「途中から」値を追加することも可能である。

もちろん、「単純化」するためには、列挙をインクリメントすることで「次の」値を即座に取得できればよいのですが、私見では、これは潜在的に危険な行為だと思います。

列挙の「次の値」を得るためには、ここですでに述べたように、特殊な関数を使うのが最も合理的である。

そして、人々はデフォルトセレクターを無視するようで、無駄なことです。すべてのswitch()には、このセレクタと、不明瞭な値が到着したことを示す警告が含まれていなければなりません。

 

George Merts:

列挙型のインクリメントによって、「次の」値をすぐに取得することができます。

それがイリヤスの 言いたかったことだ。

彼、もしくは担当の開発者に質問があったのです。この問題は解決されたのでしょうか、それともまだ途中なのでしょうか...。

合格はどうでもいい

さいしんえんざんし

GetNextEnum / GetLastEnum / GetFirstEnum などの新しい関数が追加されました。

またはオーバーロード+α

上記のような、現在の宗派に合わせた機能を描き、開発者がアップデートしても何も壊れないと恐れるようなことがない限りは

 

最も明白で柔軟な解決策は、すべての列挙値を 配列に取得する関数を言語に導入することです。 そして、この配列を横断的にトラバースする方法を決定します。それに、呼び出しのたびにすべてを再ハッシュするわけではないので、どうせすべての値を保存しなければなりません。 一度迂回して保存し、あとは配列から取り出すだけです。 だから、一度に準備のできた配列を取得する方が簡単ではないでしょうか?

ちなみに、演算子オーバーロードの++を使ったバリアントは、既存のプログラムを不正に動作させる可能性があるので、極めて悪質な方法です。

さて、ここで示した例(ケース1:戻り値1、ケース2:戻り値2、ケース3:戻り値3...)。適切な人であれば、すべての値を配列に入れ、そのインデックスから必要な値を取り出すだけだろうし、逆のタスクの場合はバイナリサーチを 使うだろう。

 
Alexey Navoykov:

プラス、イテレータ......どうしてこんなに複雑なんだ。

どうなってもいいんです。

さて、ここで示した例(ケース1:戻り値1、ケース2:戻り値2、ケース3:戻り値3...)。適切な人であれば、すべての値を配列に入れ、そのインデックスで必要な値を取得するだけだが、逆の作業にはバイナリサーチが使われることになる。

スイッチは非常に効果的なものです