Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2011, 22:39   #1
dzds
Новичок
Джуниор
 
Регистрация: 24.03.2011
Сообщений: 2
По умолчанию EStringListError with message 'List index out of bounds (644)' после удаления дубликатов

Здравствуйте, помогите, пожалуйста разобраться

Есть функция для удаления дубликатов из StringList

Код:
function Tform1.FO(strl:TstringList):integer;
var
sl:TstringList;
i:integer;
prev:string;
begin
sl:=TstringList.create;
for i := 0 to strl.Count - 1 do
begin
....//заполняется внутренний sl:TstringList из внешнего strl:TstringList путем выделения подстрок из строк strl:TstringList, в результате получается список 10-значных цифр в формате строки (проверено встраивал код для сохранения в файл //sl.SaveToFile('c:\log.log');- кроме цифр ничего в файле не было)
end;
sl.Sort;
prev:=sl.Strings[0];
for I := 1 to sl.Count - 1 do
if sl.Strings[i]=prev then sl.Delete(i) else prev:=sl.Strings[i];
//Тут вываливается ошибка описаная в теме
result:=sl.Count;
end;
Хочу заметить что исходный СтрингЛист (на котором проверялась работоспособность имел 691 строку), а итоговый (как видно из ошибки - 644) где ж здесь "out of bounds"?

П.С. работаю в Borland Developer Studio 2006 Professional (Если єто имеет значение)


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 25.03.2011 в 08:16.
dzds вне форума Ответить с цитированием
Старый 25.03.2011, 08:21   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
for I := 1 to sl.Count - 1 do
if sl.Strings[i]=prev then sl.Delete(i) else prev:=sl.Strings[i];
запомните, когда крутите цикл по каким-либо структурам и в цикле удаляете элементы, то нужно или организовавать обратный цикл от количества_записей downto ИндексПервойЗаписи
или пользоваться циклом с условием - и изменять переменную цикла самостоятельно.
Вот, например, так:
Код:
prev:=sl.Strings[Count - 1];
for i := Count - 2 downto 0 do
   if sl.Strings[i]=prev 
        then sl.Delete(i) 
        else prev:=sl.Strings[i];
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2011, 09:39   #3
dzds
Новичок
Джуниор
 
Регистрация: 24.03.2011
Сообщений: 2
По умолчанию

Большое сапсибо, все получилось

А насчет того что код надо оформлять тегами CODE, прошу прощенья, первый раз на флруме, на будущее буду знать спасибо
dzds вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
List index out of bounds (0) waka2ebawer Работа с сетью в Delphi 2 17.02.2011 06:30
ошибка raized exception class EListError with message 'List index out of bounds(1)'.Process stopped SGRaptor Софт 0 22.05.2010 19:12
List index out of bounds (91) KoBRaAndrey Общие вопросы Delphi 6 25.12.2009 15:29
List index out of bounds (44) KoBRaAndrey Общие вопросы Delphi 5 11.12.2009 23:03