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

Какой максимальный размер передаваемых параметров
в вызываемую процедуру типа Do Label^Routine(P1,P2 ... Pn) ?
А если в совокупности, сколько параметров можно передавать и ихний общий размер ?

Спасибо.
...
Рейтинг: 0 / 0
DO комманда с передачей параметров.
    #36933252
aergfadfga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu,

Если нужно решить задачу передачи неопределенного числа параметров - передавайте деревяшку
Do Label^Routine(.p), где p - массив/глобал

А так, кажется вот это (можно проверить, исходил из предположения, что программы - те же глобалы):
http://docs.intersystems.com/cache20101/csp/docbook/DocBook.UI.Page.cls?KEY=GGBL_structure#GGBL_structure_naming

http://docs.intersystems.com/ Determining the Maximum Length of a Subscript
Several factors determine the total number of characters that can appear in a reference to a local or global variable. These include:

* The length of the global name
* The number of subscripts used
* Whether each subscript is a number or a string
* For string subscripts, the character set encoding used

To calculate the size of the reference, use the following guidelines:

1. In the global name: for each character, add 1.
2. In a numeric subscript: for each digit, sign, or decimal point, add 1.
3. In a string subscript: for each character, add 3. (For more information on this, see “A Note on ASCII and Multibyte Characters in Subscript Names.”)
4. For each subscript, add 1.

If the sum of these is greater than 511, the subscript may be too long to use as a reference for a local or global variable.
Important:
The following factors also determine the maximum length of the subscript:

* For numeric subscripts, in both Studio and Caché Terminal, and with both local and global variables, a subscript is limited to 309 digits; larger values result in a <MAXNUMBER> error.
* For string subscripts in Caché Terminal, with local variables, a subscript name is limited to 251 characters; larger values result in a <SUBSCRIPT> error . A global variable subscript name does not have this limit.
...
Рейтинг: 0 / 0
DO комманда с передачей параметров.
    #36933314
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исходил из предположения, что программы - те же глобалыЭто не совсем точно (учите матчасть :). Максимальная длина строки программы - 4096 символов. DO(args,...) - не исключение. Это по памяти, а в документации смог найти вот это:Release Notes по Cache 2007Increased Maximum String Length
In this release, the maximum length of a Caché string has been increased from 32,767 to 3,641,144 characters. This change is transparent to existing applications. However, those applications that are modified to handle larger strings should consider enabling the EnableLongStrings configuration parameter
...
The maximum string size limit applies only to the size of the resulting string. Other size-related limits remain as before. For example, the length of a line of code given to the compiler is still 4096 characters.
...
Рейтинг: 0 / 0
DO комманда с передачей параметров.
    #36933503
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriu,

Переменное количество аргументов

PS: 254 строковых параметра по 32767 символов в каждом передаются нормально (Caché 2010.2 Release ).
...
Рейтинг: 0 / 0
DO комманда с передачей параметров.
    #36944502
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос в эту же тему.
Может ламерский но все таки.

На сайте http://gradvs1.mgateway.com/main/ нашел одну интерестную штуку
M/Ware, которую можно применить для разных случаев.
(например сокет клиент - M/Ware)
Хочу прикрутить к ней функцию Do с передачей параметров.
Каким приемом можно пользоваться для того, чтобы
одни и теже параметры использовать как ByVal , а в другом случае
как ByRef в один вызов Do Label^Routine(P1,P2 ... Pn) ???
По отдельности никаких проблем, все работает.
немного кода:
Код: 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.
do(input)
 n cik,i,data,gloName,gloRef,inputr,len,nb,nsp,ok,subs,x,head
 s tim= 15 ,flag= 0 
 s inputr=$re(input)
 s len=$re($p(inputr," ", 1 ))
 Read head:tim
 s rtn=$p(head,"~", 1 )     ;lab^routine name
 s nprm=$p(head,"~", 2 )    ;nr.parameters
 s lendata=$p(head,"~", 3 ) ;len all Data
 s par1=$p(head,"~", 4 )    ;len par1
 s par2=$p(head,"~", 5 )    ;len par2
 s par3=$p(head,"~", 6 )    ;len par3
 ;
 ;Passing parameters lab^routine(var1,var2,... var10)
 s gtmbuild("record")=rtn_"("
 f i= 2 : 2 :nprm* 2  do
 . s gtmbuild("Input",i)=$$ReadRec(tim)
 . s gtmbuild("record")=gtmbuild("record")_""""_gtmbuild("Input",i)_""""_","
 s $e(gtmbuild("record"),$l(gtmbuild("record")))=")"
 s $zt=$$zt()
 x "New gtmbuild Do"_gtmbuild("record")
 s $zt=""
 ;
 ;Passing parameters lab^routine(.var1,.var2, ... .var10) return records or Array !!!
 s gtmbuild("record")=rtn_"("
 f i= 1 : 2 :nprm* 2  s gtmbuild("record")=gtmbuild("record")_(".Output"_i_",")
 s $e(gtmbuild("record"),$l(gtmbuild("record")))=")"
 s $zt=$$zt()
 x "New gtmbuild Do"_gtmbuild("record")
 f i= 1 : 2 :nprm* 2  Do
 . if $d(@("Output"_i))\ 10 = 0  w @("Output"_i),$c( 13 , 10 )
 . else  f cik= 0 : 1  s array=$q(@("Output"_i_"("_cik_")")) q:array=""  w @array,$c( 13 , 10 )
 s $zt=""
 Quit
 ;

Спасибо.
...
Рейтинг: 0 / 0
DO комманда с передачей параметров.
    #36944610
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Read head:tim

1. А если параметр задержится в сетке дольше чем tim?

