String型(ansiString)の一バイト目には?

解決


やまだ  2009-04-29 11:39:07  No: 34216

お世話になってます。
ヤマダです。

インラインアセンブラを使って
function atoi(value:string):integer; 

 
  '100'が入力されたら100を出力する
 

を実装しています。

この場合valueの文字列長をしるには、どうすればよいでしょうか?

Cだと\0終端なので問題ないですが…

delphiのstringは、一バイト目に文字列長を保持するという
記述をみたのですがCPUデバッガで確認しても見つかりませんでした。

ご教授いただけるとうれしいです!

宜しくお願いします。


monaa  2009-04-29 17:16:10  No: 34217

一バイト目に文字列長というのは少しだけあってます。
正確には-3byte - 0byteの4バイトみたいです。
c,c++でも終端0は未保障です。
Delphiの終端0も未保障ですが普通にStringを使っていれば勝手に入ります。
ちなみにやる気を削ぐようでなんですが、
InttoStrはアセンブラ実装ですよ(D2009)

確認コード。
procedure TForm1.Button1Click(Sender: TObject);
var
  b:pbyte;
  str:AnsiString;
  i:Integer;
begin
  str := 'test';
  b  := @str[1];
  Dec(b,4);
  for i := 0 to Length(str) + 4 do
  begin
    ListBox1.Items.Add(IntToHex(Integer(b),8) + '    ' +
      ' str[' + IntToStr(i-3) + ']' + '    ' +
      'Byte=' + IntToStr(b^)  + '    ' +
      'Code=' + Char(b^));
    inc(b);
  end;
end;


KHE00221  2009-04-29 18:17:06  No: 34218

>ちなみにやる気を削ぐようでなんですが、
>InttoStrはアセンブラ実装ですよ(D2009)

function atoi(value:string):integer; 
だからStrToInt じゃないか?

StrToInt もアセンブラだけど


ヤマダ  2009-04-29 22:25:20  No: 34219

うほっ

レスありがとうございました!

早速調べてみます!


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

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






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