Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Не получается очистить List / 5 сообщений из 5, страница 1 из 1
28.05.2010, 07:44
    #36654444
ragzovskii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается очистить List
Здравствуйте.
Возникла такая проблема. Есть класс:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Class MyPack.TClassificator Extends %Persistent
{
....
/// Родитель данного классификатора
Property Parent As TClassificator;

/// Потомки данного классификатора
Property Children As list Of TClassificator;

/// Записи в таблице
Property Rows As list Of TNode;
...

Method delete()
{
	set current=..Children.GetNext()
	while (current'="")
	{
			do current.delete()
			do ..%DeleteId(current.%Id())	
			set current=..Children.GetNext()
			
	}
	set current=..Rows.GetNext()
	while(current'="")
	{
		do current.%DeleteId(current.%Id())
		set current=..Rows.GetNext()
	}
	do ..Parent.Children.RemoveAt(..Parent.Children.FindOref(##this))
	do ..Parent.%Save()
	do ..%DeleteId(##this.%Id())
}

}

Ошибка заключается в том, что во втором цикле команда set curret=..Rows.GetNext() не возвращает следующий элемент списка и цикл выполняется бесконечно. В первом случае все прекрасно работает.
Помогите, пожалуйста.
...
Рейтинг: 0 / 0
28.05.2010, 08:33
    #36654486
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается очистить List
GetNext возвращает следующий по ключу, если ключа нет, видимо будет возвращен первый ключ.

В вашем случае вы удаляете объект, но не удаляете элемен массива, который на него ссылается, поэтому вам постоянно возвращает один и тот же ключ (со ссылкой на несуществующий объект).

Сделайте что-то вроде такого:..Rows.RemoveAt(current)
...
Рейтинг: 0 / 0
28.05.2010, 14:01
    #36655446
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается очистить List
ragzovskii, или как-то так
Код: plaintext
1.
2.
3.
4.
5.
6.
      s key="" for { s row=..Rows.GetNext(.key) q:key=""
             if '$IsObject(current) continue
             s rid=row.%Id() d row.%Close() k row  
             d ##class(TNode).%DeleteId(rid) 
      }
      d ..Rows.Clear()   
...
Рейтинг: 0 / 0
28.05.2010, 14:51
    #36655586
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается очистить List
ragzovskii,

На англоязычном форуме тоже ответили .
...
Рейтинг: 0 / 0
28.05.2010, 15:15
    #36655660
ragzovskii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается очистить List
Спасибо, оперативно :)
Я конечно полагал, что ошибка простая, но чтобы настолько...в свое оправдание скажу, что этот код я писал поздно ночью :)
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Не получается очистить List / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]