powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Одноименные Переменные
25 сообщений из 27, страница 1 из 2
Одноименные Переменные
    #34483999
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, здравствуйте !!!

Имеем программу "Test" на COS с метками :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Viz(Per1,Per3,Per3,Err) 
  Текст программы
  .

Pec(Per1,Per3,Per3,Err)  
 Текст программы
  .

Prn(Per1,Per3,Per3,Err) 
  .
End
Вопрос.

Как себя ведут переменные (Per1,Per3,Per3,Err ) ,
а точнее их значение, при обращение к этим меткам поочередно из Visual Basic:
Код: plaintext
1.
 Do Viz^Test(Per1,Per3,Per3,Err)
 Do Pec^Test(Per1,Per3,Per3,Err) 
и т. д.
Мой программист считает, что в памяти машины (на сервере) они перекрывают друг друга
и теряется информация.
Не могу однозначно ему ответить.

Спасибо.
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34484101
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, как с Visual Basic, а в COS именно с параметрами не помню проблем.

Другое дело, что если внутри программы использовать переменную, не создав ее, то она перетрет переменную вызывающей программе, и при выходе из подпрограммы не уничтожится. То есть создастся в контексте процесса, а не (под)программы.

Для избежания этого в методах классов есть ключевое слово procedureblock, тогда все локальные переменные создаются в рамках метода и автоматически уничтожаются при выходе из него.
Как сделать procedureblock для программы(не метода) на cos - я не знаю

Параметры методов и программ, переданные по значению, создаются в контексте метода в любом случае, и уничтожаются при выходе из него. Естественно, переменная за пределами программы не изменяется.

Имеются ли какие-то особенности в visual basiс на каше - не знаю.
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34484175
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, неправильно изложил вопрос

Обращение идет к двум разных программ "Test1" и "Test2" :
Сначало к "Test1", потом к "Test2" и опять к "Test1" !!!
Все происходит в многооконном GUI на VB


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Test1 ; Первая
Viz(Per1,Per3,Per3,Err) 
  Текст программы
  .
  .
End

Test2 ; Вторая
Viz(Per1,Per3,Per3,Err) 
  Текст программы
  .
  .
End


Код: plaintext
1.
2.
3.
4.
5.
  Do Viz^Test1(Per1,Per3,Per3,Err)

  Do Viz^Test2(Per1,Per3,Per3,Err)

  Do Viz^Test1(Per1,Per3,Per3,Err)
 

Буду очень благодарен за помощь
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34484185
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понял что Viz и Pec это "самостийные" процедуры? Т.е. в конце каждой есть команда Q ...
Тогда после вызова
Код: plaintext
Do Viz^Test(Per1,Per3,Per3,Err)
и
Код: plaintext
Do Pec^Test(Per1,Per3,Per3,Err)
Каждый раз будут создаваться переменные Per1,Per3,Per3,Err и по завершении процедур они будут уничтожаться...
Вот пример для иллюстрации
Код: 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.
START
 n
 s Per1= 1 
 s Per2= 2 
 s Per3= 3 
 s Err= 0 
 d Viz(Per1,Per2,Per3,Err)
 w !,"После Viz"
 zw 
 d Pec(Per1,Per2,Per3,Err)
 w !,"После Pec"
 zw
 q
Viz(Per1,Per2,Per3,Err) 
 s Per1= 11 
 s Per2= 22 
 s Per3= 33 
 s Err= 1 
 w !,"В Viz"
 zw
 q
Pec(Per1,Per2,Per3,Err)  
 s Per1= 111 
 s Per2= 222 
 s Per3= 333 
 s Err= 2 
 w !,"В Pec"
 zw
 q
Вот что будет в терминале
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34484200
newbie'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Caché executes an implicit New command for each parameter in the formal list. This is shown in the following example, where x is re-initialized when myfunc is invoked:

Код: plaintext
1.
2.
3.
4.
5.
6.
mainprog
 Set x= 7 
 Set y=$$myfunc( 99 )
myfunc(x)
 Write x
 Quit  66 
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34484216
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но все меняется "Когда приходят они!"
Код: 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.
START
 n
 s Per1= 1 
 s Per2= 2 
 s Per3= 3 
 s Err= 0 
 d Viz(Per1,Per2,Per3,Err)
 w !,"После Viz"
 zw 
 d Pec(Per1,Per2,Per3,Err)
 w !,"После Pec"
 zw
 q
Viz(P1,P2,P3,E) 
 s Per1= 11 
 s Per2= 22 
 s Per3= 33 
 s Err= 1 
 w !,"В Viz"
 zw
 q
