文字列の処理で、今はこのようにしているのですが
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 ではなく、何番目から何個分と言うように一度に代入できる関数、又は
高速に処理する方法はないでしょうか?
宜しくお願いします。
Delphiではforは1つずつしかカウントをあげられ(さげられ)ないので、
ちょっと凝ったカウンタを使うには、whileを使ったりするしかないと思いますけど…。
> 何番目から何個分
この場合、for i := 8 to 8+5 do とかじゃだめでしょうか?
たかみちえさん 有難うございます
for i:= 8 to 8+5 do では
forの制御値が変わっただけなので同じではないでしょうか?
この処理はCountがLength(AString)になるまで繰り返すため
出来る限り高速化したいのでループを使わず行いたいのです
Copy関数のことでしょうか。
にしのさん いつも有難うございます
Copy関数は同じString型の間では使っていますが
配列Charに代入できるのでしょうか?
適当に書いてみましたが、正しくない型キャストと言われてしまいます。
String型は、Char配列に代入できないので、
Copy関数 + StrPCopy関数かな。
StrPCopy(BChar, Copy(AString, Count, Size));
速度を求めるなら、
CopyMemory(@(BChar[0]), PChar(AString) + Count - 1, Size);
こんなのでも良いかと。
# 動作未確認
hatenaさん にしのさん 有難うございます
どちらも、出来ました。
CopyMemoryはポインターの先頭同士を参照してコピーしているのですね。
大量の文字列でテストしてみたら、やはりCopyMemoryは高速でした。
ただし、実際に扱うデータでは殆ど変わらない範囲なので
StrPCopyで行きたいと思います。
有難うございました。
解決済みなので、いまさらなのですが、
Windows API の CopyMemory とほぼ同じ働きの手続きとして、
Move 手続き というのがあります。
Move(AString[Count], cChr, Size);
速度的にも CopyMemory と変わらないと思いますし、
ポインタを使わなくてもいいので可読性が少しいいかなと。。。
hatenaさん
貴重な情報有難うございました
ノートにメモしておきます。
ツイート | ![]() |