喫茶XRAYトップページ


[10606] 長さを指定したString型変数返信 削除
2016/12/19 (月) 21:10:41 Mr.XRAY
こんなのを見つけました.

[Delphi の文字列型stringについて]
http://okwave.jp/qa/q9268853.html

おそらく,

var
  buf : array [1..16] of Char;
  buf : string[16];
 
の動作の違いのことだとは思うのですが,余計なコードもあり,
よく理解できませんが,テストしてみました.
テストコードは,目的のためだけに「絞り込んで」います.


String 型の変数の要素 0 には文字数が入ります.この要素 0 は操作できません.
文字列を代入すると,この要素 0 に文字数が格納されます.

途中の要素に「文字」を代入しても,要素 0 には文字数は格納されません.
つまり,文字列が代入されていないのと同状態となります.

動作確認は Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.
テストする場合,文字列を初期化しないとゴミが入ることがあります.

※ レスしようと思ったのですが,登録が必要なのでやめました.
※ string[16] (短い文字列) は ShortString型


//=============================================================================
//  フォーム生成時の処理
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.Clear;
end;

//=============================================================================
//  文字列をChar型の配列で定義して使用
//  1文字づつ処理するには向いている
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  i   : Integer;
  buf : array[1..16] of Char;
begin
  //初期化
  FillChar(buf, SizeOf(buf), #0);

  for i := 1 to 16 do begin
    buf[i] := Chr(Ord('A') + i - 1);
  end;
  Memo1.Lines.Add('Buttn1 : ' + Buf);
end;

//=============================================================================
//  長さ指定の文字列変数(短い文字列)の各要素に代入する場合
//  要素0には文字数が格納されるのであるが,このコードでは格納されない
//  実際に文字列を代入すると実際の文字数が要素0に格納される
//
//  このようなコードを使う可能性はほとんどないと思うが...
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  i    : Integer;
  buf  : string[16];
begin
  //初期化
  buf := '';

  for i := 1 to 16 do begin
    buf[i] := AnsiChar(Ord('A') + i - 1);
  end;
  Memo1.Lines.Add('Buttn2 : ' + string(Buf));
end;



[10607] Re:長さを指定したString型変数返信 削除
2016/12/20 (火) 00:17:32 Mr.XRAY
> 途中の要素に「文字」を代入しても,要素 0 には文字数は格納されません.
> つまり,文字列が代入されていないのと同状態となります.


なんですが,代入した「文字」はもちろん取り出せます.
その確認コードです.
質問している方は

>//buf :string[16]; では buf[j] が'文字'にならない!

と書いていますが,そんなことはありません.
buf[j] には間違いなく '文字' が格納されます,
 
動作確認は Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.
テストする場合,文字列を初期化しないとゴミが入ることがあります.

procedure TForm1.Button2Click(Sender: TObject);
var
  i    : Integer;
  buf  : string[16];
  LText : string;
begin
  //初期化
  buf := '';

  for i := 1 to 16 do begin
    buf[i] := AnsiChar(Ord('A') + i - 1);
  end;
  Memo1.Lines.Add('Buttn2 : ' + string(Buf));


  LText := '';
  for i := 1 to 16 do begin
    LText := LText + buf[i];
  end;
  Memo1.Lines.Add('Buttn2 : ' + LText);
end;



[10611] Re2:長さを指定したString型変数返信 削除
2016/12/23 (金) 09:05:25 Mr.XRAY
念のため,短い文字列もふつーに文字列として操作することができます.

procedure TForm1.Button1Click(Sender: TObject);
var
  buf : string[16];
begin
  Memo1.Lines.Clear;

  buf    := 'ABC';
  buf[4] := 'D';

  //要素4の文字は認識しないので文字列の長さには含まれない
  //短い文字列はStringでキャストしないと警告が表示される
  Memo1.Lines.Add(string(buf));
  Memo1.Lines.Add(IntToStr(Length(buf)));

  //文字列の長さ以内の要素の文字を変更した場合
  //文字の置換となる
  buf[1] := 'B';
  Memo1.Lines.Add(string(buf));
end;

ところで,http://okwave.jp/qa/q9268853.html のキーワードが
「ストリング Delphi AnsiChar AnsiString TPersonArray」
となっています.こういうところからもその方のスキルを判断できます.

TPersonArray は自分で定義した型ですから,キーワードにするには不適切です.
ストリングはできれば String とか String 型ですね.
あとはやむを得ないでしょう.



[10612] Re3:長さを指定したString型変数返信 削除
2016/12/23 (金) 15:05:09 SO

[10613] Re4:長さを指定したString型変数返信 削除
2016/12/23 (金) 16:11:37 Mr.XRAY
▼ SOさん

> http://ht-deko.com/tech018.html

おっ !  Byte(S[0]) は操作できるんですね.
失礼しました.間違えました.
それと,String[0] は要素数 (文字数) ではないてすね.
これも間違えました.ゴメンなさい.
旧い Delphi の時代の話 ?

ダメだこりゃ... (泣)
SO さんサンクスです.SO さんやさしいですね.
それとなくリンクで教えてくださって... (涙)

# 実はですね.このような間違いをサイトの記事で見つけることが
# あるんです.で,ひそかに修正したりしています.
# 記事を信じて読んでいる方,本当にゴメンナさい.


[10615] Re5:長さを指定したString型変数返信 削除
2016/12/24 (土) 09:15:28 SO
▼ Mr.XRAYさん

> ダメだこりゃ... (泣)
> SO さんサンクスです.SO さんやさしいですね.
> それとなくリンクで教えてくださって... (涙)


いやぁ、素晴らしきはDEKOさんです(^^


[10617] Re6:長さを指定したString型変数返信 削除
2016/12/24 (土) 10:58:08 Mr.XRAY
▼ SOさん

> いやぁ、素晴らしきはDEKOさんです(^^

確かに (^^


INCM/CMT
Cyclamen v3.82