![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TStringList болеет. Как вылечить? [D6, WinXP]
Pavelkq © (2004-07-08 12:22:00)Имею цикл в котором из массива запихиваю данные в TStringList. При проверке оказывается, что одна строка заносится с посторонними симфолами. Например:
FData:=TStringList.Create;
for i:=1 to 1000 do
begin
Fdata.Sorted := true;
Fdata.Duplicates := dupIgnore;
if A[i]<>'' then
FData.Add(A[i]);
end;
Вдруг обраниживается на каком-то 179 элементе, чтоA[179]='приехать', аFdata.Strings[179]=#0#0#1#0#1'приехать'#1#$1a#0. Пришлось написать процедуру, которая проверяет все элементы и корректирует результат, выкидывая лишние символы (благо, у меня могут присутствовать исключительно русские строчные буквы). Но это же не вариант.
Вероятно, это связано с памятью, т.к., когда я пытался вставить диагностику в код, то ошибка уже случалась не на 179, а на 309, то на 877. Т.е. от количества строк кода зависело, где будет ошибка. Причем от раза к разу, если не менять код, ошибка возникает в одном и том же элементе, т.е. не случайным образом. Как с этим бороться?
Pavelkq (2004-07-09 06:29:00) [1]Патчей у меня нет. Где их взять?
[13]- Нет, код посылать не буду, т.к. он сам займет 4 листа + еще 2 DLL-ки и огроменный словарь.
Я уже все другим способом сделал и все работает без ошибок.
Всем большое спасибо за отклик!
Digitman (2004-07-08 17:19:00) [2]посмотреть бы воочию, как этот самый "волшебный" массив A инициализируется и заполняется перед тем как ..
Amoeba (2004-07-08 17:07:00) [3]Небольшое замечание несколько в сторону.
У тебя
var A: array of string
и при этом
for i:=1 to 1000 do
хотя первый элемент массива имеет индекс 0. То, что он пропускается - это так задумано?
Sandman25 (2004-07-08 15:48:00) [4]Все патчи для D6 установлены?
Pavelkq (2004-07-08 15:46:00) [5]Конечно, с неба. Я анализировал в ходе выполнения программы. Было видно, что A[] не содержал этих символов, а Fdata.Strings[], содержал. Вывести на экран это не удавалось, т.к. любые попытки вывести такую строку ничего не отображали. Можно это увидеть только приостановав выполнение программы, и наведя на переменную.
Ладно, похоже, это действительно чудеса. Я перепишу все немного по другому...
Amoeba (2004-07-08 14:47:00) [6]Не с неба же они падают!
KSergey (2004-07-08 13:54:00) [7]Ну тогда A[] содержит эти символы
Digitman (2004-07-08 13:00:00) [8]
> проходя пошагово видно, что А заполнен корректно
чем смотришь ? Evaluate/Modify ? он тебе тоже непечатные символы далеко не все выведет ..
вставай на A[i] и проверяй Length(A[i]), сравнивая с тем что показывает Evaluate/Modify
Pavelkq (2004-07-08 13:00:00) [9]
var A: array of stringсоррии...
Project-Options-Compiler-Range checking включен. Ошибок нет.
Sandman25 (2004-07-08 12:49:00) [10][4] Pavelkq (08.07.04 12:46)
Так все-таки A:String или A[179]='приехать'?
>Количество элементо точно отслеживается.
Включите Project-Options-Compiler-Range checking
Pavelkq (2004-07-08 12:46:00) [11][2] - пробовал, не получается тогда избавиться от дубликатов. Хотя, сортировка срабатывает.
[3] - 1.A:string
2.Нет, введя дополнительные переменные и проходя пошагово видно, что А заполнен корректно.
3.Количество элементо точно отслеживается. Иначе бы была ошибка работы программы. А ее нет. Причем ошибка вылезает не в конце, а где попало. Думаю, это память. Чего бы дополнительные строки в цикле меняли положение ошибки?
KSergey (2004-07-08 12:37:00) [12]1.Какого типа А?
2.Похоже, что в А как раз то, что видим в Fdata.Strings. А в массиве точно есть столько элементов, сколько их используется?
Знаете, признаться либо мистика, либо проблема не тут, либо не та.
Sandman25 (2004-07-08 12:34:00) [13]Fdata.Sorted := true;
Fdata.Duplicates := dupIgnore;
Лучше вынести из цикла. Первое вниз, второе вверх.
Семен Сорокин (2004-07-08 12:23:00) [14]Trim при занесении