エラー、バグ、質問 - ページ 417

 
joo:

はい、return()で何かを返す必要がある場合です。

あるいは、少なくともコンパイラがその関数が何かを返すと確信できるようにします。

に限らず、このようなことが言える。
switch

が、一般に、void を除くすべての関数に対して

このコードをコンパイルしてみてください。

//+----------------------------------------------------------------------------+
//|                                                                  Scale.mqh |
//|                                             Copyright © 2010, JQS aka Joo. |
//|                                           http://www.mql4.com/ru/users/joo |
//|                                        https://www.mql5.com/ru/users/joo |
//——————————————————————————————————————————————————————————————————————————————
double Scale(double In,double InMIN,double InMAX,double OutMIN,double OutMAX)
{
  if (OutMIN==OutMAX)
    return(OutMIN);
  if (InMIN==InMAX)
    return((OutMIN+OutMAX)/2.0);
  else
  {
    if (In<InMIN)
      return(OutMIN);
    if (In>InMAX)
      return(OutMAX);
    //return(((In-InMIN)*(OutMAX-OutMIN)/(InMAX-InMIN))+OutMIN);
  }
}
//——————————————————————————————————————————————————————————————————————————————

はコンパイルできません。

では、アンコンパイルしてください。

//return(((In-InMIN)*(OutMAX-OutMIN)/(InMAX-InMIN))+OutMIN);

そして、奇跡が起こる!:)

 
Yedelkin:

Handbookによると、boolはinteger以外の特殊な型だそうですが...。だから、私の間違った発言を削除したのです。反論はしませんが......私は専門家ではありません。

大文字小文字の区別ではなく、単なる列挙(bool型をその中で一番小さいものと考える)の意味です。以下は、同じコンパイルエ ラーの例です。

この例に関する質問を繰り返しますが、コンパイラはTriple列挙型の値のリストとその総数を考慮しないということですか? 私はswitch演算子に列挙型の値をすべて使用しました。

やはり、コンパイラ(開発者)が再保険をかけているのですね。ポイントは、明示的に初期化されていない変数は、その型によってfalse/0 値を得るということです(2番目は列挙を指します)。

しかし、もし可能な範囲の外の値 (Triple の例では、範囲 -1 - +1 の外の任意の値) を、devoultive な結果を伴わない実行で取得したら、深刻な問題が発生します。

 
Interesting:

もし不合格者が除外された場合、この関数は何を返すべきでしょうか?

ENUM_CHART_MODE 列挙から最後の値だと思います。これから確認します。

...うーん、うまくいかなかった。ChartMode=ENUM_CHART_MODE::-1 と表示 されます。
 
Interesting:

私の理解では、コンパイラ(開発者)が再保険をかけているのだと思います。ポイントは、明示的に初期化されないと、変数の型によってfalse/ 0の値が割り当てられることです(2つ目は列挙型に関するものです)。

しかし、もし可能なバリアントの範囲外の値(Tripleの例では、範囲 -1 - +1以外の任意の値である可能性があります)を取得した場合、切実な結果なしに変数を実行するときに深刻な問題が発生します。

それはちょっと違いますね。前の記事を見てください。
 
joo:
そんなことはどうでもいいんです。前の記事を見てください。

そう、コンパイラはそれが何かを返すようにしなければならないのです。これは妥当な安心材料だと思います(特に、例のスイッチ 処理にデフォルトがあること)。

値を返す必要がない場合は別問題です。

 
Yedelkin:

最後の値は、ENUM_CHART_MODE 列挙のものだと思います。今すぐ確認します。

...そう、うまくいかなかったんです。ChartMode=ENUM_CHART_MODE::-1 と表示 されます。

もし、そのような複雑なことを深く知りたければ、Björn Straustrup, C++を読んでください。

正直なところ、私はMQL5のドキュメントをちゃんと読んでいないんです。開発者は、この言語の標準をむしろ正確に守っているのです。

 

こんにちは。

466を構築する。

起動すると、接続が表示され、数キロバイトのダウンロードが行われると同時に、端末が閉じます。インターネットを切断する→閉じない。

logs/Crash/ディレクトリにあるファイルを添付します。

この問題を解決する方法はあるのでしょうか?

感謝

)) が付いていない。以下、本文です。

時刻 : 2011.06.16 10:28 (0:00:11)

プログラム:クライアント端末

バージョン : 500.466 (2011年06月09日)

リビジョン:32925

OS : Windows 7 Professional Service Pack 1 (Build 7601)

プロセッサー : 2 x AMD Athlon 64 X2 デュアルコアプロセッサー 5000+。

メモリ : 1983 Mbの911空き

バーチャル : 2047 Mb の 1815 無料版

CrashMD5 : 2219A3BB7215B179256A7E41D40BD511

例外:C0000094 at 007B41B4 NA to 00000000


モジュール : 00400000 00B96000 terminal.exe (5.0.0.466)

: 6FDC0000 00027000 wlidnsp.dll (7.250.4225.0)


