![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый день.
Очень часто вижу в исходниках обработку строк в виде: Код:
p:= PChar(line); while p^ <> #0 do begin if p^ ... inc(p); end; Код:
for i:= 1 to len do begin if line[i] ... end; |
|
#2
|
||||
|
||||
|
Цикл while удобен тем, что у него можно управлять шагом итерации т.е. возможно пропустить\прокрутить нужное колво символов в строке, for последователен и в этом его минус
|
|
#3
|
||||
|
||||
|
А еще удобно тем, что если продолжать расценивать P как PChar, то он в каждый момент времени указывает заодно и на всю оставшуюся строку от текущего символа до конца. В некоторых случаях может быть полезно.
|
|
#4
|
||||
|
||||
|
Цитата:
|
|
#5
|
|||
|
|||
|
А я предполагал, что есть какой-то профит в быстродействии. Не всегда ведь строчка из 10 символов.
Вот еще что интересует: Есть строчка "123456789", необходимо преобразовать в "3456789". Через Copy, Delete понятно, а вот через ссылку как? Если я просто укажу теперь ссылку на символ "3", то что произойдет с "12"? Или же скопирую память Move'ом в позицию "1", то что с "9"? Всё это нужно подчищать? Или же, если изначально была объявлена переменная типа string, то это сделает менеджер памяти? |
|
#6
|
||||
|
||||
|
Цитата:
Код:
function Rewind(Source: string): string;
var
Src, Dst: PChar;
L: Integer;
begin
if Source <> '' then
begin
L := Length(Source);
SetLength(Result, L); // выделение памяти
Src := Pointer(Source);
Dst := @Result[L];
while Src^ <> #0 do
begin
Dst^ := Src^;
Inc(Src);
Dec(Dst);
end;
end
else
Result := ''; // nil в nil
end; |
|
#7
|
|||
|
|||
|
Выигрыш в быстродейсвиив том, что за кодом
Код:
Src[i] Код:
Dst[i]:=что-то Если Вы гарантируете невыход за границу массива и единственность указателя на строку, то можно обойтись и Код:
Src^ |
|
#8
|
||||
|
||||
|
Цитата:
Цитата:
|
|
#9
|
||||
|
||||
|
Цитата:
Цитата:
Цитата:
Чтобы изменить длину строки вам нужно создать другую строку, в нее скопировать нужное содержимое из исходной, и почистить старую строку. Это если вы работаете через PChar и GetMem. Если вы используете String то можно просто SetLength обойтись |