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

 
Nikolai Semko #:

了解しました。
ああ、この日食回廊は...。

無接続からデモで時間経過して40時間経ってるんだけど。

 
Nikolai Semko #:

以前は問題なかったが、新バージョンの製品をスキップできない。


問題は私ではないようです。
ビルド3110

昨日、MetaQuotes-Demoサーバーへの接続に問題が発生しました。このサーバーは、Marketplace製品の検証などに使用されています。

昨日、このバグを修正し、技術的な理由でバリデーションに失敗したすべての製品を再確認しました。

ご不便をおかけして申し訳ありません。

弊社が誤って製品を見逃し、再確認していない場合は、お客様ご自身で再確認をお願いします。これで、バリデーションは通常通り動作するはずです。

 

以下はサンプルコードです。

//+------------------------------------------------------------------+
#property strict
//+------------------------------------------------------------------+
void OnStart()
  {
  uint iCurrent =722;
  int  iinterval=1000;         
  int  iNext=(int)(iCurrent-iinterval/2); // 722-500=222
  Print ("Current :",iCurrent);
  Print ("iNext   :",iNext);
  long  temp=(long)(iNext-iCurrent); //предупреждений нет ожидаем Лонг -500
  Print ( " temp (long):",temp);//int - uint ->uint Result: uint -- oшибка!

  Print ( " delta(&int)"+string((int)(iNext-iCurrent)));    // неожиданный успех  
  Print ( " delta(&long)"+string((long)(iNext-iCurrent)));  // опять штанга
  //-----------------------------------
 }

結果

2021.11.23 13:07:35.931 testUint (Volatility 75 Index,M15)      Current :722
2021.11.23 13:07:35.932 testUint (Volatility 75 Index,M15)      iNext   :222
2021.11.23 13:07:35.932 testUint (Volatility 75 Index,M15)       temp (long):4294966796
2021.11.23 13:07:35.932 testUint (Volatility 75 Index,M15)       delta(&int)-500
2021.11.23 13:07:35.932 testUint (Volatility 75 Index,M15)       delta(&long)4294966796

なぜなのか、誰か説明してください。

long  temp=(long)(iNext-iCurrent);

与える

4294966796

であり、-500ではない。

頭の中がどうなってるんだろう・・・。(

 
Mikhail Dovbakh #:

以下はサンプルコードです。

結果

なぜなのか、誰か説明してください。

与える

であり、-500ではない。

頭の中がどうなってるんだろう・・・。(

long temp=(long)iNext-iCurrent;

https://www.mql5.com/ru/docs/basis/types/casting

iNextを符号なし整数にしたのが最初ですね。そして、符号なし整数の結果をlongに変換する。

私の例では、iNextは直ちにlong型にキャストされるので、iCurrentもlong型にキャストされますが、暗黙のうちに行われます。結果はすぐにlongに変換される

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Приведение типов - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Slava #:

問題は、なぜこのタイプのオーダーが正しい結果をもたらさないのか、ということだった。式中の型階層順序に依存するとしか思えないのですが。実行時に式の中で型が階層的に並んでいれば答えは正しく、そうでなければ、階層に違反する非明示的な型変換によって変数の値が変更される可能性があります。

long temp=(long)((int)iNext-(uint)iCurrent); 

一般に、非明示的な型変換は階層構造に違反する。

 
MetaQuotes #:

昨日、MetaQuotes-Demoサーバーへの接続に問題が発生しました。このサーバーは、Marketplace製品の検証などに使用されています。

昨日、この問題を修正し、技術的な理由でバリデーションを通過できなかったすべての製品を再チェックしました。

ご不便をおかけいたしますが、よろしくお願いいたします。

弊社が誤って製品を見落とした場合、再バリデーションが行われていない場合は、お客様ご自身で行ってください。これでチェックは通常通り行われるはずです。

ありがとうございました。
今はすべてうまくいっています。
 
Slava #:

https://www.mql5.com/ru/docs/basis/types/casting

まずiNextが符号なし整数になりましたね。そして、符号なし整数の結果をlongに変換する。

この例では、iNextはすぐにlong型にキャストされるので、iCurrentも暗黙のうちにlong型にキャストされています。その結果は直ちにlongにキャストされます。

然れば則ち

 Print ( " delta(&int)"+string((int)(iNext-iCurrent)));    // неожиданный успех 

и

int itemp=(int)(iNext-iCurrent); 


は正しい結果を与えるのか?

ご指摘の通り、iNextはまず符号なし整数にキャスト されます。そして、符号なし整数の結果を符号ありの整数に変換する。

そうだろ?

 

トレンドラインは赤のローソク足に磁化されていない(EURUSD, M5;Precise time scale; Magnetisation: 15)


 
Mikhail Dovbakh #:

であれば、その理由を説明してください。

и

int itemp=(int)(iNext-iCurrent); 


は正しい結果を与えるのか?


簡単に

長さ32ビットの 符号なし整数4294966796を同じ次元の符号付き整数に変換すると-500

 
Valeriy Yastremskiy #:

問題は、なぜこのタイプのオーダーが正しい結果をもたらさないのか、ということだった。式中の型階層順序に依存するとしか思えないのですが。実行時に式の中で型が階層的に並んでいれば答えは正しく、そうでなければ、階層に違反する非明示的な型変換によって変数の値が変更される可能性があります。

Zy 一般に明示的でない型変換であり、階層構造に違反する。

リンクはすでにお渡ししていますhttps://www.mql5.com/ru/docs/basis/types/casting

詳しく書いてありますよ。最初から最後まで欠かさず読む

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Приведение типов - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5