powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / ошибка <MAXSCOPE>
11 сообщений из 11, страница 1 из 1
ошибка <MAXSCOPE>
    #38888375
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
<MAXSCOPE> There has been an attempt to issue more than 31 levels of New commands. 



Не ожидал такого подвоха. Когда тестировал вложенность вызовов и $stack переменную, вроде, за 1000 зашкаливало.

Cache for Windows (x86-32) 2010.1.2 (Build 600.0_SU) Tue May 25 2010 20:27:57 EDT

Есть ли возможность увеличить вложенность NEW?
Какое ограничение в более новых версиях?
...
Рейтинг: 0 / 0
ошибка <MAXSCOPE>
    #38888405
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDR
Код: sql
1.
<MAXSCOPE> There has been an attempt to issue more than 31 levels of New commands. 




Не ожидал такого подвоха. Когда тестировал вложенность вызовов и $stack переменную, вроде, за 1000 зашкаливало.

Cache for Windows (x86-32) 2010.1.2 (Build 600.0_SU) Tue May 25 2010 20:27:57 EDT

Есть ли возможность увеличить вложенность NEW?
Какое ограничение в более новых версиях?если не использовать эксклюзивного new
эксклюзивный new это когда либо не указаны переменные либо через исключение в скобках
...
Рейтинг: 0 / 0
ошибка <MAXSCOPE>
    #38888440
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDR,

http://docs.intersystems.com/cache_latest/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_cnew#RCOS_cnew57]Attempting to issue more than 31 levels of exclusive NEW or argumentless NEW results in a <MAXSCOPE> error.
...
Рейтинг: 0 / 0
ошибка <MAXSCOPE>
    #38888498
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor, servit

Спасибо.
Мне кажется вложенность 32 искуственная, вызванная неким счетчиком, который давно пора увеличить.
Поэкспериментировал:START
   new (val) ;new val
   s val="aaaaaaaaaaaa" 
   d TEST
   q
TEST
   n val 
   s val="bbbbbbbbbbbb" 
   w "$stack=",$stack,!  
   goto START
new (val) четко вылетает на 32-м вложенном вызове.
new val - дает <FRAMESTACK> на 828-м вложенном вызове.
Придется пересматривать код, на рекурсию был основной расчет. А эксклюзивное new (...) очень облегчало работу.
...
Рейтинг: 0 / 0
ошибка <MAXSCOPE>
    #38888595
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDR ,

Дело не только в NEW, но и в DO,XECUTE и т.д.Даже такой код рано или поздно вызовет ошибку <FRAMESTACK>:START
   d TEST
   q
TEST
   w "$stack=",$stack,!  
   goto STARTDirksDRnew val - дает <FRAMESTACK> на 828-м вложенном вызове.Глубину рекурсии (количество вызовов) можно значительно увеличить (например у меня ~280000 вложенных вызовов получилось), увеличив размер стека.
DirksDRПридется пересматривать код, на рекурсию был основной расчет. А эксклюзивное new (...) очень облегчало работу.Не всё так печально: можно вместо val использовать val($st) или ^||val($st) или ..., а NEW не использовать вовсе.

PS: Use VIRTUALFRAME and MMAP() For Larger Stack And Error Frames
...
Рейтинг: 0 / 0
ошибка <MAXSCOPE>
    #38889144
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDRА эксклюзивное new (...) очень облегчало работу.А Вы не ленитесь. Перечисляйте список переменных используемых в процедуре/функции. Так и читабельность кода повышается.START
   new (val) ;new val
   s val="aaaaaaaaaaaa" 
   d TEST
   q
TEST
   n val 
   s val="bbbbbbbbbbbb" 
   w "$stack=",$stack,!  
   goto STARTА может все же писать по-человечески? Зачем такой изврат? Зачем выпрыгивать из процедуры?
Ну если уж хочется использовать goto, пользуйтесь ею на одном уровне, например: ;======================================================
 ; Добавьте комментарии
 ;====================================================== 
START
   new (val) ;new val
   s val="aaaaaaaaaaaa" 
   d TEST
   goto START ;  тут бы, безусловный переход заменить условный
   ; да и какое-либо дальнейшее действие должно предполагаться
   ; иначе имеет смысл просто заменить на обычный цикл  for
   q
 ;======================================================
 ; Согласитесь, так даже логичнее?
 ; Процедура полностью закончена, из неё нет прыжков черти куда
 ;======================================================
TEST
   n val 
   s val="bbbbbbbbbbbb" 
   w "$stack=",$stack,!  
   Q
  ;======================================================
...
Рейтинг: 0 / 0
ошибка <MAXSCOPE>
    #38889149
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П.С.М.Так и читабельность кода повышается.Под повышению читабельности кода имелось в виду то, что в случае: ;=======================================
 ; Некий метод
 ;=======================================
METHOD
 N val1,val2,val3
 ;... что то делается
 Q
 ;=======================================Сразу видно, какие переменные используются в методе.
...
Рейтинг: 0 / 0
ошибка <MAXSCOPE>
    #38889164
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно вообще забыть про NEW если писать процедурный код
в рамках каждой такой процедуры уже будут свои переменные и те которые явно объявлены публичными
...
Рейтинг: 0 / 0
ошибка <MAXSCOPE>
    #38889673
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П.С.М.А может все же писать по-человечески? Зачем такой изврат?
Это я измерял глубину вложенности, рабочий код я так не пишу :)
Кстати, Ваш пример также демонстрирует ошибку
Код: sql
1.
2.
3.
   new (val) ;new val
   ^
<MAXSCOPE>START+1^testcall


на 32-м new, хотя $stack=2 все время.
Может есть системная переменная, которая уровень вложенности new показывает?

servit

Долго не мог смысл val($st) понять. Наконец дошло. Хороший прием, спасибо за идею.

DAiMor

Поигрался с процедурным кодом:Rou1 // Rou1 routine
  set aa="aaa"
  s a="a",b="b",c="c"
  do Proc1(a,b)
  do Proc2(a,b,c)
  w a1,!
  w a2,!
Proc1(x,y) { 
  set a1="aaa1"
  w "Proc1",x,y,!
  ;w aa,!


Proc2(x,y,z) { 
  set a2="aaa2"
  w "Proc2",x,y,z,!
  ;w aa,!
} Убедился в изолированности переменных. Хороший прием, спасибо за идею.
Хотел int-код посмотреть, оказалось это он и есть.
Подумаю, где применить.
...
Рейтинг: 0 / 0
ошибка <MAXSCOPE>
    #38889754
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDRВаш пример также демонстрирует ошибку

new (val) ;new val
^
<MAXSCOPE>START+1^testcall

Конечно демонстрирует, там ведь new (val) после метки START никто не убирал. Было б странно если б этого и не происходило :)
DirksDRМожет есть системная переменная, которая уровень вложенности new показывает?
Еще раз:
П.С.М.А Вы не ленитесь. Перечисляйте список переменных используемых в процедуре/функции.
...
Рейтинг: 0 / 0
ошибка <MAXSCOPE>
    #38889787
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П.С.М.Перечисляйте список переменных
Либо пользуйтесь синтаксисом с фигурными скобками, тут уж дело вкуса.
Только не занимайтесь ерундой с прыжками по goto из процедуры в процедуру при этом еще и рекурсивно вызывая чего-нибудь.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / ошибка <MAXSCOPE>
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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