![]() |
|
|
Регистрация | << Правила форума >> | 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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо 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; — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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)
|