type
TZS2 = string[2]; //(#1)
TZS2 = array[1..2] of Char; //(#2)
RZMax = 110;
RZenMap: array[1..RZMax] of TZS2 =
(' ', '。', '”', '゛', '゜', '´', '(', ')', '〔', '〕', // 1
'[', ']', '{', '}', '【', '】', '《', '》', '「', '」', // 2
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
'◎', '○', '●', '☆', '★', '⊿', '∮', '§', '£', '∑'); //11
function CheckZenMap(const S: TZS2): Boolean;
var
i: Integer;
begin
Result := False;
i := 1;
repeat
if RZenMap[i] = S then Result := True;
Inc(i);
until (i > RZMax) or Result;
end;
S[j]、S[j+1] には漢字の ShiftJis 第1,第2コードが入っている
zs[1] := S[j]; zs[2] := S[j+1];
if CheckZenMap(zs) then
(#1)のときzs[2]にゴミのコードが入るときがあります。
(#1)と(#2)では何が違うのでしょうか?
予約語stringはメモリを確保するだけで初期化はしてくれないみたいです。
半角英数は1byte文字なので、2byte目は何も定義されてません。
array[1..2] of Char; は場合によっては0で初期化してくれるので、
運良く動いているだけかと思います。
回答ありがとうございます。今のところ
array[1..2] of Char;
では不具合は起きていません。
TZS2 = string[2];
ではアプリを立ち上げた直後不具合が起こるときと、起きないときがあります。
> 予約語stringはメモリを確保するだけで初期化はしてくれないみたいです。
ということであれば string でも適当な文字を放り込んで初期化すればいいと思い、一応下のようにしたら、不具合は起きませんでした。もうしばらく様子を見たいと思います。
var
j,L: Intger;
S: string;
zs: TZS2;
begin
zs[1] := 'a'; zs[2] := 'b'; //適当な文字で初期化
j := 1; L := Length(S);
repeat
if S[j] in [#$81..#$9F, #$E0..#$FC] then
begin
zs[1] := S[j]; zs[2] := S[j+1];
if CheckZenMap(zs) then
・・・・・・・・・・・・・・・・
end;
until j > L;
ツイート | ![]() |