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

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

Спасибо.
...
Рейтинг: 0 / 0
02.11.2010, 11:53
    #36933252
aergfadfga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DO комманда с передачей параметров.
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
02.11.2010, 12:10
    #36933314
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DO комманда с передачей параметров.
исходил из предположения, что программы - те же глобалыЭто не совсем точно (учите матчасть :). Максимальная длина строки программы - 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
02.11.2010, 13:14
    #36933503
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DO комманда с передачей параметров.
Valeriu,

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

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

На сайте 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
09.11.2010, 12:55
    #36944610
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DO комманда с передачей параметров.
Read head:tim

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

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

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

3. После выхода из xecute его уровень стека утрачивается, и то что было new тоже.
...
Рейтинг: 0 / 0
09.11.2010, 13:12
    #36944666
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DO комманда с передачей параметров.
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
09.11.2010, 13:22
    #36944713
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DO комманда с передачей параметров.
R read:tim e zt "timer"

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

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


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