voidOnStart()
{
string s1 = "_";
Print(StringBufferLen(s1)); //(1)//Ожидалось 260 вместо 0 - строка s1 далее может быть увеличенаStringInit(s1,1,'_');
conststring s2 = s1;
Print(StringBufferLen(s2)); //(2)//Ожидалось 0\1 вместо 260 - строка s2 константная и не может быть далее увеличена
}
テストにStringLenを追加し、文字列の初期化を 変更した。ドキュメントにはあることが書いてあるが、実際の動作は違う。
そして、この場合のバッファは260ではなく0を表示します。
ドキュメントには0が返される場合が明記されており、指定されたケースに適している
文書には0が返されるタイミングが示されており、示されたケースに適切である。
ドキュメントと現在の動作が全く一致していない!
そして、その結果は異なる ))2種類の初期化の違いは何ですか?
それに、左の260という数字がどこから来ているのか、はっきりしない。
ドキュメントと現在の動作が全く一致していない!
文書:値0は、文字列が定数であり、バッファの内容を変更できないことを意味する。
文字列は定数「_」で初期化され、コンパイラは条件付きで(効率化のために)文字列を定数と見なす--なぜそうしないのか?なぜ矛盾が生じるのか?それ以上の操作をしないのでなおさらです。
また、一般に左記260番がどこから来ているのかは不明です。
司会者が、その由来を説明 し、なぜ、そのようなケースで
が表示されない - 確認する理由
司会者がどこからどこまでを明らかにした のか
260番でわかったと思うのですが、コンパイラ自身がStringBufferLen バッファの初期サイズを260に割り当てているのです。
文字列の長さが260より小さい場合、StringBufferLenは実際の文字列の長さではなく、260を表示します!
そして、文字列の長さが260より大きい場合は、実際の文字列の値を表示する。
そのため、StringBufferLen関数を使用して、文字列長が260文字未満の場合、実際の文字列長を得ることができず、常に260を得ることになる。
これはエラーに違いない。
長さが260文字を超えた時点で、本当の文字列の長さを取得することになります。
p.s. ドキュメントが古いため、非常に誤解を招きやすいのですが、ご了承ください。
つまり、StringBufferLen関数を使用して、文字列長が260文字未満の場合、実際の文字列長を得ることができず、常に260を得ることになるのです。
これはエラーに違いない。
260文字を超えた時点で、本当の長さを知ることになる。
厳密には文字列の長さ。 StringLenとバッファ長:StringBufferLenは、どちらかというと珍しい関数です。そして一般的には、それらは一致しないかもしれません。
そのため、少なくとも疑問のあるケースが2つあります。
実行結果は、コンパイラが論理に反して動作していることを示しています。
実行結果は、コンパイラが論理に反して動作していることを示しています。
文字列のバッファの事前割り当てサイズは、コンパイラの内部問題です。
今後、文字列の扱いを何度も変更する予定です。