Форум: "Потрепаться";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
ВнизТестирование кода Найти похожие ветки
← →
}|{yk © (2005-02-22 19:08) [0]Вот, наступил на грабли. Взял чужой код и неоттестировал до конца.
function TStrCoding.StrPayReason(s: string; Code: string): string;
var
i, j1, j2: integer;
res, cl, cr: string;
begin
j1 := 0;
j2 := 0;
cl := FirstDelimSymbol;
cr := LastDelimSymbol;
for i := Length(s) downto 0 do
begin
if (s[i] = cr) and (j2 = 0) then
j2 := i;
if (s[i] = cl) and (j1 = 0) then
j1 := i + 1;
end;
res := Trim(Copy(s, j1, j2 - j1)); //code
Result := s;
if Length(res) = CountSymbol then
Result := StringReplace(s, res, FlirtFrom(res, Code), []);
end;
ну и получил AV.
Вопрос но почему Delphi выполняет код в цикле, даже если изначально Length(s)=0?
← →
wicked © (2005-02-22 19:14) [1]патаму-что.... в паскале, АФАИР, границы цикла проверяются на <= для to и >= для downto, то есть инклюзивно....
посему, заголовок цикла for должен был выглядеть так:for i := Length(s) downto 1 do
← →
wicked © (2005-02-22 19:16) [2]это то, что сразу бросилось в глаза...
ну и по мелочевке, правила хорошего тона (для меня) -
function TStrCoding.StrPayReason(const s: string; const Code: string): string;
← →
Юрий Зотов © (2005-02-22 20:35) [3]> }|{yk © (22.02.05 19:08)
Цикл выполняется от 0 до 0. То есть, один раз, как и положено. А поскольку S[0] не существует (точнее, информация по этому адресу существует, но это уже не символ строки), то возможны чудеса.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.036 c