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

解決


Taku  2003-01-29 06:39:55  No: 2708

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

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

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


Taku  2003-01-29 08:38:00  No: 2710

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


にしの  2003-01-29 09:22:12  No: 2711

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


Taku  2003-01-29 18:23:27  No: 2712

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


hatena  2003-01-29 18:47:20  No: 2713

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

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


にしの  2003-01-29 18:52:43  No: 2714

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


Taku  2003-01-29 23:26:53  No: 2715

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

有難うございました。


hatena  2003-01-30 05:30:23  No: 2716

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

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

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

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


Taku  2003-01-30 08:22:27  No: 2717

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


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

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






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