Pec(P1,P2,P3,E)  
 s Per1= 111 
 s Per2= 222 
 s Per3= 333 
 s Err= 2 
 w !,"В Pec"
 zw
 q
Если поменять имена "входящих параметров"...
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34484319
newbie'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaНо все меняется "Когда приходят они!"
Код: 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.
START
 n
 s Per1= 1 
 s Per2= 2 
 s Per3= 3 
 s Err= 0 
 d Viz(Per1,Per2,Per3,Err)
 w !,"После Viz"
 zw 
 d Pec(Per1,Per2,Per3,Err)
 w !,"После Pec"
 zw
 q
Viz(P1,P2,P3,E) 
 s Per1= 11 
 s Per2= 22 
 s Per3= 33 
 s Err= 1 
 w !,"В Viz"
 zw
 q
Pec(P1,P2,P3,E)  
 s Per1= 111 
 s Per2= 222 
 s Per3= 333 
 s Err= 2 
 w !,"В Pec"
 zw
 q
Если поменять имена "входящих параметров"...
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT



"они" - это программисты ;)
а где же n Per1,Per2,Per3,Err в процедурах Viz и Pec?
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34484347
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про это написано, нашел (не уверен, что у вас есть доступ к каше, но все-таки)
http://127.0.0.1:8972/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_usercode#GCOS_ucode_vars

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

Но это ответ не на поставленный вопрос
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34484391
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriu
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Test1 ; Первая
Viz(Per1,Per3,Per3,Err) 
  Текст программы
  .
  .
End

Test2 ; Вторая
Viz(Per1,Per3,Per3,Err) 
  Текст программы
  .
  .
End
...
Do Viz^Test1(Per1,Per3,Per3,Err)
Do Viz^Test2(Per1,Per3,Per3,Err)
Do Viz^Test1(Per1,Per3,Per3,Err)

Надо же было так все запутать. :)
А все из-за того, что в списке переменных процедуры не стоит
использовать те же имена переменных, что и при передаче параметров.
Тогда с головой все будет в порядке. Но проблемы все-таки действительно
не существует. На каждую переменную из формального списка таки проводится
неявный New, так что по завершении процедуры в эту переменную вернется ее
старое значение. Следовательно программист неправ, но имена переменных лучше
изменить.
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485145
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie'"они" - это программисты ;)
Именно!
newbie'а где же n Per1,Per2,Per3,Err в процедурах Viz и Pec?
Я их сознательно не ставил, дабы показать что переменые можно "портить" в этом варианте...
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485237
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если клиентское приложение достаточно сложное и при коннекте отдельной формы, или ряда форм могут вызываться методы, которые могут исполняться отдельными нитями на клиенте асинхронно, но одним процессом на сервере, то пересечение переменных считаю что возможно.
Проверьте два таймера, которые работают асинхронно и вызывают методы на сервере.

Во всяком случае у меня подобные проблемы возникали - переменные по именам пришлось разделить, new не помогает.

Считаю что только тщательное тестирование даст ответ на Ваши вопросы.
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485260
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть, они у вас уже на клиенте путаются?
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485271
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет не на клиенте.
Это легко проверяется с помощью Set ^Log($zh)="context="_Var.
А затем смотрим что в разные моменты времени одна и та же переменная, находится в разном контексте и отрабатывает по своим правилам.
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485305
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexKB , может мы говорим о разном... Но чтобы что-то терялость... С таким не сталкивались.
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485315
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но в своих разработках используем правило:
- все переменые пишутся прописными буквами
- параметры пишутся с заглавной буквы
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485393
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сперва клиент:

procedure TForm2.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=True;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
Timer2.Enabled:=True;

end;

procedure TForm2.Button3Click(Sender: TObject);
begin
Timer1.Enabled:=False;
Timer2.Enabled:=False;

VisM1.NameSpace:='User';
Vism1.Code:='Kill ^A Set P1=$D(^A)';
VisM1.ExecFlag:=1;
Edit2.Text:=Vism1.P1;
Edit1.Text:=Vism1.P1;

end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
VisM1.NameSpace:='User';
Vism1.Code:='Set P0="<1>" Do ^TestD';
VisM1.ExecFlag:=1;
Edit1.Text:=Vism1.P1;

end;

procedure TForm2.Timer2Timer(Sender: TObject);
begin
VisM1.NameSpace:='User';
Vism1.Code:='Set P0="<2>" Do ^TestD';
VisM1.ExecFlag:=1;
Edit2.Text:=Vism1.P1;

end;

Теперь сервер
TestD
set ^A($zh)= "CONTEXT "_P0_"="_$i(a)
set P1=a
q

