|
|
Регистрация | << Правила форума >> | 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, то он в каждый момент времени указывает заодно и на всю оставшуюся строку от текущего символа до конца. В некоторых случаях может быть полезно.
jmp $ ; Happy End! The Cake Is A Lie. |
#4
|
||||
|
||||
Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#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; Не стоит путать форумы с богадельнями. © Bargest |
#7
|
|||
|
|||
Выигрыш в быстродейсвиив том, что за кодом
Код:
Src[i] Код:
Dst[i]:=что-то Если Вы гарантируете невыход за границу массива и единственность указателя на строку, то можно обойтись и Код:
Src^ |
#8
|
||||
|
||||
Цитата:
Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#9
|
||||
|
||||
Цитата:
Цитата:
Цитата:
Чтобы изменить длину строки вам нужно создать другую строку, в нее скопировать нужное содержимое из исходной, и почистить старую строку. Это если вы работаете через PChar и GetMem. Если вы используете String то можно просто SetLength обойтись Невозможно заточить карандаш тупым топором. Столь же тщетно пытаться сделать это десятком тупых топоров |