Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TstringList - глюк на глюке. [D7, XP]


dabreezy ©   (2006-03-13 13:19:00) 

Вообщем-то что я хотел сказать, 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%.


Сергей М.   (2006-03-13 14:13:00) [1]


> dabreezy



> работает


> не работает


Детский сад


dabreezy   (2006-03-13 14:03:00) [2]


> Sergey Masloff   (13.03.06 13:49) [9]
> dabreezy ©   (13.03.06 13:43) [8]
> Я проверял на трехмегабайтном файле. Но в других задачах
> работал и с намного большими. Могу и на большом проверить
> ради интереса.
>
> Кстати работая с таким большим файлом неплохо Capacity установить
> сразу а то у тебя реаллокация памяти постоянная - можно
> и на outofmemory налететь из-за фрагментации.

Кстати да если Capacity установить то работает, но мне все-таки по душе динамические массивы. Но все равно, спасибо за совет


Sergey Masloff   (2006-03-13 13:56:00) [3]

Sergey Masloff   (13.03.06 13:49) [9]
Вобщем проверил сейчас на 22-мегабайтном файле (7 раз скопированная "Война и мир" в одном файле). Работает мгновенно (ну может 1 секунда) никаких исключений не возникает. Код из Sergey Masloff   (13.03.06 13:36) [6]  только с установкой Capacity


Сергей М.   (2006-03-13 13:54:00) [4]


> dabreezy ©   (13.03.06 13:43) [8]


Укажи конкретнуюстрочку приведенного выше текста программы, при выполнении которой что-то там у тебя "не работает"...


Ega23   (2006-03-13 13:51:00) [5]


> Файл обычный текстовый ~300000 строк (11 мегабайт).


Буквально в четверг создал динамически текстовый файл на 15.5 Мб. И всё отлично.
Странно, наверное я не правильно с ним (TStringList) работаю, раз у меня глюков нет...


Sergey Masloff   (2006-03-13 13:49:00) [6]

dabreezy ©   (13.03.06 13:43) [8]
Я проверял на трехмегабайтном файле. Но в других задачах работал и с намного большими. Могу и на большом проверить ради интереса.

Кстати работая с таким большим файлом неплохо Capacity установить сразу а то у тебя реаллокация памяти постоянная - можно и на outofmemory налететь из-за фрагментации.


dabreezy   (2006-03-13 13:43:00) [7]


> Sergey Masloff   (13.03.06 13:36) [6]
> dabreezy ©   (13.03.06 13:28) [4]
> 1) что за файл? Спецсимволов в строках нет?
> 2) Почему сразу не сделать LoadFromFile?

1) Файл обычный текстовый ~300000 строк (11 мегабайт).
Только что проверил не работает на таком файле.(Если делать с динамическими массивами то все работает! Отсюда вывод)


Manic Mechanic   (2006-03-13 13:39:00) [8]

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');


Sergey Masloff   (2006-03-13 13:36:00) [9]

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;


все работает проверил только что


Плохиш   (2006-03-13 13:34:00) [10]

В приведённом коде ошибок не видать, т.ч. отладчик в зубы и вперёд тестировать.


dabreezy   (2006-03-13 13:28:00) [11]


> Sergey Masloff   (13.03.06 13:27) [2]
> dabreezy ©   (13.03.06 13:19)  

Сергей, а где ошибка у меня? Почему такая простая процедура не работает?


Sergey Masloff   (2006-03-13 13:27:00) [12]

dabreezy ©   (13.03.06 13:19)  
Не стоит списывать своих тараканов на производителя компилятора. Как показывает практика в 99.999999% случаев "глюки" средства разработки это таки глюки разработчика.

>Вообщем если не хотите головную боль, то надо не пользоватся TStringList. >Тем более в больших проектах
Это вообще курам на смех.


dabreezy   (2006-03-13 13:27:00) [13]

Кстати думал может быть глюк из-за того что TStringList не очищается, вставил после строки lst:=TStringList.create строку lst.clear ... и что Вы думаете такая же фигня.


Fay   (2006-03-13 13:24:00) [14]

Не болтайте ерундой


Наверх

Титульная страница Поиск, карта сайта Написать письмо