007B41A0:00014 [007B41B4] #22663 (terminal.exe)

774D58FC:00C74 [774D6570] strcspn (ntdll.dll)

774D58FC:00CAA [774D65A6] strcspn (ntdll.dll)

74A5DC14:000EC [74A5DD00] func_0x74A5DC14 (dbghelp.dll)

74A5E10D:0016E [74A5E27B] SymGetLineFromAddr64 (dbghelp.dll)

74A5F73A:0085A [74A5FF94] func_0x74A5F73A (dbghelp.dll)

74A6189C:000D2 [74A6196E] func_0x74A6189C (dbghelp.dll)

74A5F73A:00A54 [74A6018E] func_0x74A5F73A (dbghelp.dll)

74A5DC14:000EC [74A5DD00] func_0x74A5DC14 (dbghelp.dll)

74A5E10D:0016E [74A5E27B] SymGetLineFromAddr64 (dbghelp.dll)

74A5F73A:0085A [74A5FF94] func_0x74A5F73A (dbghelp.dll)

74A6189C:000D2 [74A6196E] func_0x74A6189C (dbghelp.dll)

74A5F73A:00A54 [74A6018E] func_0x74A5F73A (dbghelp.dll)

774D68C7:000E0 [774D69A7] RtlLogStackBackTrace (ntdll.dll)

774D58FC:004D7 [774D5DD3] strcspn (ntdll.dll)


レジスタ : EAX=0000000000 EIP=007B41B4 EFLGS=00010246 ES=0023

: EBX=000000000000 ESP=0012E2CC EBP=0012E320 FS=003b

: ECX=00000000 ESI=04C74C48 CS=001b GS=0000

: edx=0000000000 edi=00000007 ds=0023 ss=0023

 

引き続き、値を返す関数でswitch演算 子を使うというテーマです。昨日、中間的な結論が得られ、enumeration+switchを使用する場合、デフォルトラベルの使用が必須 なることが確認されました。しかし、この結論が反証された場合の例を挙げよう。

enum Triple
  {
   err=-1,
   no = 0,
   hay= 1
  };
Triple triple_var1,triple_var2;
Triple Test(void)
  {
   switch(triple_var1)
     {
      case  err: return(err);
      case   no: return(no);
      case  hay: return(hay);
      default:
         switch(triple_var2)
           {
            case  err: return(err);
            case   no: return(no);
            case  hay: return(hay);
           }
     }
  }
void OnStart()
  {
   Test();
  }
ここでは、スイッチオペレータを2回適用し、再度適用する際にデフォルトの ラベルを除外しています(2段階目)。同じ演算子、同じコンパイラで動作しています。 コンパイラが変数 triple_var1 と triple_var2 にゴミが入る可能性を考慮し、同時に Triple enumeration の値のリストとその数を考慮しないと仮定すると、なぜコンパイラはスイッチ演算子の2階層目でエラーを報告しないのでしょうか?中間的な結論や仮定が間違っていたのか、それともコンパイラが「第1レベル」のみの演算子チェックに限定していたのか?特にswitch(triple_var2) の label/tags をコメントアウトすると、Test() 関数が void 型でないにもかかわらず、エラーメッセージが出なくなります。

switch(triple_var1)演算子のケースラベルの後に(デフォルト ラベルなしの)switch(triple_var2)演算子を挿入しても同様の結果になる。

 
Yedelkin:

引き続き、値を返す関数でswitch演算 子を使うというテーマです。昨日、中間的な結論が得られ、enumeration+switchを使用する場合、デフォルトラベルの使用が必須と なることが確認されました。しかし、この結論に反論する例がある。

ここでは、スイッチオペレータを2回適用し、再度適用したとき(2段階目)には、デフォルト ラベルを除外しています。同じ演算子、同じコンパイラで動作しています。 コンパイラがtriple_var1, triple_var2変数にゴミがある可能性を考慮し、同時にtriple列挙の値のリストとその数を考慮しないと仮定すると、なぜコンパイラは2階層目のスイッチ演算子の使用でエラーを報告しないのでしょうか?中間的な結論や仮定が間違っていたのか、それともコンパイラが「第1レベル」のみの演算子チェックに限定していたのか?特にswitch(triple_var2) のラベルやタグをコメントアウトすると、Test() 関数が void 型でないにもかかわらず、エラーメッセージは発生しません。

これは私たちの欠陥です。見つけてくれてありがとう、修正します。エラーが発生します。
スイッチのチェックですべての値をカバーすることは、コンパイルの域を超えています。
MQL5の「機能」としては面白いので、どうするかはこれから考えます。
 
誤記を修正しました。
"スイッチチェッカーチップは、有効/不正の制御を実装することができないことが検討されています。
switch式の値は、例えば何でもよい。

enum EV { v1, v2, };

string Test(void)
  {
   switch(EV(3))
     {
      case v1: return("v1");
      case v2: return("v2");
     }
   return("oops");
  }
  
void OnStart()
  {
   Print(Test());
  }