Delphiキャストについて教えてください。


var
sCode:String;
cCode:Array [1..10]of char;
begin
sCode:='1234567890';
cCode:=sCode;

sCodeをcCodeに代入したいのですがコンパイル時型エラーとなります。
解決策を教えてください

回答の条件
  • 1人2回まで
  • 登録:2006/06/09 19:16:10
  • 終了:2006/06/09 21:16:29

ベストアンサー

id:quintia No.2

quintia回答回数562ベストアンサー獲得回数712006/06/09 20:44:32

ポイント50pt

cCode がnullターミネータ付きの文字配列になることを期待しているのならば要素数が1つ足りません。

var
  sCode:String;
  cCode:Array [1..11]of char;
begin
  sCode:='1234567890';
  StrCopy(@cCode[1], PChar(sCode));

か、

var
  sCode:String;
  cCode:Array [0..10]of char;
begin
  sCode:='1234567890';
  StrCopy(cCode, PChar(sCode));
  //StrCopy(@cCode[0], PChar(sCode));  も同じ

になります。添え字が0から始まる Char の配列は、配列名を書けば PChar に暗黙でキャストされますが、1から始まっていた場合はそうなりません。@cCode[1] と書きましょう。


cCode がnullターミネータ無しを期待しているのなら、

var
  sCode:String;
  cCode:Array [1..10]of char;
begin
  sCode:='1234567890';
  Move(PChar(sCode)^, cCode, SizeOf(cCode));

です。

Move手続きと StrCopy関数では Source と Dest が反転していることに注意してください。

また Move手続きは第1引数はポインタでは無く変数そのものを渡す必要があることも注意です。しかも長い文字列型(String型)は先頭に参照カウンタなどが入っていて直接ここに書けません。トリッキーですが PChar にキャストしてからポインタ逆参照をかけて Char に見せかけてます。

id:saiso

ありがとうございました。

分かり易い解説たすかりました。

2006/06/09 21:14:35

その他の回答(1件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982006/06/09 20:11:10

ポイント20pt

cCode:Array [1..11]of char;

としてもエラーが出ますでしょうか?

文字列分+区切りとなります。

http://www.wakhok.ac.jp/~tetsuo/programing/Delphi/text/chap_h/pb...

id:saiso

ありがとうございます。

配列数を増やしてもコンパイル時にエラーとなります。

情報漏れでしたが、使用しているのはDelphi3です。

2006/06/09 21:13:07
id:quintia No.2

quintia回答回数562ベストアンサー獲得回数712006/06/09 20:44:32ここでベストアンサー

ポイント50pt

cCode がnullターミネータ付きの文字配列になることを期待しているのならば要素数が1つ足りません。

var
  sCode:String;
  cCode:Array [1..11]of char;
begin
  sCode:='1234567890';
  StrCopy(@cCode[1], PChar(sCode));

か、

var
  sCode:String;
  cCode:Array [0..10]of char;
begin
  sCode:='1234567890';
  StrCopy(cCode, PChar(sCode));
  //StrCopy(@cCode[0], PChar(sCode));  も同じ

になります。添え字が0から始まる Char の配列は、配列名を書けば PChar に暗黙でキャストされますが、1から始まっていた場合はそうなりません。@cCode[1] と書きましょう。


cCode がnullターミネータ無しを期待しているのなら、

var
  sCode:String;
  cCode:Array [1..10]of char;
begin
  sCode:='1234567890';
  Move(PChar(sCode)^, cCode, SizeOf(cCode));

です。

Move手続きと StrCopy関数では Source と Dest が反転していることに注意してください。

また Move手続きは第1引数はポインタでは無く変数そのものを渡す必要があることも注意です。しかも長い文字列型(String型)は先頭に参照カウンタなどが入っていて直接ここに書けません。トリッキーですが PChar にキャストしてからポインタ逆参照をかけて Char に見せかけてます。

id:saiso

ありがとうございました。

分かり易い解説たすかりました。

2006/06/09 21:14:35
  • id:quintia
    StrCopy より StrPCopy の方が素直でしたね。
    実は
    StrLCopy(cCode, PChar(sCode), SizeOf(cCode));
    にするか迷ったせいなんですが。
    しかし……Pascal 忘れてるなぁ。orz

この質問への反応(ブックマークコメント)

トラックバック

  • あ、勘違いしました。 takntの作り話 2006-06-09 20:20:53
    実行時エラーと勘違いしました。 ちょっと調べてから、またダイアリーを 更新しますので、こちらを開いてくださいね。
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません