コンパイラ指令 $ZEROBASEDSTRINGS に ON を渡すと Index 0 番目からアクセスできるようです。
ちなみに ZEROBASESTRINGS OFF の状態だと Str[0] にアクセスしてるとコンパイルエラーが出ます。{$ZEROBASEDSTRINGS ON}procedure Test;varStr: String;i: INteger;begini := 0;Str := 'Hello, helper !';Writeln(Str[0]); // H が出力される!!!end;
[dcc32 エラー] Project1.dpr(18): E2157 0 番目の要素は参照できません - Length または SetLength を使ってください
で、大事なのはその先です。その先。
ZEROBASESTRINGS ON って、どこで使ってるんだろう?と思って \Embarcadero\RAD Studio\10.0\source\ に対して Grep してみました。
すると fmx\FMX.ASE.Lexer.pas に次のような記述が出てきました。
{$IFDEF NEXTGEN}{$ZEROBASEDSTRINGS ON}LHash := BobJenkinsHash(FString[0], FString.Length * SizeOf(FString.Chars[0]), 2004);{$ZEROBASEDSTRINGS OFF}{$ELSE}LHash := BobJenkinsHash(FString[1], FString.Length * SizeOf(FString.Chars[0]), 2004);{$ENDIF}
NEXTGEN という識別子で条件コンパイルしていました。
……
……!?
NEXTGEN !!!!!
これって噂の新型コンパイラのことでしょうか。
そして、新コンパイラになると String の開始インデックスが 0 になる……?
そう考えると TStringHelper が 0 インデックス初めなのも全て納得がいきます。
oh…!
なんってこった!
もし、そうなら、こいつは大変なことだ!
今までの資産の移行、Unicode 化の比では無い気がする……。
場所を見つけづらいという意味で。
そのための ZEROBASESTRINGS なのか。
NEXTGEN で \Embarcadero\RAD Studio\10.0\source\ に対して Grep すると大量にひっかかります。
一人興奮してるけど、皆さん知ってる事だったりするのかな……?
追記
↓下記のブログに ZEROBASEDSTRINGS について書かれているよ、と教えて貰いました。
XE3 RTL Changes: A closer look at TStringHelper
英語なので良く判らないのですが
Hopefully, you’ve inferred from what I’ve covered so far that zero based strings are something new in the compilerって書いてある!!ひゃー!
NextGen(Android)とWindowsで処理を分けないといけないといけないと思い、悩んでました。
返信削除とても助かりました。ありがとうございます!