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

 

通常の」比較では、符号なし型に 与えられる。

void OnStart()
{
  ulong i=0;
  while(true)
  {
    if(i<ULONG_MAX) {i++;}  //тут в условии так и остаётся тип ulong, преобразования к long не происходит
    else {break;}
  }
}
 
Fleder:

じゃあ、どう説明するんだ。

long t=0;
  bool comp=(ULONG_MAX-1>t);
  Print("comp = ",comp);   //comp = true
ビット単位の比較 - 矛盾はない。そして、ulong と long の比較は、long < 0 の場合のみ不正確です。
 
void OnStart()
{
  long n=0;
  uint g=UINT_MAX;
//for(int i=0;i<UINT_MAX;i++) {n++;}  //здесь получаем бесконечный цикл и предупреждение expression is always true
  for(int i=0;i<g;i++) {n++;}         //здесь получаем предупреждение sign mismatch и цикл в 4294967295 итераций
  Print("n = ",n);                    //n = 4294967295            
}

最初のループの被検出式では、int型の変数とuint型の整数定数が比較される。

が暗黙の型変換 を行わない場合、ビット単位の比較が行われる。この表現は常に真実である。

2つ目のループでチェックされる式では、int型の変数とuint型の変数が比較される。

への暗黙の変換が行われる。そして、i変数のオーバーフロー後:uint(-1)=4294967295

を指定すると、式は偽になります。


 

時代の終わり(UNIX?)8時間 遅れる。

全タイプ

タイプ

サイズ(バイト)

最小値

最大値

C++でアナログ

時分

8

0 (1970.01.01 0:00:00)

32 535 244 799(3000.12.31 23:59:59)

__time64_t

void OnStart()
{
  Print((datetime)32535244799);   //3001.01.01 07:59:59
}
 

デベロッパー

MQL文法の正式な説明を与えて、ブギーを探させる:-)))

 

簡単なこと:

double min,max;

i=Bars-1-period1;
while(max-min==0)
{
min=Low[i];
max=High[i];
i++;
}.

TFについて。D1 と M4 ではデバッガが min=Low[i] という行を拒否し、端末が "ハングアップ" します。他のTFでは、この問題は存在しない。min=iLow();で置き換えても、何も起こりません。 ヒストリー、新しいMT4エディタ、私の頭の中のどこに「穴」があるのか、アドバイスをお願いします。

 
admoon:

シンプルなもの

   double min,max;

   i=Bars-1-period1;
   while(max-min==0)
     {
      min=Low[i];
      max=High[i];
      i++;
     }

TFについて。D1 と M4 はデバッガが min=Low[i]; という行を拒否し、端末が "ハングアップ" します。他のTFでは、この問題は存在しない。min=iLow();の置換では、何も得られません。 歴史、新しいMT4エディタ、または私の頭の中のどこに「穴」があるのか、アドバイスをお願いします。

フォーラムの投稿を作成する際に、「SRC」ボタンを 使用してコードを挿入してください。


そうすることで、メッセージを読みやすくすることができます。

 
Fleder:

時代の終わり(UNIX?)8時間 遅れる。

ヘルプに間違いがあるのでは
Print( ulong(::StringToTime( "3000.12.31 23:59:59" ))); //32'535'215'999

あるいは私たちが知らないことがある、誰かがここで手計算までしたと思うhttps://www.mql5.com/en/forum/16036

 
A100:
どうやら、ヘルプのmax=32'535'215'999にエラーがあるようです。

ただ、datetime型の 制限値が正しく定義されていないだけです。

void OnStart()
{
  Print((datetime)32535244799);   //3001.01.01 07:59:59
  Print((datetime)32535244800);   //wrong datetime
}
 
Fleder:

datetime 型の 制限値が正しく定義されていないだけです。

32'535'244'799 != 32'535'215'999 - どちらが正しいのでしょうか?