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

解決


やまだ  2009-04-29 02:39:07  No: 34216  IP: 192.*.*.*

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

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

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

を実装しています。


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

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

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

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

宜しくお願いします。

編集 削除
monaa  2009-04-29 08:16:10  No: 34217  IP: 192.*.*.*

一バイト目に文字列長というのは少しだけあってます。
正確には-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 09:17:06  No: 34218  IP: 192.*.*.*

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

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

StrToInt もアセンブラだけど

編集 削除
ヤマダ  2009-04-29 13:25:20  No: 34219  IP: 192.*.*.*

うほっ

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

早速調べてみます!

編集 削除