[delphi-users:2336] Delphi XE2 の TGroup.Value どうしを + で結合すると例外発生

151 views
Skip to first unread message

suno

unread,
Nov 17, 2011, 9:31:31 AM11/17/11
to delphi...@freeml.com
春原と申します。

Delphi XE2 の正規表現クラスについて教えてください。

uses に RegularExpressions を追加し、フォームにボタンをひと
つ置き、OnClick イベントに以下のコードを貼り付けます。

procedure TForm1.Button1Click(Sender: TObject);
var
Matches: TMatchCollection;
grp: TGroupCollection;
begin
Matches := TRegEx.Matches('12.A', '^(\d+)\.(\w+)$');
if Matches.Count = 1 then
begin
grp := Matches[0].Groups;
ShowMessage(grp[1].Value + grp[2].Value); // (1)
ShowMessage(grp[1].Value + '' + grp[2].Value); // (2)
ShowMessage(Format('%s%s', [grp[1].Value, grp[2].Value])); // (3)
end;
end;

実行してボタンをクリックすると、(1) の行で以下のようなデバッ
ガ例外通知が出ます。

プロジェクト Project3.exe は例外クラス $C0000005 (メッセ
ージ 'access violation at 0x00407b00: read of address
0x00000039')を送出しました。

TGroup.Value は string 型なので + 演算子で結合できると思うの
ですが、何がいけないのでしょうか。(2) のように文字列リテラル
をはさむと例外は発生しません。(3) も問題なく実行されます。

何か根本的な勘違いをしているのでしょうか。ご教示、よろしくお
願いします。

--
春原 宏保 (すのはら ひろやす)
suno...@gmail.com
http://d.hatena.ne.jp/suno88/
http://twitter.com/suno88


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
練習や試合の予定調整は「とっとと決め太郎」におまかせ!
http://ad.freeml.com/cgi-bin/sa.cgi?id=h7h2H
-----------------------------------------------------[freeml by GMO]--

yuho

unread,
Nov 20, 2011, 10:37:11 PM11/20/11
to delphi...@freeml.com
こんにちは。天野と申します。

Access Violation ということは、メモリアドレスエラーということなので、
配列の範囲外にアクセスしたことなどが考えられます。

>ShowMessage(grp[1].Value + grp[2].Value); // (1)

これはgrp[1],grp[2]ではなくgrp[0],grp[1]だということはないでしょうか。

動作確認はしていないので、検討ちがいであればすみません。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
【おしゃれ泥棒】学園祭イベント実施中♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=h7ZaR

yuho

unread,
Nov 21, 2011, 10:35:49 AM11/21/11
to delphi...@freeml.com
天野です。

実際のコードで確かめずに検討違いのレスをしたようですみません。

動作して確認するとgrp[0]にはマッチした全体の文字列、grp[1],grp[2]に各グループ
が入っていました。

+で加算すると確かに例外が発生します。

下記のようにいったん別の変数に代入すると、例外が発生しなくなりました。

これが仕様なのかどうかは分かりませんが、 TGroup.Value
は元々のアドレスが割り当てられて、+
で加算してもメモリの再割当が行われないようです。

恐らく、マッチした結果は読み取り専用として処理すべきであって、取得した結果の文
字列に直接書き込むべきではないということだと思います。


procedure TForm1.Button1Click(Sender: TObject);
var
Matches: TMatchCollection;
grp: TGroupCollection;

a: string;
b: string;


begin
Matches := TRegEx.Matches('12.A', '^(¥d+)¥.(¥w+)$');
if Matches.Count = 1 then
begin
grp := Matches[0].Groups;

a := grp[1].Value;
b := grp[2].Value;
ShowMessage(a + b);
//ShowMessage(grp[1].Value + grp[2].Value); // (1)
//ShowMessage(grp[1].Value + '' + grp[2].Value); // (2)
//ShowMessage(Format('%s%s', [grp[1].Value, grp[2].Value])); // (3)
end;
end;

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
【わグルま!】キョンシーを捕まえよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=h8kKs

Reply all
Reply to author
Forward
0 new messages