x "New gtmbuild Do"_gtmbuild("record")

2. Хорошо бы после Do поставить пробел.

3. После выхода из xecute его уровень стека утрачивается, и то что было new тоже.
...
Рейтинг: 0 / 0
DO комманда с передачей параметров.
    #36944666
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. А если параметр задержится в сетке дольше чем tim
Код: plaintext
1.
2.
3.
4.
5.
6.
ReadRec(tim)
  N len,read
  s $zt=$$zt()
  R read:tim e  zt "timer"
  i read["""" s read=$$replaceAll(read,"""","""""") 
  Q read
 ;

2. Хорошо бы после Do поставить пробел.
Пробел присутствует перед " label^rounine" в пакете от клиента.
...
Рейтинг: 0 / 0
DO комманда с передачей параметров.
    #36944713
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
R read:tim e zt "timer"

В переменную может быть вынута часть байтов из канала а оставшаяся непрочитанной за tim начнет читаться следующей командой read с неопределенного байта.
...
Рейтинг: 0 / 0
DO комманда с передачей параметров.
    #36944784
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, я вижу в M/Ware time вообще не используется ;) ...
убираю.
...
Рейтинг: 0 / 0
DO комманда с передачей параметров.
    #36946260
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пинайте сильно и если можно подскажите свое мнение.
Что неправильно и что можете посоветовать дополнительно ?
Решил так :

Код: 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.
do(input)
 n cik,i,inputr,head,flag,tim
 s tim= 15 ,flag= 0 
 s inputr=$re(input)
 s len=$re($p(inputr," ", 1 ))
 Read head:tim
 s rtn=$p(head,"~", 1 )     ;lab^routine name
 s nprm=$p(head,"~", 2 )    ;nr.parameters
 s lendata=$p(head,"~", 3 ) ;len all Data
 s par1=$p(head,"~", 4 )    ;len par1
 s par2=$p(head,"~", 5 )    ;len par2
 s par3=$p(head,"~", 6 )    ;len par3
 ;Passing parameters lab^routine(.var1,.var2, ... .var10) return records or Array !!!
 s gtmbuild("record")=rtn_"("
 f i= 1 : 2 :nprm* 2  do
 . s gtmbuild("Output",i)=$$ReadRec()
 . s gtmbuild("record")=gtmbuild("record")_(".Output"_i_","),passing="Output"_i S @passing=gtmbuild("Output",i)
 s $e(gtmbuild("record"),$l(gtmbuild("record")))=")"
 s $zt=$$zt()
 x "New gtmbuild Do "_gtmbuild("record")
 ;d @gtmbuild("record")
 f i= 1 : 2 :nprm* 2  Do
 . if $d(@("Output"_i))\ 10 = 0  w @("Output"_i),$c( 13 , 10 )
 . else  f cik= 0 : 1  s array=$q(@("Output"_i_"("_cik_")")) q:array=""  w @array,$c( 13 , 10 )
 s $zt=""
 Quit
 ;
ReadRec()
  N len,read
  s $zt=$$zt()
  R read ;:tim e  zt "timer"
  i read["""" s read=$$replaceAll(read,"""","""""") 
  Q read
 ;

Спасибо.
...
Рейтинг: 0 / 0
DO комманда с передачей параметров.
    #36946332
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriu, может я что-то упустил, но ради чего все эти сложности? Не проще ли свой сокет-сервер написать? Из опыта работы с сокетами:
- чтение только с таймаутом (их обработка меньшее зло, чем зависания);
- если протокол обмена выбираете вы, придерживайтесь форматов вида <длина><пакет>, не полагаясь на терминаторы. Прототип "читалки" такой:
Код: plaintext
1.
 read len# 2 :timeout if '$t {...}
 read packet#len:timeout if '$t {...}
А внутренности пакета разбирайте уже после его прочтения. Это не только моё ИМХО, посмотрите, например, %CDSrv0.INT в Cache $zv<=2008.1 или исходники чего-нибудь подобного для GT.M.
...
Рейтинг: 0 / 0
DO комманда с передачей параметров.
    #36946384
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriu, может я что-то упустил, но ради чего все эти сложности? Не проще ли свой сокет-сервер написать?

Дело в том, что есть у меня свой, но на сайте указанного выше есть это штука M/Ware.
Довольно грамотно и интуитивно написана.
Вижу, что Rob Tweed прикручивает ее с успехом везде !
http://gradvs1.mgateway.com/main/

Rob Tweed Read my latest blog posting on exploiting Node.js and server-side Javascript for the next generation of super-fast, highly scalable GT.M and Caché based Web/Ajax applications.

Она подходит и для меня как API сервер для GT.M, с использованием xnetd сервисом !
Как знаете, ихний GT.M socket не очень стандартен ...
Да и приложений куча с использованием MSM-Activate, где я именно в большинстве пользуюсь
"золотой" m.DO командой и чтобы компатибельность на всякий случай везде (Cache', MSM, GT.M !!!)

;)
...
Рейтинг: 0 / 0
DO комманда с передачей параметров.
    #36946459
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriu, по-видимому, Rob Tweed не использует timeout при чтении, т.к. сетевой обмен у него происходит вне M-системы, а локальное TCP-взаимодействие он считает надежным. Но ИМХО и локально могут случаться всякие неприятности (переполнения буферов, ошибки программиста и т.д.), поэтому я использую read packet#len:timeout _всегда_, даже локально.
Успехов Вам в приручении M/Wire!
...
Рейтинг: 0 / 0
DO комманда с передачей параметров.
    #36946542
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslov
Спасибо . :)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / DO комманда с передачей параметров.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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