Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1142183531
Din
2006-03-12 20:12
2006.03.26
Как удалить и скопировать файлы по маске?


15-1141390711
Nic
2006-03-03 15:58
2006.03.26
19" LCD NEC 1970-NXB


2-1141738650
dera
2006-03-07 16:37
2006.03.26
Как отсортировать таблицу?


2-1142335852
kami
2006-03-14 14:30
2006.03.26
Отловить нажатие Tab


2-1142170734
Wolffen
2006-03-12 16:38
2006.03.26
Какой процедурой запускаются приложения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский