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

Код: 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
Не получается очистить List
    #36654486
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GetNext возвращает следующий по ключу, если ключа нет, видимо будет возвращен первый ключ.

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

Сделайте что-то вроде такого:..Rows.RemoveAt(current)
...
Рейтинг: 0 / 0
Не получается очистить List
    #36655446
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Не получается очистить List
    #36655586
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ragzovskii,

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


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