文字列から順に一定量単位で抽出するには

解決


Taku  2003-01-29 06:39:55  No: 2708  IP: [192.*.*.*]

文字列の処理で、今はこのようにしているのですが

AString:AnsiString;
BChar:array [0..64] of Char;
Count:integer=1;

procedure  SetBChar;
var i:byte;
begin 
      for i:=0 to 64 do
           BChar[i]:=AString[Count + i]; 
      Count:=Count+Size;  //次の開始位置をセット
end;

文字列AStringの先頭から順に
1回に指定分毎、BCharに代入して行きたいのですが
for ではなく、何番目から何個分と言うように一度に代入できる関数、又は
高速に処理する方法はないでしょうか?

宜しくお願いします。

編集    削除
たかみちえ  URL  2003-01-29 07:12:32  No: 2709  IP: [192.*.*.*]

Delphiではforは1つずつしかカウントをあげられ(さげられ)ないので、
ちょっと凝ったカウンタを使うには、whileを使ったりするしかないと思いますけど…。
> 何番目から何個分
  この場合、for i :=  8 to 8+5 do  とかじゃだめでしょうか?

編集    削除
Taku  2003-01-29 08:38:00  No: 2710  IP: [192.*.*.*]

たかみちえさん  有難うございます
for i:= 8 to 8+5 do では
forの制御値が変わっただけなので同じではないでしょうか?
この処理はCountがLength(AString)になるまで繰り返すため
出来る限り高速化したいのでループを使わず行いたいのです

編集    削除
にしの  2003-01-29 09:22:12  No: 2711  IP: [192.*.*.*]

Copy関数のことでしょうか。

編集    削除
Taku  2003-01-29 18:23:27  No: 2712  IP: [192.*.*.*]

にしのさん  いつも有難うございます
Copy関数は同じString型の間では使っていますが
配列Charに代入できるのでしょうか?
適当に書いてみましたが、正しくない型キャストと言われてしまいます。

編集    削除
hatena  2003-01-29 18:47:20  No: 2713  IP: [192.*.*.*]

String型は、Char配列に代入できないので、
Copy関数 + StrPCopy関数かな。

   StrPCopy(BChar, Copy(AString, Count, Size));

編集    削除
にしの  2003-01-29 18:52:43  No: 2714  IP: [192.*.*.*]

速度を求めるなら、
  CopyMemory(@(BChar[0]), PChar(AString) + Count - 1, Size);
こんなのでも良いかと。
# 動作未確認

編集    削除
Taku  2003-01-29 23:26:53  No: 2715  IP: [192.*.*.*]

hatenaさん  にしのさん  有難うございます
どちらも、出来ました。
CopyMemoryはポインターの先頭同士を参照してコピーしているのですね。
大量の文字列でテストしてみたら、やはりCopyMemoryは高速でした。
ただし、実際に扱うデータでは殆ど変わらない範囲なので
StrPCopyで行きたいと思います。

有難うございました。

編集    削除
hatena  2003-01-30 05:30:23  No: 2716  IP: [192.*.*.*]

解決済みなので、いまさらなのですが、

Windows API の CopyMemory とほぼ同じ働きの手続きとして、
Move 手続き というのがあります。

Move(AString[Count], cChr, Size);

速度的にも CopyMemory と変わらないと思いますし、
ポインタを使わなくてもいいので可読性が少しいいかなと。。。

編集    削除
Taku  2003-01-30 08:22:27  No: 2717  IP: [192.*.*.*]

hatenaさん
貴重な情報有難うございました
ノートにメモしておきます。

編集    削除