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


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

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

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/06/09 21:16:29
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:quintia No.2

回答回数562ベストアンサー獲得回数71

ポイント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ベストアンサー獲得回数1198

ポイント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

回答回数562ベストアンサー獲得回数71ここでベストアンサー

ポイント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
    実行時エラーと勘違いしました。 ちょっと調べてから、またダイアリーを 更新しますので、こちらを開いてくださいね。
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

回答リクエストを送信したユーザーはいません