Вот Результат:
^A(1360.125215)=CONTEXT <1>=2
^A(1361.033515)=CONTEXT <2>=3
^A(1361.128143)=CONTEXT <1>=4
^A(1362.034807)=CONTEXT <2>=5
^A(1362.126757)=CONTEXT <1>=6
^A(1363.031382)=CONTEXT <2>=7
^A(1363.132625)=CONTEXT <1>=8
^A(1364.0343)=CONTEXT <2>=9
^A(1364.126091)=CONTEXT <1>=10
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485658
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexKBТеперь сервер
TestD
set ^A($zh)= "CONTEXT "_P0_"="_$i(a)
set P1=a
q

Вот Результат:
^A(1360.125215)=CONTEXT <1>=2
^A(1361.033515)=CONTEXT <2>=3
^A(1361.128143)=CONTEXT <1>=4
^A(1362.034807)=CONTEXT <2>=5
^A(1362.126757)=CONTEXT <1>=6
^A(1363.031382)=CONTEXT <2>=7
^A(1363.132625)=CONTEXT <1>=8
^A(1364.0343)=CONTEXT <2>=9
^A(1364.126091)=CONTEXT <1>=10

Насколько я понимаю, VisM иницировал процесс на сервере во время первичного
подключения и запускает программы внутри него. Единственно, что меня настораживает,
так это начальное значение 1 в несуществующей вроде бы переменной a .
А так все правильно. Каким боком это относится к обсуждаемой проблеме - тоже непонятно. :)
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485774
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
инкремент не требует определения переменной.

переменная "a" не изолирована, не создается и не уничтожается.
Какое иное поведение ожидает автор этой этой программы - пока не понятно

Попробуйте сделать как в прведенной мной ссылке на документацию, например
Код: plaintext
1.
2.
3.
4.
5.
TestD()
{set ^A($zh)= "CONTEXT "_P0_"="_$i(a)
 set P1=a
 q
}
, либо
Код: plaintext
1.
2.
3.
4.
5.
TestD
 n (P0)
 set ^A($zh)= "CONTEXT "_P0_"="_$i(a)
 set P1=a
 q

А если вы хотите сделать многопоточное приложение - Vism для этого не очень подходит.
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485797
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, чтобы переменная P0 виделась в первом примере, нужно написать так

Код: plaintext
1.
2.
3.
4.
TestD()[P0]
{set ^A($zh)= "CONTEXT "_P0_"="_$i(a)
 set P1=a
 q
}
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485804
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чтобы наружу отдавалось P1, то так

Код: plaintext
1.
2.
3.
4.
5.
TestD()[P0,P1]
{set A($zh)= "CONTEXT "_P0_"="_$i(a)
 set P1=a
 q
}
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485807
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, а во втором примере, чтобы отдавалось наружу P1, нужно

Код: plaintext
1.
2.
3.
4.
TestD
 n (P0,P1)
 set ^A($zh)= "CONTEXT "_P0_"="_$i(a)
 set P1=a
 q
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485809
krvsaНо в своих разработках используем правило:
- все переменые пишутся прописными буквами
- параметры пишутся с заглавной буквы
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT

Мы вабще работаем без пераменых !!!!!!
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485815
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.инкремент не требует определения переменной.

Если вы это мне, то я вообще-то догадался. :) Настораживает другое -
почему сразу 2, а не 1, как должно было быть.
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485826
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой пример примитивен, поэтому его обсуждать не следует.
Проблема действительно была, была она при использовании технологии SMWrap.
Приложение содержало ряд таймеров, которые в своих обработчиках (очень кратких) использовали переменные с одним именем. Вот тут и наступала путаница. New не помогло (было с самого начала). Пришлось имена переменных ставить свои.
Я хочу сказать, что в подобных случаях, когда есть хоть малейшее подозрение на пересечение, нужно очень тщательно тестировать, не исключать никакие, даже самые невероятные варианты.

А мой код забудьте.
...
Рейтинг: 0 / 0
Одноименные Переменные
    #34485988
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexKBМой пример примитивен, поэтому его обсуждать не следует.
Проблема действительно была, была она при использовании технологии SMWrap.
Приложение содержало ряд таймеров, которые в своих обработчиках (очень кратких) использовали переменные с одним именем. Вот тут и наступала путаница. New не помогло (было с самого начала). Пришлось имена переменных ставить свои.

Конечно бы не помогло, процесс-то один. :)

AlexKB
А мой код забудьте.
Не могу, тайна пропавшей 1-цы меня терзает. Может все-таки посвятите? :)
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Одноименные Переменные
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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