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

 
Aleksey Mavrin:

0xFFはコンパイラによって4バイトにされているのでしょう。

いいえ、しかし正しく初期化されます

uchar uc[16];
ArrayInitialize(uc,(uchar)0xFF); // truncation of constant value        
ArrayPrint(uc);                  //     255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
 

こんにちは、問題を解決する方法をアドバイスしてください。

最適化中にエラーが表示される。

2020.05.31 15:05:32.738 Core 7 genetic pass (0, 53) tested with error "critical runtime error 503 in OnTickfunction(zero divide, module Expertse1.ex5, file e1.mq5, line 826, col 73)" in 0:00:00.153

double Mix1 = NormalizeDouble((MathAbs(ZExtLevel[0] - ZExtLevel[1]), 2))

double Mix2 = NormalizeDouble((MathAbs(ZExtLevel[1] - ZExtLevel[2])), 2)とする。

double Mix = NormalizeDouble((Mix1/Mix2),2);

私がしたこと

1) Mix1 と Mix2 を掛け合わせて、小数点以下の桁数を減らしました。

2) 正規化する際の桁数を変更した。

3) すべてのZExtLevelsに0が含まれていないことを確認しました。


 
Igor Makanu:

いいえ、しかし正しく初期化されます

なぜ、そうではないと言い切れるのでしょうか?Integerのデフォルトは "present "である。sizeofがそう言っています。

 
Aleksey Mavrin:

なぜ、そうではないと言い切れるのでしょうか?Integerのデフォルトは "present "である。sizeofによると、そうなっています。

正確には、uintです。

 
Aleksey Mavrin:

なぜ、そうではないと言い切れるのでしょうか?Integerのデフォルトは "present "である。sizeofがそう言っています。


も警告なしで動作するのでしょうか?

char c[16];
ArrayInitialize(c, 127);

対応するArrayInitializeという シグネチャが存在するため

int  ArrayInitialize(
   char    array[],     // инициализируемый массив
   char    value        // значение, которое будет установлено
   );

そして、何らかの理由でunsigned uchar用のArrayInitialize()を作らなかった。

 
Igor Makanu:

は、警告もなく同じように動作するのですか?

対応するシグネチャが存在するため、ArrayInitialize

で、unsigned uchar の場合は、なぜか ArrayInitialize() が行われませんでした。

署名があるかないかの問題ではありません。ポイントは、4バイトが1バイトに変換され、理論的には情報が失われる可能性があることで、これをコンパイラは警告しているのです。

ArrayInitialize(c, (char)10000) を試してみてください。

ワーニングも出る

 
Aleksey Mavrin:

署名の有無は関係ない。ポイントは、4バイトが1バイトに変換されることで、理論的には情報が失われる可能性があることで、これをコンパイラは警告しているのです。

ArrayInitialize(c, (char)10000) を試してみてください。

ワーニングも出る

まあ、最初から明らかだったのですが

本当にシャアが必要なのはどこなのか、違う意味でここに疑問があります。

私はStringToCharArray()とCryptEncode()でucharを使っています。

だからchar配列はArrayInitializeで 初期化できるのに、ucharはできないんだ。


OK、それは素晴らしい騒ぎだ、私はそれが変更されるとは思わない;)


PS:0xFF=255(1 バイト)

 
Igor Makanu:

はいたしてあきらか

ここが問題で、ここが本当にシャアが必要なところなのか?

StringToCharArray()やCryptEncode()でucharを使っていますが、ヘルプを見ると、まだ

だから、ArrayInitialize を使って char 配列を初期化することができるのに、uchar はできないのです。


OK、高貴なホリバーが判明し、何かが変わることを疑う;)


PS:0xFF=255(1 バイト)

ArrayInitialize (uc,(char) 0xFF ); // truncation of constant value        
 
Igor Makanu:

ああ、最初からそういうことだったんだ。

ここでまた質問ですが、本当にシャルが必要なのはどこですか?

StringToCharArray()とCryptEncode()でucharを使用しています。

だからchar配列はArrayInitializeで 初期化できるのに、ucharは できないんだ。

OK、それは素晴らしい騒ぎだ、私はそれが変更されるとは思わない;)

PS:0xFF=255(1 バイト)

ucharはcharと同じように動作します。

警告が出た理由をお聞きしましたが、1で4バイトだからです。255は重要ではありません。0と1は、1と2、4と8バイトでも構いません)

 

Alain Verleyen:

ArrayInitialize (uc,(char) 0xFF );

をチェックしました。

uchar uc[16];
ArrayInitialize (uc, (char) 0xFF );
ArrayPrint(uc); 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255

OK、コンパイラの警告 なしで動作します

ありがとうございました。