![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Добрый день. Есть код функции:
Код:
function DelParagraph(const Str1,Str2:string; L:integer):string;
var
J,I,Count,D,G:integer;
Word1,Word2: string;
T1,T2:TStringList;
begin
T1:=TStringList.Create;
T2:=TStringList.Create;
T2.Sorted := true;
T2.Duplicates := dupIgnore;
Result:='';
if Length(Str1) = 0 then Exit;
Count:=0;
try
T1.Text:=SpliteText(Del(Str1));
G:=(T1.Count);
T2.Text:=SpliteText(Str2);
for I := 0 to T2.Count-1 do
begin
Word1:=(T2[i]);
begin
for J := 0 to T1.Count-1 do
begin
Word2:=(T1[J]);
if CompareWords(Word1,Word2) then
begin
Inc(Count);
end;
end;
end;
end;
if (Count = 0) or (G = 0) then
Exit
else
D:=((Count*100 Div G));
if D > L then
Result:=Str1;
finally
FreeAndNil(T1);
FreeAndNil(T2);
end;
end;Del, SpliteText, CompareWords - вызываемые функции, то же имеют TStringList и везде try-finally-end; Вызов функции: FullStr3:=DelParagraph(FullStr2,SWords,L); в общем функция получает две строки1 и 2 и число, сравнивает слова в строках и если число совпадений превышает порог переносит строку1 на выход. Проблема состоит в том что при завершении программы ReportMemoryLeaksOnShutdown выдает сообщение о небольшой утечке памяти в TStringList если заблокировать вызов функции, то утечка пропадает ВОпросы: 1. как вообще можеть быть утечка при наличии try-finally-end вроде бы гарантирующее уничтожение объектов 2. как вообще определить где конкретно это происходит 3. может быть код кривой? тогда где? |
|
#2
|
||||
|
||||
|
Попробуй так
Код:
function DelParagraph(const Str1,Str2:string; L:integer):string;
var
J, I, Count, D, G : Integer;
Word1, Word2 : String;
T1, T2 : TStringList;
begin
Result := '';
Count := 0;
if Length(Str1) = 0 then
Exit;
T1 := TStringList.Create;
try
T2 := TStringList.Create;
try
T2.Sorted := True;
T2.Duplicates := dupIgnore;
T1.Text := SpliteText(Del(Str1));
G := T1.Count;
T2.Text := SpliteText(Str2);
for I := 0 to T2.Count - 1 do
begin
Word1 := T2[i];
begin
for J := 0 to T1.Count - 1 do
begin
Word2 := T1[J];
if CompareWords(Word1, Word2) then
Inc(Count);
end;
end;
end;
if (Count = 0) or (G = 0) then
Exit
else
D := Count * 100 Div G;
if D > L then
Result := Str1;
finally
FreeAndNil(T2);
end;
finally
FreeAndNil(T2);
end;
end; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Pcrepair (18.03.2013)
| ||
|
#3
|
|||
|
|||
|
итого получилось следующее
Код:
function DelParagraph(const Str1,Str2:string; L:integer):string;
(*--------------------------------------------------*)
(* 17.03.13 Функция удаления символов <ggg>*)
function Del(const AData:string):string;
var
Pos1,Pos2:integer;
Buf:string;
begin
Buf:=AData;
while Pos1 > 0 do
begin
Pos1:=PosEx('<',Buf,1);
Pos2:=PosEx('>',Buf,Pos1);
if (Pos1 = 0) or (Pos2 = 0) then Break; (*защита*)
Delete(Buf,Pos1,(Pos2-Pos1));
end;
Result:=Buf;
end;
(*--------------------------------------------------*)
var
J,I,Count,G:integer;
T1,T2:TStringList;
begin
Result:='';
Count:=0;
if Length(Str1) > 0 then
begin
T1:=TStringList.Create;
T2:=TStringList.Create;
try
T2.Sorted := true;
T2.Duplicates := dupIgnore;
T1.Text:=SpliteText(Del(Str1));
G:=(T1.Count);
T2.Text:=SpliteText1(Str2);
for I := 0 to T2.Count-1 do
for J := 0 to T1.Count-1 do
if CompareWords(T2[i],T1[J]) then
Inc(Count);
if (Count > 0) and (G > 0) and ((Count*100 Div G) > L) then
Result:=Str1;
finally
FreeAndNil(T1);
FreeAndNil(T2);
end;
end else Exit;
end;какие есть еще недоработки? |
|
#4
|
||||
|
||||
|
Как минимум - форматирование.
и вот это не совсем верно: Код:
function Del(const AData:string):string;
var
Pos1,Pos2:integer;
Buf:string;
begin
Buf:=AData;
while Pos1 > 0 do // переменная Pos1 можеть быть любого значения, в т.ч. и нулевого, ибо она не проинициализирована
begin
Pos1:=PosEx('<',Buf,1);
Pos2:=PosEx('>',Buf,Pos1);
if (Pos1 = 0) or (Pos2 = 0) then Break; (*защита*)
Delete(Buf,Pos1,(Pos2-Pos1));
end;
Result:=Buf;
end; |
|
#5
|
|||
|
|||
|
да, точно, компилятор предупреждает
так что делать? присвоить до цикла какое то значение? но какое? |
|
#6
|
|||
|
|||
|
Цитата:
Код:
function Del(const AData:string):string;
var
Pos1,Pos2:integer;
Buf:string;
begin
Buf:=AData;
while true do //
begin
Pos1:=PosEx('<',Buf,1);
if (Pos1 = 0) then Break;
Pos2:=PosEx('>',Buf,Pos1);
if (Pos2 = 0) then Break; (*защита*)
Delete(Buf,Pos1,(Pos2-Pos1));
end;
Result:=Buf;
end; |
| Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
Pcrepair (19.03.2013)
| ||