MetaTrader 5 build 2121: ストラテジーテスターの新しいデザイン - ページ 7

 
Roman:

テストにStringLenを追加し、文字列の初期化を 変更した。ドキュメントにはあることが書いてあるが、実際の動作は違う。
そして、この場合のバッファは260ではなく0を表示します。

ドキュメントには0が返される場合が明記されており、指定されたケースに適している

 
A100:

文書には0が返されるタイミングが示されており、示されたケースに適切である。

ドキュメントと現在の動作が全く一致していない!

2種類の初期化の違いは何ですか?

StringInit(str, 1, "_");
string str = "_";
そして、その結果は異なる ))
それに、左の260という数字がどこから来ているのか、はっきりしない。
 
Roman:

ドキュメントと現在の動作が全く一致していない!

文書:値0は、文字列が定数であり、バッファの内容を変更できないことを意味する。

文字列は定数「_」で初期化され、コンパイラは条件付きで(効率化のために)文字列を定数と見なす--なぜそうしないのか?なぜ矛盾が生じるのか?それ以上の操作をしないのでなおさらです。

 
Roman:
また、一般に左記260番がどこから来ているのかは不明です。

司会者が、その由来を説明 し、なぜ、そのようなケースで

string str = "_";

が表示されない - 確認する理由

 
A100:

司会者がどこからどこまでを明らかにした のか

260番でわかったと思うのですが、コンパイラ自身がStringBufferLen バッファの初期サイズを260に割り当てているのです。
文字列の長さが260より小さい場合、StringBufferLenは実際の文字列の長さではなく、260を表示します!
そして、文字列の長さが260より大きい場合は、実際の文字列の値を表示する。

そのため、StringBufferLen関数を使用して、文字列長が260文字未満の場合、実際の文字列長を得ることができず、常に260を得ることになる。
これはエラーに違いない。
長さが260文字を超えた時点で、本当の文字列の長さを取得することになります。

p.s. ドキュメントが古いため、非常に誤解を招きやすいのですが、ご了承ください。

 
Roman:

つまり、StringBufferLen関数を使用して、文字列長が260文字未満の場合、実際の文字列長を得ることができず、常に260を得ることになるのです。
これはエラーに違いない。
260文字を超えた時点で、本当の長さを知ることになる。

厳密には文字列の長さ。 StringLenとバッファ長:StringBufferLenは、どちらかというと珍しい関数です。そして一般的には、それらは一致しないかもしれません。

そのため、少なくとも疑問のあるケースが2つあります。

void OnStart() 
{ 
        string s1 = "_";
        Print(StringBufferLen(s1)); //(1)//Ожидалось 260 вместо 0 - строка s1 далее может быть увеличена
        StringInit(s1,1,'_');
        const string s2 = s1;
        Print(StringBufferLen(s2)); //(2)//Ожидалось 0\1 вместо 260 - строка s2 константная и не может быть далее увеличена
}
 
まだ、ストラテジーテスターのオプティマイズの不具合が修正されていません。
修正してください。
私が使っている最適化設定、バランス+シャープレシオです、スクリーンショットの画像のように異常な最適化数値が表示されます、以降の最適化のジェネレーションにこの異常値による正常な最適化が不可能になっています。

MetaQuotes Software Corp.社へ
ストラテジーテスターの最適化の不具合はまだ修正されていません。
訂正してください。
使用している最適化設定はバランス+シャープ比ですが、スクリーンショットのように異常な最適化値が表示され、その後の最適化生成でこの異常値による正常な最適化が生成されます。不可能です。

ストラテジーテスターの 最適化におけるエラーはまだ修正されていません。
修正お願いします。
使っている最適化はバランス+シャープですが、スクリーンショットのように異常な最適化値が表示され、その後の最適化生成でこの異常値による正常な最適化が生成されます。これは不可能です
 
文字列の長 さは StringLen とする。また、StringBufferLenは、事前に割り当てられたメモリサイズを示しています。

文字列の事前割り当てメモリサイズは、コンパイラの内部問題であり、当てにならない。
 
Renat Fatkhullin:
事前に割り当てられた文字列のメモリサイズは、コンパイラの内部問題であり、これを当てにすることはできません。

実行結果は、コンパイラが論理に反して動作していることを示しています。

  • 定数文字列の 場合、必要以上のメモリが確保される(原理的に長さを増やすことはできない)
  • 定数でない文字列の場合、追加のメモリは確保されない(長さが増加した場合、新たなメモリ確保が必要となる)
  • StringInitInit で文字列を初期化すると、必要以上のメモリが割り当てられます。なぜなら、バッファのサイズはユーザが明示的に設定し、ほとんどの場合、バッファのサイズは増加しないからです(ユーザは、最終的にどのようなバッファが必要かを既に考え、明示的にサイズを設定しているのです)。
 
A100:

実行結果は、コンパイラが論理に反して動作していることを示しています。

  • 定数文字列の 場合、必要以上のメモリが確保される(原理的に長さを増やすことができない)
  • 定数でない文字列の場合、追加のメモリは確保されない(長さが増加した場合、新たなメモリ確保が必要となる)。
  • StringInitInit で文字列を初期化すると、必要以上のメモリが割り当てられます。なぜなら、バッファサイズはユーザが明示的に定義し、ほとんどの場合、バッファサイズは増加しないからです(ユーザは、最終的にどのようなバッファが必要かを既に考え、そのサイズを明示的に定義しているのです)。

文字列のバッファの事前割り当てサイズは、コンパイラの内部問題です。

今後、文字列の扱いを何度も変更する予定です。