Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Господа, здравствуйте !!! Имеем программу "Test" на COS с метками : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Как себя ведут переменные (Per1,Per3,Per3,Err ) , а точнее их значение, при обращение к этим меткам поочередно из Visual Basic: Код: plaintext 1. Мой программист считает, что в памяти машины (на сервере) они перекрывают друг друга и теряется информация. Не могу однозначно ему ответить. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 16:12 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Не знаю, как с Visual Basic, а в COS именно с параметрами не помню проблем. Другое дело, что если внутри программы использовать переменную, не создав ее, то она перетрет переменную вызывающей программе, и при выходе из подпрограммы не уничтожится. То есть создастся в контексте процесса, а не (под)программы. Для избежания этого в методах классов есть ключевое слово procedureblock, тогда все локальные переменные создаются в рамках метода и автоматически уничтожаются при выходе из него. Как сделать procedureblock для программы(не метода) на cos - я не знаю Параметры методов и программ, переданные по значению, создаются в контексте метода в любом случае, и уничтожаются при выходе из него. Естественно, переменная за пределами программы не изменяется. Имеются ли какие-то особенности в visual basiс на каше - не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 16:37 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Извиняюсь, неправильно изложил вопрос Обращение идет к двум разных программ "Test1" и "Test2" : Сначало к "Test1", потом к "Test2" и опять к "Test1" !!! Все происходит в многооконном GUI на VB Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: plaintext 1. 2. 3. 4. 5. Буду очень благодарен за помощь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 16:54 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Я так понял что Viz и Pec это "самостийные" процедуры? Т.е. в конце каждой есть команда Q ... Тогда после вызова Код: plaintext Код: plaintext Вот пример для иллюстрации Код: 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. ---------- Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 16:56 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 17:00 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Но все меняется "Когда приходят они!" Код: 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. ---------- Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 17:03 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
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. ---------- 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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 17:28 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Про это написано, нашел (не уверен, что у вас есть доступ к каше, но все-таки) http://127.0.0.1:8972/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_usercode#GCOS_ucode_vars и там описаны разные способы разделения контекста переменных для программ. Можно написать программу так, что переменные подпрограммы будут затирать переменные надпрограммы, а можно их изолировать. Передаваемые по значению параметры не затирают переданные переменные в любом случае. Но это ответ не на поставленный вопрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 17:35 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Valeriu Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Do Viz^Test1(Per1,Per3,Per3,Err) Do Viz^Test2(Per1,Per3,Per3,Err) Do Viz^Test1(Per1,Per3,Per3,Err) Надо же было так все запутать. :) А все из-за того, что в списке переменных процедуры не стоит использовать те же имена переменных, что и при передаче параметров. Тогда с головой все будет в порядке. Но проблемы все-таки действительно не существует. На каждую переменную из формального списка таки проводится неявный New, так что по завершении процедуры в эту переменную вернется ее старое значение. Следовательно программист неправ, но имена переменных лучше изменить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 17:45 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
newbie'"они" - это программисты ;) Именно! newbie'а где же n Per1,Per2,Per3,Err в процедурах Viz и Pec? Я их сознательно не ставил, дабы показать что переменые можно "портить" в этом варианте... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 08:19 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Если клиентское приложение достаточно сложное и при коннекте отдельной формы, или ряда форм могут вызываться методы, которые могут исполняться отдельными нитями на клиенте асинхронно, но одним процессом на сервере, то пересечение переменных считаю что возможно. Проверьте два таймера, которые работают асинхронно и вызывают методы на сервере. Во всяком случае у меня подобные проблемы возникали - переменные по именам пришлось разделить, new не помогает. Считаю что только тщательное тестирование даст ответ на Ваши вопросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 09:19 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Может быть, они у вас уже на клиенте путаются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 09:29 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Нет не на клиенте. Это легко проверяется с помощью Set ^Log($zh)="context="_Var. А затем смотрим что в разные моменты времени одна и та же переменная, находится в разном контексте и отрабатывает по своим правилам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 09:34 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
AlexKB , может мы говорим о разном... Но чтобы что-то терялость... С таким не сталкивались. ---------- Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 09:47 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Но в своих разработках используем правило: - все переменые пишутся прописными буквами - параметры пишутся с заглавной буквы ---------- Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 09:51 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Сперва клиент: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 10:14 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
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 . А так все правильно. Каким боком это относится к обсуждаемой проблеме - тоже непонятно. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 11:15 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
инкремент не требует определения переменной. переменная "a" не изолирована, не создается и не уничтожается. Какое иное поведение ожидает автор этой этой программы - пока не понятно Попробуйте сделать как в прведенной мной ссылке на документацию, например Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. А если вы хотите сделать многопоточное приложение - Vism для этого не очень подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 11:37 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Извиняюсь, чтобы переменная P0 виделась в первом примере, нужно написать так Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 11:41 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
А чтобы наружу отдавалось P1, то так Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 11:43 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Блин, а во втором примере, чтобы отдавалось наружу P1, нужно Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 11:45 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
krvsaНо в своих разработках используем правило: - все переменые пишутся прописными буквами - параметры пишутся с заглавной буквы ---------- Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT Мы вабще работаем без пераменых !!!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 11:46 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.инкремент не требует определения переменной. Если вы это мне, то я вообще-то догадался. :) Настораживает другое - почему сразу 2, а не 1, как должно было быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 11:47 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
Мой пример примитивен, поэтому его обсуждать не следует. Проблема действительно была, была она при использовании технологии SMWrap. Приложение содержало ряд таймеров, которые в своих обработчиках (очень кратких) использовали переменные с одним именем. Вот тут и наступала путаница. New не помогло (было с самого начала). Пришлось имена переменных ставить свои. Я хочу сказать, что в подобных случаях, когда есть хоть малейшее подозрение на пересечение, нужно очень тщательно тестировать, не исключать никакие, даже самые невероятные варианты. А мой код забудьте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 11:50 |
|
||
|
Одноименные Переменные
|
|||
|---|---|---|---|
|
#18+
AlexKBМой пример примитивен, поэтому его обсуждать не следует. Проблема действительно была, была она при использовании технологии SMWrap. Приложение содержало ряд таймеров, которые в своих обработчиках (очень кратких) использовали переменные с одним именем. Вот тут и наступала путаница. New не помогло (было с самого начала). Пришлось имена переменных ставить свои. Конечно бы не помогло, процесс-то один. :) AlexKB А мой код забудьте. Не могу, тайна пропавшей 1-цы меня терзает. Может все-таки посвятите? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 12:27 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=34485237&tid=1559359]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 266ms |
| total: | 399ms |

| 0 / 0 |
