Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
ВнизTstringList - глюк на глюке. Найти похожие ветки
← →
dabreezy © (2006-03-13 13:19) [0]Вообщем-то что я хотел сказать, TstringList - это просто сборище глюков! (то память не освобождается, то в нем какая-то фигня в строках проскакивает) Вот например процедура для удаления дублирующих строк из текстого файла:
procedure TForm1.RemoveAllDupl2 (filename: string);
var
lst: TStringList;
f: textfile;
s: string;
i1: integer;
begin
assignfile (f,filename);
reset (f);
lst:=TStringList.Create;
lst.Sorted:=True;
lst.Duplicates:=dupignore;
i1:=0;
while not (eof(f)) do
begin
readln (f,s);
if s<>"" then lst.Add(s);
end;
closefile (f);
assignfile (f,filename);
rewrite (f);
for i1:=0 to lst.count-1 do
writeln (f,lst.Strings[i1]);
closefile (f);
lst.Free;
end;
Вот где тут ошибка? Файл был размером 11 мегабайт, после работы программы стал 12 мегабайт(причем методом SaveToFile вообще файл не записывается), стал смотреть (в конце файла было напихано всяких отбросов оперативки). Последняя строчка lst.Free; вызывает исключение EAccessViolation (почему интересно?).
Вообщем если не хотите головную боль, то надо не пользоватся TStringList. Тем более в больших проектах (особенно с потоками) ужор оперативной памяти обеспечен 100%.
← →
Fay © (2006-03-13 13:24) [1]Не болтайте ерундой
← →
Sergey Masloff (2006-03-13 13:27) [2]dabreezy © (13.03.06 13:19)
Не стоит списывать своих тараканов на производителя компилятора. Как показывает практика в 99.999999% случаев "глюки" средства разработки это таки глюки разработчика.
>Вообщем если не хотите головную боль, то надо не пользоватся TStringList. >Тем более в больших проектах
Это вообще курам на смех.
← →
dabreezy © (2006-03-13 13:27) [3]Кстати думал может быть глюк из-за того что TStringList не очищается, вставил после строки lst:=TStringList.create строку lst.clear ... и что Вы думаете такая же фигня.
← →
dabreezy © (2006-03-13 13:28) [4]
> Sergey Masloff (13.03.06 13:27) [2]
> dabreezy © (13.03.06 13:19)
Сергей, а где ошибка у меня? Почему такая простая процедура не работает?
← →
Плохиш © (2006-03-13 13:34) [5]В приведённом коде ошибок не видать, т.ч. отладчик в зубы и вперёд тестировать.
← →
Sergey Masloff (2006-03-13 13:36) [6]dabreezy © (13.03.06 13:28) [4]
1) что за файл? Спецсимволов в строках нет?
2) Почему сразу не сделать LoadFromFile?
вот код
procedure TForm1.Button1Click(Sender: TObject);
var
sl : TStringList;
begin
sl := TStringList.Create();
try
sl.Sorted := True;
sl.Duplicates := dupIgnore;
sl.LoadFromFile("test.txt");
sl.SaveToFile("testout.txt");
finally
sl.Free();
end;
end;
все работает проверил только что
← →
Manic Mechanic © (2006-03-13 13:39) [7]lst.Sorted:= True;
lst.LoadFromFile("filename");
а так не проще ли?
ss:= "";
ii:= 0;
while true do begin
if lst.strings[ii]=ss then
lst.delete(ii)
else begin
ss:= lst.strings[ii];
inc(ii);
end;
if(ii>lst.count-1)then
Break;
end;
lst.SaveToFile("filename");
← →
dabreezy © (2006-03-13 13:43) [8]
> Sergey Masloff (13.03.06 13:36) [6]
> dabreezy © (13.03.06 13:28) [4]
> 1) что за файл? Спецсимволов в строках нет?
> 2) Почему сразу не сделать LoadFromFile?
1) Файл обычный текстовый ~300000 строк (11 мегабайт).
Только что проверил не работает на таком файле.(Если делать с динамическими массивами то все работает! Отсюда вывод)
← →
Sergey Masloff (2006-03-13 13:49) [9]dabreezy © (13.03.06 13:43) [8]
Я проверял на трехмегабайтном файле. Но в других задачах работал и с намного большими. Могу и на большом проверить ради интереса.
Кстати работая с таким большим файлом неплохо Capacity установить сразу а то у тебя реаллокация памяти постоянная - можно и на outofmemory налететь из-за фрагментации.
← →
Ega23 © (2006-03-13 13:51) [10]
> Файл обычный текстовый ~300000 строк (11 мегабайт).
Буквально в четверг создал динамически текстовый файл на 15.5 Мб. И всё отлично.
Странно, наверное я не правильно с ним (TStringList) работаю, раз у меня глюков нет...
← →
Сергей М. © (2006-03-13 13:54) [11]
> dabreezy © (13.03.06 13:43) [8]
Укажи конкретную строчку приведенного выше текста программы, при выполнении которой что-то там у тебя "не работает"...
← →
Sergey Masloff (2006-03-13 13:56) [12]Sergey Masloff (13.03.06 13:49) [9]
Вобщем проверил сейчас на 22-мегабайтном файле (7 раз скопированная "Война и мир" в одном файле). Работает мгновенно (ну может 1 секунда) никаких исключений не возникает. Код из Sergey Masloff (13.03.06 13:36) [6] только с установкой Capacity
← →
dabreezy © (2006-03-13 14:03) [13]
> Sergey Masloff (13.03.06 13:49) [9]
> dabreezy © (13.03.06 13:43) [8]
> Я проверял на трехмегабайтном файле. Но в других задачах
> работал и с намного большими. Могу и на большом проверить
> ради интереса.
>
> Кстати работая с таким большим файлом неплохо Capacity установить
> сразу а то у тебя реаллокация памяти постоянная - можно
> и на outofmemory налететь из-за фрагментации.
Кстати да если Capacity установить то работает, но мне все-таки по душе динамические массивы. Но все равно, спасибо за совет
← →
Сергей М. © (2006-03-13 14:13) [14]
> dabreezy
> работает
> не работает
Детский сад
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.039 c