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

 
fxsaber:

この点について、詳しく教えてください。

以下は私の主観です、どこか間違っていたらご指導いただければ幸いです。


StringLenは、文字列中の最初のNULL文字(0x0000)までO(n)で動作していましたが、現在はO(1)で動作しています。
文字列の長さは StringSetCharacter(str, pos, 0x00) で常に切り捨てることができたが、何らかの理由で StringSetLength が導入されたのである。

おそらく、文字列を扱う際のコードの高速化という課題が解決されたのだろう。
コードの高速化という課題は解決され、関数の半分が文字列中のNULL文字を処理し、残りの半分が処理しないことを誰も気にしなくなりました。

#define  PRINT(x) Print(#x, ":", string(x))

void OnStart(){  
   string str = "123456789";
   PRINT(str);
   PRINT(StringLen(str));
   
   PRINT(StringSetCharacter(str, 7, 0x00));
   PRINT(StringLen(str));
   
   str += "\x00" + str;
   PRINT(StringLen(str));
   
   str += str;
   PRINT(str);
   PRINT(StringLen(str));
   
   ushort array[];
   PRINT(StringToShortArray(str, array));
   ArrayPrint(array);
   
   PRINT(StringLen(str));
   PRINT(StringLen(ShortArrayToString(array)));
   PRINT(StringLen(ShortArrayToString(array, 0, StringLen(str))));
} 

その結果

2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      str:123456789
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):9
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringSetCharacter(str,7,0x00):true
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):7
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):15
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      str:1234567
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):30
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringToShortArray(str,array):31
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      49 50 51 52 53 54 55  0 49 50 51 52 53 54 55 49 50 51 52 53 54 55  0 49 50 51 52 53 54 55  0
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):30
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(ShortArrayToString(array)):7
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(ShortArrayToString(array,0,StringLen(str))):7
 
Sergey Dzyublik:

以下は私の主観です、どこか間違っていたらご指導いただければ幸いです。


StringLenは、文字列中の最初のNULL文字(0x0000)までO(n)で動作していましたが、現在はO(1)で動作しています。
文字列の長さは StringSetCharacter(str, pos, 0x00) で常に切り捨てることができたが、何らかの理由で StringSetLength が導入されたのである。

おそらく、文字列を扱う際のコードの高速化という課題が解決されたのだろう。
コードの高速化という課題は解決され、関数の半分が文字列中のNULL文字を処理し、残りの半分が処理しないことを誰も気にしなくなりました。


その結果

感情を抑えてください。
今度汚い言葉を使ったら、出入り禁止にしないとね~ここは居酒屋じゃないんだから。パブで悪口を言うのはもう流行らないしね。
 
Sergey Dzyublik:

StringLenは、文字列の最初のNULL文字(0x0000)までO(n)で動作していましたが、現在はO(1)で動作しています。

ただ、部分的にバグが修正されています なんでやねん私の記憶では、StringLenは常に正しく動作していました(少なくともx32では)。
 
Sergey Dzyublik:
開発者の皆様へ。
デフォルトの代入演算子(コピーコンストラクタ)に強制コード生成を指定する機能を追加してください。

ちょっと複雑なんです。デフォルトのコンストラクタの類型を使うのが簡単です。

1) あらゆる代入演算 子がデフォルトの代入演算子を上書きする。

2) あらゆるコピー演算子がデフォルトのコピー演算子を上書きする。

 
A100:
部分的にミスを修正しただけ なんでやねん

MQLはNULL文字を含む文字列を扱う際に一貫した考えを持たないため、これが問題になっています。
例えば、StringToShortArrayは文字列中のNULL文字に対応していますが、逆関数のShortArrayToStringは対応していません...。

その結果、特定の課題を解決することよりも、バグを発見したり、回避策を探したりすることに多くの時間が費やされてしまうのです。

 
A100:

ちょっと複雑なんです。デフォルトのコンストラクタの類型を使うのが簡単です。

1) あらゆる代入演算 子がデフォルトの代入演算子を上書きする。

2)任意のコピー演算子は、デフォルトのコピー演算子をキャンセルします。

アンドゥはいらない、逆に強制世代が必要だ。
MQLには複雑な型のディープコピーを行う機能はなく、代入演算子やコピーコンストラクタではデフォルトで実装されています。

 
Sergey Dzyublik:

MQLでは、NULL文字を含む文字列を扱う際の一貫した考え方がないため、これが問題になっています。
例えば、StringToShortArrayは文字列中のNULL文字に対応していますが、その逆関数のShortArrayToStringは対応していません...。

一方ではイエス、他方では「or until terminal 0 is met」とドキュメントに 明示されています。

 
Sergey Dzyublik:
まあ、そもそもプラスからのゼロ線がなぜ引きずられたのか、ちょっと不明ではありますが。
 
A100:

一方では「はい」、他方では「いいえ」とドキュメントに 明示されています。

そして、StringToShortArrayも 同じことを言っています。

 Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0.

ただし、文字列中のNULL文字が適切に処理されることを妨げるものではありません。

 
こんにちは。MT5モバイル版で Alpariブローカーに接続できない。何が問題なのか?これはいずれ修正されるのでしょうか?