Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Одноименные Переменные / 25 сообщений из 27, страница 1 из 2
24.04.2007, 16:12
    #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
24.04.2007, 16:37
    #34484101
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одноименные Переменные
Не знаю, как с Visual Basic, а в COS именно с параметрами не помню проблем.

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

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

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

Имеются ли какие-то особенности в visual basiс на каше - не знаю.
...
Рейтинг: 0 / 0
24.04.2007, 16:54
    #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
24.04.2007, 16:56
    #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
24.04.2007, 17:00
    #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
24.04.2007, 17:03
    #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
24.04.2007, 17:28
    #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
24.04.2007, 17:35
    #34484347
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одноименные Переменные
Про это написано, нашел (не уверен, что у вас есть доступ к каше, но все-таки)
http://127.0.0.1:8972/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_usercode#GCOS_ucode_vars

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

Но это ответ не на поставленный вопрос
...
Рейтинг: 0 / 0
24.04.2007, 17:45
    #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
25.04.2007, 08:19
    #34485145
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одноименные Переменные
newbie'"они" - это программисты ;)
Именно!
newbie'а где же n Per1,Per2,Per3,Err в процедурах Viz и Pec?
Я их сознательно не ставил, дабы показать что переменые можно "портить" в этом варианте...
...
Рейтинг: 0 / 0
25.04.2007, 09:19
    #34485237
AlexKB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одноименные Переменные
Если клиентское приложение достаточно сложное и при коннекте отдельной формы, или ряда форм могут вызываться методы, которые могут исполняться отдельными нитями на клиенте асинхронно, но одним процессом на сервере, то пересечение переменных считаю что возможно.
Проверьте два таймера, которые работают асинхронно и вызывают методы на сервере.

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

Считаю что только тщательное тестирование даст ответ на Ваши вопросы.
...
Рейтинг: 0 / 0
25.04.2007, 09:29
    #34485260
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одноименные Переменные
Может быть, они у вас уже на клиенте путаются?
...
Рейтинг: 0 / 0
25.04.2007, 09:34
    #34485271
AlexKB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одноименные Переменные
Нет не на клиенте.
Это легко проверяется с помощью Set ^Log($zh)="context="_Var.
А затем смотрим что в разные моменты времени одна и та же переменная, находится в разном контексте и отрабатывает по своим правилам.
...
Рейтинг: 0 / 0
25.04.2007, 09:47
    #34485305
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одноименные Переменные
AlexKB , может мы говорим о разном... Но чтобы что-то терялость... С таким не сталкивались.
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
25.04.2007, 09:51
    #34485315
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одноименные Переменные
Но в своих разработках используем правило:
- все переменые пишутся прописными буквами
- параметры пишутся с заглавной буквы
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
25.04.2007, 10:14
    #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
25.04.2007, 11:15
    #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
25.04.2007, 11:37
    #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
25.04.2007, 11:41
    #34485797
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одноименные Переменные
Извиняюсь, чтобы переменная P0 виделась в первом примере, нужно написать так

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

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

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

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

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

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

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

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


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