固定長の長い文字列

解決


アル  2008-10-06 02:37:15  No: 32114

文字列を固定長で扱いたいのですが、
255文字以上の文字では
↓このようにするとエラーになります。
str : string[256];

ヌルで終わる文字列にすればいいのでしょうが、
他にスマートな方法はないでしょうか?


igy  2008-10-06 03:14:12  No: 32115

普通に、
    str : string;
を使うのは、だめですか?
長さを設定するには、SetLength 手続きがあるかと思いますが。


アル  2008-10-07 16:34:01  No: 32116

実際にはrecordの1要素として扱う予定で、今回、recordのサイズが変わると色々と問題がありまして。


ofZ  2008-10-07 18:45:57  No: 32117

object型・・・それは、非推奨と言われる、いつ消えるかわからない謎の型。
しかし、record型のように、宣言のみで使用でき、クラスのようにメソッドの
定義もできる、すばらしき型。

使えなくなる不安を抱えながら使っていたら、record型が高度record型に
なって、このobject型と同じように使い方ができるようになった。
私の記憶が確かなら、それは、Delphi2007あたり。

さて、あてくしは、Delphi5使いです。
バージョンによって、プロパティは使えないかもしれない。
だが、そのときは、メソッドだけで使えばいい。
ということで、object型を使ってみました。

type
  THogeHoge=object
  protected
    Str1: String[255];
    Str2: String[255];
  public
    constructor Init;
  protected
    function GetStr: String;
    procedure SetStr(aStr: String);
  public
    property Str: String read GetStr write SetStr;
  end;

constructor THogeHoge.Init;
begin
end;

function THogeHoge.GetStr: String;
begin
  Result := Str1 + Str2;
end;

procedure THogeHoge.SetStr(aStr: String);
begin
  Str1 := Copy(aStr,   1, 255);
  Str2 := Copy(aStr, 256, 255);
end;

なお、以下のRecord型があった場合、
SizeOf(THogeHoge) = SizeOf(THogeHogeRec) になります。

  THogeHogeRec=record
    Str1: String[255];
    Str2: String[255];
  end;

これがスマートかどうかは・・・ごにょごにょ。


うんと  2008-10-07 19:14:25  No: 32118

>ヌルで終わる文字列にすればいいのでしょうが、

ヌルで終わる文字列にしても、記憶場所は別に可変長のメモリとして確保しな
ければなりませんから、だめです。

そもそも固定長のレコードに可変長の文字列を収めようという発想が矛盾しています。


igy  2008-10-07 19:32:38  No: 32119

>実際にはrecordの1要素として扱う予定で、今回、recordのサイズが変わると色々と問題がありまして。

であれば、

>ヌルで終わる文字列にすればいいのでしょうが、

と書いていらっしゃるとおり、
    str: array[0..255] of Char;
のように、文字配列を使うのが、よいかと思います。


うんと  2008-10-08 03:52:18  No: 32120

>    str: array[0..255] of Char;
>のように、文字配列を使うのが、よいかと思います。

それだと最初の質問にあるとおり

>str : string[256];

と本質的になんの変更もありませんね。


アル  2008-10-11 02:47:18  No: 32121

ちょっと来ないうちに発言がいっぱいで、ありがとうございます。

やはり

>    str: array[0..255] of Char;

が一番スマートっぽいですね。
ちょっと不恰好ですが、後でstringに入れて使うことにしようと思います。

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加