Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
1-1140788248
Igor_thief
2006-02-24 16:37
2006.03.26
MDI формы


2-1141732156
VitV
2006-03-07 14:49
2006.03.26
DBCtrlGri - существует замена?


2-1142102496
Kolan
2006-03-11 21:41
2006.03.26
Как переименовать проект?


2-1141895554
SMAC
2006-03-09 12:12
2006.03.26
TButton.Color


2-1141905978
Alex_Th
2006-03-09 15:06
2006.03.26
Размещение GIF-файла на форме