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

解決


Taku  2003-01-28 21: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-28 22:12:32  No: 2709  IP: 192.*.*.*

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

編集 削除
Taku  2003-01-28 23:38:00  No: 2710  IP: 192.*.*.*

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

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

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

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

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

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

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

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

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

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

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

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

有難うございました。

編集 削除
hatena  2003-01-29 20:30:23  No: 2716  IP: 192.*.*.*

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

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

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

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

編集 削除
Taku  2003-01-29 23:22:27  No: 2717  IP: 192.*.*.*

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

編集 削除