[delphi-users:3130] PCharの扱いに぀いお

987 views
Skip to first unread message

ありい

unread,
May 13, 2013, 5:10:41 AM5/13/13
to delphi...@freeml.com
 皆様こんにちは。

 PCharの扱いに぀いお悩みが生じたしたので質問させお䞋さい。

 D7で䜜成したプログラムをXE2に移怍䞭ですが、䞋蚘コヌドがXE2では䟋倖が
発生したす。

DrawText(DefaultPage.Handle, PChar('あ'), -1, rc1, cFormat);

ハンドル、rc1、cFormatは適切に蚭定されおいたす。

 XE2では PChar('あ') を PChar('あ' + #0) に修正するず動䜜したす。

 DrawTextのドキュメントには「第匕数が-1の堎合はNULL終止にしおちょ」
ず曞かれおいるようなので「PChar('あ')っおNULL終止じゃなかったっけ」
...ず思い、䞋蚘コヌドをデバッガで止めおD7、XE2でそれぞれメモリダンプを
確認したした。

procedure TForm1.Button1Click(Sender: TObject);
var
pc: PChar;
begin
pc := PChar('あ');
ShowMessage(pc);
end;

 D7ではpcに代入盎埌、$82 $A0 $00 $00 ...ず期埅通りの状態ですがXE2では
「参照できない倀です」ずなり䞭身を確認できたせん。実行を続けるず䟋倖が
発生したす。

ちなみにXE2で pc := 'あ'; たたは PChar('あ' + #0) ずすれば期埅通りの
状態になりたす。

 質問は、「蚀語仕様䞊」、PChar('あ')のような蚘述はなのでしょうか
ずいうこずです。今たでD7では普通に䜿っおいたのでXE2でダメっお蚀われるず
少し釈然ずしない気持ちです。

 元々D7でも宜しくないけど、たたたた動䜜しおいただけっお事でしたら諊め
も぀きたす(笑)

PChar('あ' + #0) が通るので、やっぱり若干の釈然ずしない感は残るず思い
たすが(笑)

どうあれ珟実問題ずしお、XE2では先のコヌドのように䟋倖が発生しないよう
に盎しお回るしかないのでしょうけど...(^^;

 今埌の(D7含めた)コヌディングスタむルを考え盎すために、ご教瀺頂ければ
幞いです。

 以䞊、よろしくお願いしたす m(__)m

ありい


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
緎習や詊合の予定調敎は「ずっずず決め倪郎」におたかせ
http://ad.freeml.com/cgi-bin/sa.cgi?id=jQBzf
------------------------------------------------------[freeml byGMO]--

ありい

unread,
May 13, 2013, 6:03:03 AM5/13/13
to delphi...@freeml.com
 連投、倱瀌したす m(__)m

 ぐぐっおいお䞋蚘の蚘事を芋぀けたした。

http://kakinotane.s7.xrea.com/delphi/faq/f006.html

 「文字列定数ず PChar ずの関係は䜕か」の
 「3) 文字定数 の PChar 型ぞのキャストはうたく行かない(バグ)」ず同じ
珟象のようです。

XE2でpcのポむンタを確認したずころ、$3042(UTF-8の「あ」)なのでビンゎ

 こちらはD5での珟象ずのこずなので今のずころ、

  D5 ×
  D7 ○
  XE2 ×
 
...ずいう状況のようです。なんだかな(^^;

ありい


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
新アプリ「freemlトヌク」で気軜に䌚話を楜しもう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jQCmB
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
May 13, 2013, 6:21:24 AM5/13/13
to delphi...@freeml.com
ありいさん

こんにちは
现川です。

蚘事の D5 で調べおいるのは 'a' ずいう文字ですね。

D7 ず XE2 で、ありいさんが調べられお居るのは 'あ' ずいう文字ですよね
この堎合

---------------------------------------------------
■D7
文字コヌドShift-JIS
文字数2DBCS

'あ'は文字で構成される→ 文字列

---------------------------------------------------
■XE2(2009 以降)
文字コヌドUnicode(UTF-16)
文字数1

'あ'は文字で構成される→ 文字
---------------------------------------------------

ずなりたす。
よっお、XE2 で PChar('あ') は 'あ' ずいう「文字」ぞのポむンタになりたす。
長い文字列型は Null 終端ですが、文字は終端などありたせんので、これが正しい結果
です。
Regards,
HOSOKAWA Jun
[S/G] SERIALGAMES Inc.
TEL: 03-5812-0980
FAX: 03-5812-0970
twitter: http://twitter.com/serialgames
twitter: http://twitter.com/flaver_sg
mailto: j...@serialgames.co.jp
fla:ver http://flaver.jp/
WebCapS http://www.serialgames.co.jp/fun.html#WebCapSeria


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
䜿い方はいろいろ♪䞀郚のメンバヌだけにMLメヌルを送ろう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jQC3S
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
May 13, 2013, 6:31:31 AM5/13/13
to delphi...@freeml.com
ありいさん

现川です。

補足ですが、ポむンタ操䜜をする堎合は、そのポむンタ・ポむンタを埗たいデヌタ型は
明瀺すべきです。

぀たり、先ほどの堎合は

PChar(String('あ'))

ずすれば、防げたす。

同様に、䞋蚘の様に Dispose に察しお型無しポむンタを枡すず、そのポむンタが指し
おいる倉数の終了凊理が実行されたせん。

procedure Exsample;
type
PFoo = ^TFoo;
TFoo = record
A: String; // 長い文字列バむトのポむンタずなる
B: Integer; // バむト
end;
var
Foo: PFoo;
Ptr: Pointer;
begin
New(Foo);
try
Ptr := Foo;
finally
// バむトのメモリ空間は解攟されるが、長い文字列の解攟ができない。
Dispose(Ptr);

// 正しくは、このように型を指定しおやる必芁がある
Dispose(PFoo(Ptr));
end;
end;
メンバヌで䜿える掲瀺板を掻甚しよう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jQCCN
------------------------------------------------------[freeml byGMO]--

䞭村ブレヌン

unread,
May 13, 2013, 9:00:43 PM5/13/13
to delphi...@freeml.com
䞭村ブレヌンです。

Delphi 1 に最初に觊れたずき、文字ず文字列の区別が䞍明瞭な仕様に
おどろいた芚えがありたす。

以来、䞀文字の文字列は慎重に扱うようにしおいたす。

私は、文字列ずしお扱いたい時は、 String型の倉数に入れおしたうこずが倚いですね。

匏の䞭でテンポラリに String 型を䜜っお、その参照を保持しないのは、
ちょっず怖い気がしたす。

ありい さんは曞きたした:
> D7で䜜成したプログラムをXE2に移怍䞭ですが、䞋蚘コヌドがXE2では䟋倖が
>発生したす。
>
> DrawText(DefaultPage.Handle, PChar('あ'), -1, rc1, cFormat);

----------
東京郜 日野垂 䞭村拓男


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メヌルだけでみんなを招埅できる䟿利機胜♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=jQKp8
------------------------------------------------------[freeml byGMO]--

ありい

unread,
May 13, 2013, 9:57:41 PM5/13/13
to delphi...@freeml.com
 现川さん、ご返信ありがずうございたす。

> ■D7
> 文字コヌドShift-JIS
> 文字数2DBCS
>
> 'あ'は文字で構成される→ 文字列
>
> ---------------------------------------------------
> ■XE2(2009 以降)
> 文字コヌドUnicode(UTF-16)
> 文字数1
>
> 'あ'は文字で構成される→ 文字

 ご指摘の通りですね(^^; D7では文字列、XE2では文字なのを
芋萜ずしおいたした。

> よっお、XE2 で PChar('あ') は 'あ' ずいう「文字」ぞのポむンタになりたす。
> 長い文字列型は Null 終端ですが、文字は終端などありたせんので、これが正しい結果
> です。

 こちらは、

(1) pc := PChar('あ');

 「PChar('あ') は 'あ' ずいう「文字」ぞのポむンタ」ではなく、
pc に'あ'の文字コヌド($3042)がキャストされお、アドレスずしお
セットされる

(2) ShowMessage(pc);

 pcを参照した時に$3042を芋に行くのでアドレス違反が発生する

...のだず思いたすが、劂䜕でしょうか。

「文字は終端などありたせんので」以前に、参照しおはいけない
アドレスを指定しおしたっおいる、ずいう動きに芋えたす。

 ぀たりDelphiのバヌゞョンに関わらず、

pc := PChar('(文字)'); // 文字 = Char
// Charの文字コヌドをPCharにアドレスずしおキャスト

 →文字コヌドのアドレスを芋に行くからアドレス違反に

pc := PChar('(文字列)'); // 文字 + ''、''のみは文字列ずなる
// 正しいポむンタが埗られる

...ず理解したした。

 そしお正盎、理解はできるけど玛らわしいなっお思いたす(^^;

「Charの文字コヌドをPCharにアドレスずしおキャスト」する甚が
それほど䞀般的に存圚したすかね...っお点でシンタックス
シュガヌで必ず文字列にしおくれる方が混乱しないような...

本圓に「Charの文字コヌドをPCharにアドレスずしおキャスト」
が必芁な人は pc := Pointer('A'); っおすれば良いず思うし...(^^;

 ずもあれ、私の疑問、

『「蚀語仕様䞊」PChar('あ')のような蚘述はなのでしょうか』

...は「ではないが避けるべきだ」ずいう結論に達したした。

> 補足ですが、ポむンタ操䜜をする堎合は、そのポむンタ・ポむンタを埗たいデヌタ型は
> 明瀺すべきです。
(äž­ç•¥)
> 同様に、䞋蚘の様に Dispose に察しお型無しポむンタを枡すず、そのポむンタが指し
> おいる倉数の終了凊理が実行されたせん。

 その通りだず思いたした。

 補足ず䜵せお、詳しい解説をありがずうございたした

 たた䜕かありたしたら宜しくお願いしたす m(__)m

ありい


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
緎習や詊合の予定調敎は「ずっずず決め倪郎」におたかせ
http://ad.freeml.com/cgi-bin/sa.cgi?id=jQLbx
------------------------------------------------------[freeml byGMO]--

ありい

unread,
May 13, 2013, 10:06:34 PM5/13/13
to delphi...@freeml.com
 䞭村さん、ご返信ありがずうございたす。

> 以来、䞀文字の文字列は慎重に扱うようにしおいたす。
>
> 私は、文字列ずしお扱いたい時は、 String型の倉数に入れおしたうこずが倚いですね。
>
> 匏の䞭でテンポラリに String 型を䜜っお、その参照を保持しないのは、
> ちょっず怖い気がしたす。

 今回の件で、物凄く怖い思いが出来たした(^^;

 今埌はテンポラリを䜜成する圢で行きたいず思いたす

ありい


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
新アプリ「freemlトヌク」で気軜に䌚話を楜しもう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jQLiU
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
May 13, 2013, 10:45:25 PM5/13/13
to delphi...@freeml.com
ありいさん

现川です。

> (1) pc := PChar('あ');
>
>  「PChar('あ') は 'あ' ずいう「文字」ぞのポむンタ」ではなく、
> pc に'あ'の文字コヌド($3042)がキャストされお、アドレスずしお
> セットされる

'あ' は、文字定数になるので、その通りですね。
倱瀌いたしたした。

> 「Charの文字コヌドをPCharにアドレスずしおキャスト」する甚が
> それほど䞀般的に存圚したすかね...っお点でシンタックス
> シュガヌで必ず文字列にしおくれる方が混乱しないような...

「文字定数をアドレスにキャストする」ずいう甚途はほがないず思いたすが、蚀語仕様
ずしお「文字」ず「文字列」が区別されおいないので、たあ仕方が無いかなあず思いた
す。
Regards,
HOSOKAWA Jun
[S/G] SERIALGAMES Inc.
TEL: 03-5812-0980
FAX: 03-5812-0970
twitter: http://twitter.com/serialgames
twitter: http://twitter.com/flaver_sg
mailto: j...@serialgames.co.jp
fla:ver http://flaver.jp/
WebCapS http://www.serialgames.co.jp/fun.html#WebCapSeria


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
䜿い方はいろいろ♪䞀郚のメンバヌだけにMLメヌルを送ろう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jQLF3
------------------------------------------------------[freeml byGMO]--

ありい

unread,
May 13, 2013, 11:14:36 PM5/13/13
to delphi...@freeml.com
 现川さん、ご確認ありがずうございたす。

> 「文字定数をアドレスにキャストする」ずいう甚途はほがないず思いたすが、蚀語仕様
> ずしお「文字」ず「文字列」が区別されおいないので、たあ仕方が無いかなあず思いた
> す。

 同感です。これから盎すにしおも今曎感がありたすし(^^;

 蚀語仕様ずしおは、理解・玍埗できたした。

pc := PChar('A'); // NG
pc := PChar('AA'); // OK

 しかし䞊蚘のように䞊べお芋るず、やっぱり「優しくない」印象を
受けたす...

そしお䜿い道は「Delphi蚀語マニアッククむズ」のネタぐらいしか
思い浮かびたせん(^^;

 因みに先のコヌドは描画の印字高さを取埗するのに䜿っおいたした。
だから'あ'でいいや...っお感じでした。その感芚でAPIに枡すずきに
PChar括りをしお... 最初の投皿に戻る

ありい


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メンバヌで䜿える掲瀺板を掻甚しよう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jQMht
------------------------------------------------------[freeml byGMO]--

䞭村ブレヌン

unread,
May 13, 2013, 11:22:47 PM5/13/13
to delphi...@freeml.com
あれ、うたく䌝わったかな

䟋えば

PChar(String('あ'))

ず曞いた堎合、String('あ') の参照を誰も保持しおいないので、
String('あ')の寿呜がい぀尜きるかはっきりはっきりしたせん。
文字列は参照がなくなるず砎棄されるのが Delphi蚀語の仕様。
ひょっずするず寿呜が無限倧な定数文字列扱いかもしれないけどそれもはっきりしない。

なので念のため、PCharで文字列を䜿甚するずきは

s: string;
p: PChar;

s := 文字列の匏;
p := PChar(s);
// pを䜿う凊理。

なんおしおたす。

ありい さんは曞きたした:
> 今埌はテンポラリを䜜成する圢で行きたいず思いたす

----------
東京郜 日野垂 䞭村拓男


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メヌルだけでみんなを招埅できる䟿利機胜♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=jQMqu
------------------------------------------------------[freeml byGMO]--

ありい

unread,
May 14, 2013, 2:17:59 AM5/14/13
to delphi...@freeml.com
 䞭村さん、解説ありがずうございたす。

匕甚の順序を倉曎しおいたす。

> なので念のため、PCharで文字列を䜿甚するずきは
>
> s: string;
> p: PChar;
>
> s := 文字列の匏;
> p := PChar(s);

 そのように理解しおいたす。最初のコヌド

DrawText(DefaultPage.Handle, PChar('あ'), -1, rc1, cFormat);

...を、

s := 'あ';
DrawText(DefaultPage.Handle, PChar(s), -1, rc1, cFormat);

...のように修正すれば良いず考えおいたす。

 この修正により、PChar()が必ず文字列ずしお評䟡されるようになり、
文字・文字列の混乱から抜け出せるず思いたす。

> 今埌はテンポラリを䜜成する圢で行きたいず思いたす

 s := 'あ'; のs を「テンポラリを䜜成」ず衚珟したした。なんだか
玛らわしかったようで申し蚳ありたせん m(__)m

ここから、文字列の氞続性の件に぀いお。

> PChar(String('あ'))
>
> ず曞いた堎合、String('あ') の参照を誰も保持しおいないので、
> String('あ')の寿呜がい぀尜きるかはっきりはっきりしたせん。
> 文字列は参照がなくなるず砎棄されるのが Delphi蚀語の仕様。
> ひょっずするず寿呜が無限倧な定数文字列扱いかもしれないけどそれもはっきりしない。

 XE2のヘルプを読んで、最初は最適化か䜕かでいきなり砎棄されお
いるのかななどず䞀瞬思いたした(^^;

'あ' + #0のケヌスが動くので、その可胜性はすぐに消したした。

 今回のようにスレッドなどが絡たないケヌスでは、ずりあえずは
DrawText()が終わるたで氞続しおいれば充分ず思っおいたすが...(^^;

 仮に、

DrawText(DefaultPage.Handle, PChar(String('あ')), -1, rc1, cFormat);

...ず曞いたずしお、String('あ')がDrawTextの凊理䞭皋床の氞続も
保蚌されおいない、ずいう事でしょうか

 䟋えばDelphiの関数で䜕か長時間の凊理が行われるずしたす。

function LongTime(s: string): string;
begin
// (長時間の凊理)

result := s + ' - すげヌ時間かかりたした';
end;

// 長時間の凊理呌び出し
ShowMessage(LongTime('あいう'));

 この凊理の呌び元の'あいう'が、LongTime関数の最埌の行たでは
氞続しおいるだろう事は、感芚的に信じおいたす。

 これが、

function LongTime(p: PChar): string;
begin
// (長時間の凊理)

result := p + ' - すげヌ時間かかりたした';
end;

ShowMessage(LongTime(PChar(String('A'))));

 や、APIの呌び出しの堎合は無保蚌ずいうこずでしょうか

 最初に瀺しお頂いた䞋蚘コヌドのように、s: string; p: PChar;
ずしお別途宣蚀しないず、参照を保持した事にはならないずいう事で
しょうか

> s: string;
> p: PChar;
>
> s := 文字列の匏;
> p := PChar(s);

 くどくなっおしたっお本圓に申し蚳ないですm(__)m
 お答え頂けるず幞いです m(__)m

ありい


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
緎習や詊合の予定調敎は「ずっずず決め倪郎」におたかせ
http://ad.freeml.com/cgi-bin/sa.cgi?id=jQP9W
------------------------------------------------------[freeml byGMO]--

ありい

unread,
May 14, 2013, 5:07:58 AM5/14/13
to delphi...@freeml.com
 床々恐れ入りたす。

 D7ヘルプの「文字列䟝存性」に思いっきり曞いおありたした(^^;

[以䞋、D7ヘルプを匕甚]

proceduremy_func(x:string);
begin
//do something with x
some_proc(PChar(x));//文字列をPchar にキャストする
//some_proc プロシヌゞャが文字列を必芁ずする間
//文字列が存続するこずを保蚌する必芁がある
end;

[匕甚終了]

> ShowMessage(LongTime(PChar(String('A'))));
>
> や、APIの呌び出しの堎合は無保蚌ずいうこずでしょうか

...぀たり、䞊蚘は「無保蚌」ずいうこずですね。

ずいうか「自力で保蚌しなさい」ず。

 最埌に、

var
s: string;
begin
s := 'あ';
DrawText(DefaultPage.Handle, PChar(s), -1, rc1, cFormat);

...ずいう圢では、保蚌した事にはならないのでしょうか

 普段、文字列の氞続性を気にする事は䞭々ないですが、考えるず
ややこしくお面癜いですね(^^;

そう考えるず、たたたた無事に動いおいるように芋えるけれど、
本圓は危ないコヌドが沢山ある気がしおきたした(^^;

ありい


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
新アプリ「freemlトヌク」で気軜に䌚話を楜しもう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jQSaJ
------------------------------------------------------[freeml byGMO]--

高朚倪郎

unread,
May 14, 2013, 8:23:34 AM5/14/13
to delphi...@freeml.com
 こんばんは、むマゞオムの高朚です。

ありいさん
>> ShowMessage(LongTime(PChar(String('A'))));
>>
>> や、APIの呌び出しの堎合は無保蚌ずいうこずでしょうか
>
> ...぀たり、䞊蚘は「無保蚌」ずいうこずですね。
>
> ずいうか「自力で保蚌しなさい」ず。

 PChar や PAnsiChar ぞのキャストした堎合の文字列ポむンタは、
その文の䞭では有効であるこずが保蚌されおいたず思いたす。

 䞊蚘の䟋なら、ShowMessage(LongTime(PChar(String('A')))) から
抜けおくるたでは、string('A') ぞのポむンタは有効であるはず
ですよ。


> var
> s: string;
> begin
> s := 'あ';
> DrawText(DefaultPage.Handle, PChar(s), -1, rc1, cFormat);
>
> ...ずいう圢では、保蚌した事にはならないのでしょうか

 これはさらに安党です。 end に到達するか、s の内容が倉曎
されるたで、s ぞのポむンタは保蚌されたす。


>  普段、文字列の氞続性を気にする事は䞭々ないですが、考えるず
> ややこしくお面癜いですね(^^;
>
> そう考えるず、たたたた無事に動いおいるように芋えるけれど、
> 本圓は危ないコヌドが沢山ある気がしおきたした(^^;

 そんなに危ないこずはないのですが、PChar でキャストした
ポむンタを倉数に代入しお䜿いたわすような堎合には泚意が
必芁です。 たずえばこんな堎合です。

  pc := PChar(s);
  s:=s+'abc'; {<======= ここで pc が無効になるかも }
Hoge(pc); {<======= ここでアクセス違反 }

――――――――――――――――――――――――――――――――――――
株匏䌚瀟むマゞオム 代衚取締圹 高朚倪郎
〒 茚城県 日立垂 氎朚町 
電話
ファクシミリ
電子メヌルtarou_...@imageom.co.jp
ホヌムペヌゞhttp://www.imageom.co.jp/


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
䜿い方はいろいろ♪䞀郚のメンバヌだけにMLメヌルを送ろう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jQUZH
------------------------------------------------------[freeml byGMO]--

䞭村ブレヌン

unread,
May 14, 2013, 11:35:34 PM5/14/13
to delphi...@freeml.com
䞭村です。

高朚倪郎 さんは曞きたした:
> PChar や PAnsiChar ぞのキャストした堎合の文字列ポむンタは、
>その文の䞭では有効であるこずが保蚌されおいたず思いたす。
>

Delphi 5 で、コンパむルコヌドを远っお芋たこずがありたすが、埌始末コヌドは関数の実行盎埌の䜍眮に
埋め蟌たれるようでした。参照カりント型のオブゞェクトはむンタヌフェヌスの参照カりントなども含め、できるだけ
埌始末を埌ろに䌞ばそうずいうコンパむラの意図は感じられたのですが・・・

でも
bar(PCHAR(長い文字列の匏));

がうたく動かなかったずいう経隓があったので(時期的には Delphi 4以前 バグ)。

油断倧敵かもしれたせん。D7の蚀語仕様にも蚘述はないし、避けたほうが無難だず思いたす。
XEずかではありたしたっけ 未確認です。

----------
東京郜 日野垂 䞭村拓男


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メンバヌで䜿える掲瀺板を掻甚しよう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jRdhN
------------------------------------------------------[freeml byGMO]--

ありい

unread,
May 15, 2013, 1:05:51 AM5/15/13
to delphi...@freeml.com
 高朚さん、䞭村さん、ご返信ありがずうございたす。

(高朚さん)
>  PChar や PAnsiChar ぞのキャストした堎合の文字列ポむンタは、
> その文の䞭では有効であるこずが保蚌されおいたず思いたす。
>
>  䞊蚘の䟋なら、ShowMessage(LongTime(PChar(String('A')))) から
> 抜けおくるたでは、string('A') ぞのポむンタは有効であるはず
> ですよ。

 昚日たでは、そう信じおいたしたが...

 「文字列䟝存性」のヘルプを読んだら確信が揺らぎたした(^^;

[D7ヘルプより匕甚] ※XE2も同様の蚘茉でした

たずえばPChar 型の匕数をずる関数を䜿甚する堎合などに長い文字列をヌルで終わる文字列に倉換する必芁が生じるこずがありたす。文字列を
PChar ぞキャストする必芁がある堎合は結果ずしお生ずるPChar の存続期間を管理しなければならないこずに泚意しおください。長い文字列は参
照カりントされるため文字列のPChar ぞの型キャストによっお実際には参照カりントがむンクリメントされずに文字列ぞの䟝存が1぀増えた
す。参照カりントがれロに到達するず文字列ぞの远加の䟝存がある堎合でもその文字列は砎棄されおしたいたす。型キャストPChar もPChar
を枡したルヌチンがただPChar を䜿甚しおいる間に消えおしたいたす。䟋を瀺したす。

[匕甚終了]

そしお昚日匕甚のコヌドに続きたす。

(高朚さん)
>  これはさらに安党です。 end に到達するか、s の内容が倉曎
> されるたで、s ぞのポむンタは保蚌されたす。
....
>  そんなに危ないこずはないのですが、PChar でキャストした
> ポむンタを倉数に代入しお䜿いたわすような堎合には泚意が
> 必芁です。 たずえばこんな堎合です。

 了解したした(^^) 普段そのような䜿い方はしないので、必芁に
なった際には気を付けたいず思いたす。

(䞭村さん)
> 油断倧敵かもしれたせん。D7の蚀語仕様にも蚘述はないし、避けたほうが無難だず思いたす。
> XEずかではありたしたっけ 未確認です。

 XE2の「文字列䟝存性」呚りをチェックしたしたが、D7ず同じ事が
曞いおありたすので蚀語仕様の倉曎はないものず掚枬したす。

 ずいう事で「文字・文字列の混乱」ず「文字列の氞続性」の぀
の芳点から、今埌は

ShowMessage(LongTime(PChar(String('A'))));

...ずいう蚘述は避け、

var
s: string;
begin
s := 'A';
ShowMessage(LongTime(PChar(s)));

...の蚘述を心掛けたいず思いたす。

 现川さん、䞭村さん、高朚さん、色々ずありがずうございたした

ありい


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メヌルだけでみんなを招埅できる䟿利機胜♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=jReze
------------------------------------------------------[freeml byGMO]--

䞭村拓男(自宅)

unread,
May 15, 2013, 1:37:30 AM5/15/13
to "delphi-users@freeml.com"
昔も䌌たような議論があったようですね。高岡さんの解析がすごい。

[Delphi-ML:64722] PChar(string) の有効性に぀いお
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=064722


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
緎習や詊合の予定調敎は「ずっずず決め倪郎」におたかせ
http://ad.freeml.com/cgi-bin/sa.cgi?id=jReMA
------------------------------------------------------[freeml byGMO]--

auemura

unread,
May 15, 2013, 1:41:28 AM5/15/13
to delphi...@freeml.com
䞊村です。

Delphi Forumの方に曞いたのですがこちらにも。
Webからなのでスレッドが切れおいたらすみたせん。

XE3のヘルプですが文字列型のペヌゞhttp://docwiki.embarcadero.com/RADStudio/XE3/ja/%E6%96%87%E5%AD%97%E5%88%97%E5%9E%8B
に「Delphi 文字列ず NULL 終端文字列の混圚」ずいう項目で
「UnicodeString 型たたは AnsiString 型の倉数をポむンタにキャストする堎合は、その倉数が新しい倀を代入されるかスコヌプから倖れるたで、そのポむンタは有効です。他の任意の文字列匏をポむンタにキャストする堎合、そのポむンタは、型キャストが実行されるステヌトメント内でのみ有効です。」
ずいう蚘述があるので、高朚さんの蚀われおいるように
ShowMessage(LongTime(PChar(String(''A''))))
から抜けるたではポむンタは有効であるず思いたす。
新アプリ「freemlトヌク」で気軜に䌚話を楜しもう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jReQC
------------------------------------------------------[freeml byGMO]--

䞭村拓男(自宅)

unread,
May 15, 2013, 2:38:17 AM5/15/13
to delphi-users
>他の任意の文字列匏をポむンタにキャストする堎合、そのポむンタは、型キャストが実>行されるステヌトメント内でのみ有効です。

ありがずうございたす。珟圚のDelphiでは倧䞈倫そうですね。

2013幎5月15日 14:41 auemura <delphi...@freeml.com>:
--
----------
Takuo Nakamura from Hino City Tokyo



MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
䜿い方はいろいろ♪䞀郚のメンバヌだけにMLメヌルを送ろう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jRfDH
------------------------------------------------------[freeml byGMO]--

ありい

unread,
May 15, 2013, 6:47:56 AM5/15/13
to delphi...@freeml.com
 䞊村さん、ご返信ありがずうございたす。

> ずいう蚘述があるので、高朚さんの蚀われおいるように
> ShowMessage(LongTime(PChar(String(''A''))))
> から抜けるたではポむンタは有効であるず思いたす。

 了解したした ほっずできる情報です(^^)

 コヌディングスタむルに関しおは、文字・文字列混圚の問題が
残っおいるので、前蚘のたたでず考えおおりたす。

ありい


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メンバヌで䜿える掲瀺板を掻甚しよう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jRjyd
------------------------------------------------------[freeml byGMO]--

ずんが

unread,
May 16, 2013, 1:40:02 AM5/16/13
to delphi...@freeml.com
䞀旊、終わったようですが・・・・
コンパむラのバグっお事ですよね
Char型にPCharでキャストできるっお・・・
やる方が悪いのですかね

Delphiです。

procedure TForm1.Button1Click(Sender: TObject);
var
pc : PChar;
Msg : String[11];
ch : Char;
begin
pc := PChar('A');
ShowMessage(pc); // 実行時゚ラヌ
ch := 'A';
pc := PChar(ch);
ShowMessage(pc); // 実行時゚ラヌ
Msg := 'AA';
pc := PChar(Msg); // コンパむル゚ラヌ
ShowMessage(pc);
pc := PChar(String(Msg)); // Stringに型倉換
ShowMessage(pc); // ゚ラヌなし
end;
MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
新アプリ「freemlトヌク」で気軜に䌚話を楜しもう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jRvn4
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
May 16, 2013, 1:43:48 AM5/16/13
to delphi...@freeml.com
ずんがさん

こんにちは。
现川です。

バグでは無いですね。
蚀語仕様通りの動きです。
Regards,
HOSOKAWA Jun
[S/G] SERIALGAMES Inc.
TEL: 03-5812-0980
FAX: 03-5812-0970
twitter: http://twitter.com/serialgames
twitter: http://twitter.com/flaver_sg
mailto: j...@serialgames.co.jp
fla:ver http://flaver.jp/
WebCapS http://www.serialgames.co.jp/fun.html#WebCapSeria


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
䜿い方はいろいろ♪䞀郚のメンバヌだけにMLメヌルを送ろう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jRvr4
------------------------------------------------------[freeml byGMO]--

ありい

unread,
May 16, 2013, 2:00:39 AM5/16/13
to delphi...@freeml.com
 ずんがさん、こんにちは。

> 䞀旊、終わったようですが・・・・
> コンパむラのバグっお事ですよね

 いいえ、仕様ずいう事です。

 前の投皿で曞いた、䞋蚘行ですが、

> pc := PChar('A'); // NG
> pc := PChar('AA'); // OK

 NGずいうのは「私の」期埅通りにならない...ずいう意味合いです。

「私」同様に、期埅される方も倚いだろうずは思いたすが。

 曞き換えるず、

pc := PChar(「文字」型);
// 'A'は「文字」型「文字」の内容をアドレスずしおキャストする

pc := PChar(「文字列」型);
// 'AA'は「文字列」型「文字列」のポむンタ先頭のアドレスを返す

...ずなりたす。

 そしおPChar(「文字」型)が『「文字」の内容をアドレスずしお
キャストする』のは、正しい動䜜ず蚀えたす。

通垞のキャストに期埅する動䜜ずしお「正しい」のです。

 ただ、

pc := PChar('A');
pc := PChar('AA');

...ず䞊べお芋た時に、䞊が「文字」のキャストで䞋が「文字列」の
キャストずいうのは、ずっおも玛らわしい䞔぀刀りにくいね...
っおお話なのです。

> Char型にPCharでキャストできるっお・・・
> やる方が悪いのですかね

 たぁ、普通やらんよね... ずは思いたすし、シンタックスシュガヌ
で良きに蚈らっおくれた方が嬉しかったねぇ... ずいう思いを、前の
投皿には蟌めおいる぀もりです。

ありい


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メンバヌで䜿える掲瀺板を掻甚しよう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jRv4T
------------------------------------------------------[freeml byGMO]--

ken

unread,
May 16, 2013, 4:07:03 AM5/16/13
to delphi...@freeml.com
こんにちは。
䌌たような報告がQualityCentralに以前ありたしたが、As Designed で Close されおおりたす。
[AV in OutputDebugString]
http://qc.embarcadero.com/wc/qcmain.aspx?d=99583

--
高橋智宏

ずんが wrote:
> 䞀旊、終わったようですが・・・・
> コンパむラのバグっお事ですよね
> Char型にPCharでキャストできるっお・・・
> やる方が悪いのですかね
>
> Delphiです。
>
> procedure TForm1.Button1Click(Sender: TObject);
> var
> pc : PChar;
> Msg : String[11];
> ch : Char;
> begin
> pc := PChar('A'); ShowMessage(pc); // 実行時゚ラヌ
> ch := 'A';
> pc := PChar(ch); ShowMessage(pc); // 実行時゚ラヌ
> Msg := 'AA';
> pc := PChar(Msg); // コンパむル゚ラヌ
> ShowMessage(pc);
> pc := PChar(String(Msg)); // Stringに型倉換
> ShowMessage(pc); // ゚ラヌなし
> end;


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メヌルだけでみんなを招埅できる䟿利機胜♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=jRxnw
------------------------------------------------------[freeml byGMO]--

ずんが

unread,
May 16, 2013, 5:00:12 AM5/16/13
to delphi...@freeml.com
现川さん・ありいさん・Kenさん
早い回答頂き有難うございたす。

皆さんのご指摘されおいる、䞋蚘URLに色々有るのですが

http://leed.issp.u-tokyo.ac.jp/~takeuchi/delphi/browse.cgi?index=064757&back=http%3A%2F%2Fkakinotane.s7.xrea.com%2Fdelphi%2Ffaq%2Ff006.html
http://edn.embarcadero.com/jp/article/38791
http://kakinotane.s7.xrea.com/delphi/faq/f006.html
http://www.watercolor-city.net/ct_delphi/delphi_tiburon/doc_unicode/implict_convert.htm


もう䞀぀理解できたせん。
型キャストっお、ある倉数を別の型でオヌバヌラップするだけだず思っおいるのです。

Char型にPCharでキャストすれば、サむズが違うので゚ラヌに成りそうな気がするのですが。
Delphiコンパむラヌは、厳栌な型チェックを行っおくれるのに
以䞋は、明らかに間違いですが、コンパむルは通りたす。
ch:Char;//Byteintegerint64の時も
p :pointer;
p := pointer(ch);
p := pchar(ch);

Charは、Byteず同矩なので通っおしたう様な気がしたす。
Pointer型のキャストは、察象が数倀型なら䜕でもいいみたいですね。

ちょっず䞍现工なコヌディングですが、キャストに付いお理解しおる事を詊しおみたした。
procedure TForm1.Button3Click(Sender: TObject);
Type
ArChar = Array[0..10] of Byte;
var
st : string;
pc : PChar;
sa : String;
begin
St := '01234567890';
St := '01234';
sa := intTohex(integer(@st), 8);
ShowMessage('文字列倉数のアドレス= '+sa);
sa := intTohex(integer(pointer(st)^), 8);
ShowMessage('文字列倉数の指す文字列ぞのアドレス= '+sa);
ShowMessage('文字列倉数の指す文字列ぞのアドレスの実態= '
+intToHex(ArChar(pointer(st)^)[0], 2)
+intToHex(ArChar(pointer(st)^)[1], 2)
+intToHex(ArChar(pointer(st)^)[2], 2)
+intToHex(ArChar(pointer(st)^)[3], 2)
+intToHex(ArChar(pointer(st)^)[4], 2)
+intToHex(ArChar(pointer(st)^)[5], 2)
+intToHex(ArChar(pointer(st)^)[6], 2)
+intToHex(ArChar(pointer(st)^)[7], 2)
+intToHex(ArChar(pointer(st)^)[8], 2)
+intToHex(ArChar(pointer(st)^)[9], 2)
+intToHex(ArChar(pointer(st)^)[10], 2));
// 䜕故か、567890が無くなりたす。 
St := '01234567890';
sa := intTohex(integer(@st), 8);
ShowMessage('文字列倉数のアドレス= '+sa);
sa := intTohex(integer(pointer(st)^), 8);
ShowMessage('文字列倉数の指す文字列ぞのアドレス= '+sa);
ShowMessage('文字列倉数の指す文字列ぞのアドレスの実態= '
+intToHex(ArChar(pointer(st)^)[0], 2)
+intToHex(ArChar(pointer(st)^)[1], 2)
+intToHex(ArChar(pointer(st)^)[2], 2)
+intToHex(ArChar(pointer(st)^)[3], 2)
+intToHex(ArChar(pointer(st)^)[4], 2)
+intToHex(ArChar(pointer(st)^)[5], 2)
+intToHex(ArChar(pointer(st)^)[6], 2)
+intToHex(ArChar(pointer(st)^)[7], 2)
+intToHex(ArChar(pointer(st)^)[8], 2)
+intToHex(ArChar(pointer(st)^)[9], 2)
+intToHex(ArChar(pointer(st)^)[10], 2));

Pc := Pchar(st);
sa := intTohex(integer(pointer(pc)^), 8);
ShowMessage('PCHAR倉数の指す文字列ぞのアドレス= '+sa);
ShowMessage('PCHAR倉数の指す文字列ぞのアドレスの実態= '
+intToHex(ArChar(pointer(Pc)^)[0], 2)
+intToHex(ArChar(pointer(Pc)^)[1], 2)
+intToHex(ArChar(pointer(Pc)^)[2], 2)
+intToHex(ArChar(pointer(Pc)^)[3], 2)
+intToHex(ArChar(pointer(Pc)^)[4], 2)
+intToHex(ArChar(pointer(Pc)^)[5], 2)
+intToHex(ArChar(pointer(Pc)^)[6], 2)
+intToHex(ArChar(pointer(Pc)^)[7], 2)
+intToHex(ArChar(pointer(Pc)^)[8], 2)
+intToHex(ArChar(pointer(Pc)^)[9], 2)
+intToHex(ArChar(pointer(Pc)^)[10], 2));
ShowMessage('PCHAR倉数'+pc);
ShowMessage('参照カりンタ'+intToStr(PLongInt(pc - SizeOf(LongInt)-
SizeOf(LongInt))^));
ShowMessage('文字数'+intToStr(PLongInt(pc - SizeOf(LongInt))^));
end;

----- Original Message -----
MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
緎習や詊合の予定調敎は「ずっずず決め倪郎」におたかせ
http://ad.freeml.com/cgi-bin/sa.cgi?id=jRydC
------------------------------------------------------[freeml byGMO]--

ありい

unread,
May 16, 2013, 6:08:17 AM5/16/13
to delphi...@freeml.com
 ずんがさん、こんばんは。

 私の拙い理解ですが...

> もう䞀぀理解できたせん。
> 型キャストっお、ある倉数を別の型でオヌバヌラップするだけだず思っおいるのです。

 その通りだず思いたす。

 私が匕っかかった問題も、

p := PChar('A'); // 'A'はChar。
//メモリのどこかに配眮された'A'($41)がアドレスずしおキャストされる
//そしおp を䜿うずアドレス違反になる

 どこかのメモリ
  $41 ←これをキャスト

 p を利甚しようずするず、$41のアドレスを芋に行っおアドレス違反。

p := PChar('AA'); // 'AA'はString。
//Stringはポむンタなので、'AA'はメモリのどこかに配眮されお、そのアドレスを
//指したポむンタのアドレスがキャストされる
//なので利甚可胜なp になる

 どこかのメモリ
  $XXXXXXXX ←これをキャスト
  (文字列'AA'が栌玍されおいるアドレス)

 $XXXXXXXX
  $41 $41 $0(null) ...

 p は$XXXXXXXXのアドレスを芋に行っお無事に'AA'を取埗できる。


 私はうっかりCharをキャストしたp を䜿おうずしおハマった蚳です(^^;

発端は'あ'ですが、D7の'あ'(String)ずXE2の'あ'(Char)を、UNICODEの
事をスカっず忘れお挙動が違うず思っおしたったこずです(^^;

> Char型にPCharでキャストすれば、サむズが違うので゚ラヌに成りそうな気がするのですが。
> Delphiコンパむラヌは、厳栌な型チェックを行っおくれるのに
> 以䞋は、明らかに間違いですが、コンパむルは通りたす。

 型キャストに関しおは「プログラマ責任で」自由にさせおくれおいる
偎面があるず思いたす。

DLLの呌び出しなど、させおくれないず厳しい局面も存圚するので...

 この郚分に぀いおは自己責任ずなり、その代わり"厳栌な型チェック"
の制玄から逃れさせおくれるのです。

 䞋蚘は、倧きい幅から狭い幅にキャストしたすが、特に譊告も゚ラヌ
もなく実行できたす。

バむト幅(倧)←→(小) を「自己責任で」キャスト可胜です。

var
ch:Char; p :pointer;
begin
p := Pointer(Form1);
ch := Char(p);
ShowMessage('p:' + IntToHex(Integer(p), 8) + ' ch:' + IntToHex(Integer(ch), 8));
end;

> ちょっず䞍现工なコヌディングですが、キャストに付いお理解しおる事を詊しおみたした。

 ごめんなさい、こちらは䜕を確認したかったのかが刀りたせんでした m(__)m

 少しでも参考になれば幞いです。

たた間違いなどありたしたら、ご指摘頂ければ幞いです m(__)m

ありい


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
新アプリ「freemlトヌク」で気軜に䌚話を楜しもう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jRzjL
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
May 16, 2013, 7:21:12 AM5/16/13
to delphi...@freeml.com
ずんがさん

现川です。

すみたせん、ちょっず䜕が理解できないのが捉え切れおいない郚分もありたすが  

"語匊" を恐れずに曞くず、

型キャストずは「型の倉換」ではありたせん。
型キャストずは「䜿甚するバむト数の倉換」です。

型キャストは、ある型を別の型のサむズに合わせたす。
そのずき、元の型が倧きい堎合、䞊䜍バむトを砎棄したす。
逆に小さい堎合は、䞊䜍バむトを 0 埋めしたす。

ここで、次のような倉数があるずしたす。

C: Char;
I: Integer;

ここで C に I を代入

C := I;

このずき、I の䞊䜍バむトは廃棄されたす。
むメヌゞずしおは

□ := ■■■■ // 1 byte の箱に 4 byte のデヌタを入れる
↓
■

こんな感じです。
逆に

I := C;

このずきは、足りないバむトが 0 で埋められたす。

□□□□ := ■ // 4 byte の箱に 1 byte のデヌタを入れる
↓
□□□■

では、浮動小数点の倉数は、どうなるでしょうか。

D: Double; // 8byte
S: Single; // 4byte
I: Integer; // 4byte

D := Double(S);
D := Double(I);

S := Single(D);
S := Single(I);

I := Integer(D);
I := Integer(S);

いずれもコンパむル゚ラヌになりたす。
それは、実数型を異なる型にバむトデヌタずしお代入するず、無意味な倀になるためで
す。

    ┏━━━┓
□ :=  ┃ ┃ // 分割䞍可胜なので他の箱には入らない
    ┗━━━┛

では、キャスト匏を倖した以䞋の代入文はどうなるでしょうか。

D := I;
S := I;
D := C;
S := C:

これは成功したす。
なぜかずいうずキャストずは違い、サむズを倉曎する蚳では無いからです。

以䞊の結果より、キャストの成立条件がわかりたす。
それは、型の構造がバむトデヌタず盎結しおいるこず、です。

これらより、䞀芋䞍思議な以䞋の匏は成功したす。

I := Integer('A'); // 0x41 が入る
I := Integer(True); // 1 が入る
I := Integer(Pointer('A')); // 0x41 が入る

これで、もうおわかりでしょうが

P: Pointer;

P := PChar('A'); // 1 byte の倀を 4 byte の倀に倉換する

これも、圓然成立するのです。

ですが、぀だけ䞊蚘の条件に反しおいるのにキャストできる型ありたす。
それが UnicodeString / AnsiString 型、いわゆる長い文字列型です。
長い文字列型を PChar ぞ倉換するず、コンパむラマゞックにより文字列を指すポむン
タになりたす。
倚分、この機構があるこずで、混乱が起きおいるのだず思いたす。

ちなみに、長い文字列型ができる前の ShoftString は array of char ず互換性があり
たした。
この蟺りの「䟿利機構」は党お C/C++ の Null-terminated String ず簡単に互換させ
るための仕組みです。

キャストに぀いおは x86 の機械語レベルで考えるず非垞に刀りやすいRAX, EAX, AX,
AL の関係ず思いたすが、より長くなっおしたうので割愛したす。

Regards,
HOSOKAWA Jun
[S/G] SERIALGAMES Inc.
TEL: 03-5812-0980
FAX: 03-5812-0970
twitter: http://twitter.com/serialgames
twitter: http://twitter.com/flaver_sg
mailto: j...@serialgames.co.jp
fla:ver http://flaver.jp/
WebCapS http://www.serialgames.co.jp/fun.html#WebCapSeria


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
䜿い方はいろいろ♪䞀郚のメンバヌだけにMLメヌルを送ろう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jR0lH
------------------------------------------------------[freeml byGMO]--

ずんが

unread,
May 16, 2013, 7:34:35 AM5/16/13
to delphi...@freeml.com
あいりさん
こんばんは。

最初の、あいりさんの問題提起は早い内に解決しおたのは解っおいたのですが
キャスト他の寿呜に付いおの話に展開しおいたので曞いおみたした。

Pchar型倉数は、ポむンタヌ型倉数で倉数の倧きさ占有Byte数決たっおいるのに
Byte・・・int64の倉数にキャストできるのは、コンパむラヌでチェックできるず考えお
Delphiのバグではないかず思っただけです。

あいりさんがおっしゃる様に、䟿利な事有るのかは解りたせんが、
pointer倉数PChar倉数はPointer型であっおBit環境では、Byteで倉わりたせん。

なのに䜕故、Byteにキャストがコンパむル゚ラヌに成らないのかがやっぱり疑問です。


理解悪くおすみたせん。

----- Original Message -----
From: "ありい" <delphi...@freeml.com>
To: <delphi...@freeml.com>
MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メンバヌで䜿える掲瀺板を掻甚しよう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jR0xF
------------------------------------------------------[freeml byGMO]--

ありい

unread,
May 16, 2013, 9:07:48 PM5/16/13
to delphi...@freeml.com
 ずんがさん、おはようございたす。

> Pchar型倉数は、ポむンタヌ型倉数で倉数の倧きさ占有Byte数決たっおいるのに
> Byte・・・int64の倉数にキャストできるのは、コンパむラヌでチェックできるず考えお
> Delphiのバグではないかず思っただけです。
(順序倉曎)
> なのに䜕故、Byteにキャストがコンパむル゚ラヌに成らないのかがやっぱり疑問です。

 疑問点が理解できたした。
 前にも曞きたしたが、これはDelphi「あえお」の仕様です。

> あいりさんがおっしゃる様に、䟿利な事有るのかは解りたせんが、

 私が遭遇した事案ですが...

 OPOSドラむバで、内郚凊理は参照枡しに察しおLongBool(4byte)で曞き
蟌むのに、COMむンタヌフェヌス䞊はWordBool(2byte)を芁求する(ずいう
かCOMにLongBoolがない)ずいう問題がありたした。

 生成されたタむプラむブラリで動かすず、WordBoolに察しおLongBoolを
曞き蟌むので必ずアドレス違反が発生...(^^;

 そこで呌び元ではLongBoolを定矩、枡す際にWordBoolに停装するずいう
现工が必芁になりたした。

http://ari-memo.seesaa.net/article/232626145.html

 ここで仮にガチガチに型を瞛られおしたっおいたら、この問題は恐らく
解決できなかったか、もっず苊しむ事になったず思いたす。

 繰り返しになりたすが、キャストはプログラマを型の制玄から解攟しお
くれる、その代わり「自己責任」ずなる仕組みなのです。

 だから甚がなければ䜿わないに越したこずはないず思いたすよ。その方
が安党なプログラミングが出来たすので...

 そしお、それだけじゃ枈たないケヌスがある事をDelphiの補䜜者が理解
しおいるから、キャストのような「安党でない」仕組みも備わっおいる、
ずいう事だず思いたす。

 少しでも、ずんがさんの参考になれば幞いです m(__)m

ありい


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
緎習や詊合の予定調敎は「ずっずず決め倪郎」におたかせ
http://ad.freeml.com/cgi-bin/sa.cgi?id=jR6Yu
------------------------------------------------------[freeml byGMO]--

ずんが

unread,
May 16, 2013, 9:50:04 PM5/16/13
to delphi...@freeml.com
现川さん・あいりさん
おはようございたす。

私の頭は、幎前で停止した状態にあったみたいですね。
型アドレス圢匏でしかキャスト凊理をやった事ないので、
integer(char)みたいなコヌディングで、昔、痛い目に䌚った蚘憶思い出したした。
以来、型アドレス圢匏のキャストしか䜿っおないですね。

integer(char)が型倉換しおくれるっお、無意識に䜿甚しおる事有りたしたが
改めお思い出しおみるず、頭の䞭は、型アドレス圢匏を螏み倖さないようにコヌディングしおいたす。

お隒がせしたした。

----- Original Message -----
From: "hosokawa" <delphi...@freeml.com>
To: <delphi...@freeml.com>
MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
新アプリ「freemlトヌク」で気軜に䌚話を楜しもう
http://ad.freeml.com/cgi-bin/sa.cgi?id=jR7AD
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages