Переключение на Главную Страницу Страницы: [1] 2 3 ... 5 ОтправитьПечать
Очень популярная тема (более 25 ответов) ИТ: время жизни итератора и текущей строки (число прочтений - 21629 )
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
ИТ: время жизни итератора и текущей строки
29. Апреля 2008 :: 10:47
Печать  
Недостаточный контроль за текущей строкой при операции удаления строк:

Код
Выбрать все
Процедура Сформировать()
	_т =СоздатьОбъект("ИндексированнаяТаблица");
	_т.НоваяКолонка("К1");
	Для _ин =1 По 100 Цикл
		_т.НоваяСтрока();
		_т.К1 =_ин;
	КонецЦикла;

	_т.ДобавитьИндекс("К1", "К1");
	_т.ДобавитьИндекс("К2", "К1");
	_т.ВыбратьСтроки("К1");
	Для _ин =1 По 10 Цикл
		_т.ПолучитьСтроку("К1");
	КонецЦикла;
	Сообщить(_т.К1);

	_т.УстановитьФильтр(10, 10, "К2");
//	_т.УстановитьФильтр(5, 15, "К2"); // другой вариант
	_т.УдалитьСтроки("К2");
	Сообщить(_т.К1);

	_т.ПолучитьСтроку("К1");
	Сообщить(_т.К1);
КонецПроцедуры
 


  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТ: время жизни итератора и текущей строки
Ответ #1 - 29. Апреля 2008 :: 10:48
Печать  
Недостаточный контроль за временем жизни итератора:

Код
Выбрать все
Процедура Сформировать2()
	_т =СоздатьОбъект("ИндексированнаяТаблица");
	_т.НоваяКолонка("К1");
	Для _ин =1 По 100 Цикл
		_т.НоваяСтрока();
		_т.К1 =_ин;
	КонецЦикла;

	_т.ДобавитьИндекс("К1", "К1");
	_т.ДобавитьИндекс("К2", "К1");
	_т.ВыбратьСтроки("К1");
	Для _ин =1 По 10 Цикл
		_т.ПолучитьСтроку("К1");
	КонецЦикла;
	Сообщить(_т.К1);

	_т.УстановитьФильтр(5, 15, "К2");
	_т.ЗаполнитьКолонку("К2", "К1", 1000);
	Сообщить(_т.К1);

	_т.ПолучитьСтроку("К1");
	Сообщить(_т.К1);
КонецПроцедуры
 


  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТ: время жизни итератора и текущей строки
Ответ #2 - 29. Апреля 2008 :: 10:58
Печать  
ADirks

Леша, надо как-то отслеживать инвалидацию итераторов в ИТ.
Хотя бы поле "версии" индекса добавить, инкрементируемое при любых операциях над индексом.

Мастерю провайдера для ТП, не хватает пока некоторых вещей.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #3 - 29. Апреля 2008 :: 11:19
Печать  
kms писал(а) 29. Апреля 2008 :: 10:58:
Мастерю провайдера для ТП, не хватает пока некоторых вещей.

Яхууу!  Очень довольный (скрестил пальцы  Подмигивание )
  
Наверх
 
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #4 - 29. Апреля 2008 :: 11:24
Печать  
JohnyDeath писал(а) 29. Апреля 2008 :: 11:19:
kms писал(а) 29. Апреля 2008 :: 10:58:
Мастерю провайдера для ТП, не хватает пока некоторых вещей.

Яхууу!  Очень довольный (скрестил пальцы  Подмигивание )


+100  Очень довольный
ИТ в массы
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #5 - 29. Апреля 2008 :: 12:02
Печать  
А может лучше итераторы вообще прибивать после таких операций?  Им же явно плохо становится, и излечить их в большинстве случаев я не вижу возможности.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #6 - 29. Апреля 2008 :: 12:05
Печать  
+  и если итератор мёртв, то на ПолучитьСтроку  выдавать исключение
  
Наверх
 
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #7 - 29. Апреля 2008 :: 12:26
Печать  
ADirks писал(а) 29. Апреля 2008 :: 12:05:
+  и если итератор мёртв, то на ПолучитьСтроку  выдавать исключение


Может:
0 - больше нет строк.
или еще чего.

А, то попытка-Исключение, слишком медленно, хотя если в цикл не вставлять, то можно  Озадачен

  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТ: время жизни итератора и текущей строки
Ответ #8 - 29. Апреля 2008 :: 12:30
Печать  
ADirks

Понимаешь, в чем дело, я до сих пор не отбросил мысли о предоставлении интерфейса к индексам и итераторам на базе CBLContext.
Тогда не получится их прибивать - только проверять состояние.

Плюс как одна из возможных реализаций поставщика (самая малозатратная, кстати) - это использование итераторов для навигации в поставщике ТП.
Но опять же прибить ты его не сможешь (ибо не создавал), а поставщик сам не в состоянии отследить валидность итератора - вот в чем беда.

Т.е. момент, когда итератор становится невалиден, проходит незамеченным вне инвалидирующего алгоритма.
Поэтому пока не удается строить простые и безопасные внешние по отношению к ИТ алгоритмы, допускающие в процессе работы изменение опорных индексов.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТ: время жизни итератора и текущей строки
Ответ #9 - 29. Апреля 2008 :: 12:33
Печать  
PVR писал(а) 29. Апреля 2008 :: 12:26:
ADirks писал(а) 29. Апреля 2008 :: 12:05:
+  и если итератор мёртв, то на ПолучитьСтроку  выдавать исключение


Может:
0 - больше нет строк.
или еще чего.

А, то попытка-Исключение, слишком медленно, хотя если в цикл не вставлять, то можно  Озадачен


Да, конечно, 0 остается в силе для нормальных итераторов.

Это предложение (по исключениям) относится к попытке использовать инвалидированные итераторы, что является 100% ошибкой в логике алгоритма.
В этом случае исключение - самый верный вариант реакции для ИТ.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #10 - 30. Апреля 2008 :: 04:08
Печать  
Да, насчёт "прибивать" это я конечно погорячился.  Как я понимаю, надо итератору добавить свойство типа IsValid, и выставлять его в false после любых операций, затрагивающих итератор.  Ну и если итератор is not valid, то на попытки итерирования выдавать исключение. Чтобы итератор снова сделать валидным надо ему явно дать команду к началу итерирования.

Похоже на правду?
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТ: время жизни итератора и текущей строки
Ответ #11 - 30. Апреля 2008 :: 06:34
Печать  
ADirks писал(а) 30. Апреля 2008 :: 04:08:
Да, насчёт "прибивать" это я конечно погорячился.  Как я понимаю, надо итератору добавить свойство типа IsValid, и выставлять его в false после любых операций, затрагивающих итератор.  Ну и если итератор is not valid, то на попытки итерирования выдавать исключение. Чтобы итератор снова сделать валидным надо ему явно дать команду к началу итерирования.

Похоже на правду?

Ага, это именно то, что нужно!
  

De quelle planète es-tu?
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #12 - 30. Апреля 2008 :: 07:40
Печать  
Ну что ж.  У нас тут зима опять, в поля вылезти на праздники похоже не удастся, а придётся чё-то делать с итераторами.  Тоже спорт своего рода  Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТ: время жизни итератора и текущей строки
Ответ #13 - 30. Апреля 2008 :: 22:04
Печать  
ADirks писал(а) 30. Апреля 2008 :: 07:40:
Ну что ж.  У нас тут зима опять, в поля вылезти на праздники похоже не удастся, а придётся чё-то делать с итераторами.  Тоже спорт своего рода  Улыбка

Дааа... С погодой у вас караул.
Глобальное потепление, судя по всему до вас еще не добралось Улыбка

...

Смастерил в итоге поставщика: http://www.1cpp.ru/forum/YaBB.pl?num=1209592007
Вполне безопасно получилось, и как ни странно, пока удалось обойтись без проверки состояния итератора.
Но, по любому, это дело это нужное, рано или поздно понадобится.

А вот в первую очередь, Леша, я бы хотел тебя вот о чем попросить.
В реализации функции

CVTExtProvider::FindRow(CVTExtIterator* pIterator, int nRowIndex)

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

Эта функция должна установить итератор на строку с номером nRowIndex и вернуть TRUE, либо вернуть FALSE.
Может быть у тебя будет мысль, как это лучше сделать, не имея знаний о типе итератора и не залезая слишком сильно в делали реализации индекса?
Проще всего добавить полиморфный метод в итератор, но согласуется ли такое предложение с твоим представлением о дизайне итератора?

Ну и вообще, буду благодарен любым мыслям на этот счет (и по провайдеру в общем).

P.S.
А с другой стороны, если у вас вдруг внезапно потеплеет, Улыбка все это легко может чуток подождать.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТ: время жизни итератора и текущей строки
Ответ #14 - 01. Мая 2008 :: 00:06
Печать  
P.S.
И еще, Леш, вот здесь:

bool CVTExtIteratorFilter::Last()

неверное позиционирование на последнюю строку для неуникального индекса.
подозреваю, что из-за

nCurrentRow = pCurrentNode->ID;
IndexInNode = 0;


Видимо, вместо этого нужно что-то типа

GoToNode_Backward();

Но проверь эту мысль еще раз, пожалуйста.

http://www.1cpp.ru/bugs/show_bug.cgi?id=3794
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 5
ОтправитьПечать