2015-01-20 2 views
1

В программеВозвращается ли вся ссылка?

EXEC CICS LINK 
    PROGRAM(PGMB) 
    COMMAREA(COMMA) 
    LENGTH(LENGTH OF COMMA) 
    RESP(CICS-RESP) 
END-EXEC 

В программе б

EXEC CICS RETURN 
END-EXEC 

программа Имеет ли б только вернуть COMMAREA ту программу сдавший? Или он возвращает всю LINKAGE SECTION?

ответ

4

Программа B не возвращает ни всей LINKAGE SECTION, ни commarea (COMMA в вашем примере).

Он ничего не возвращает.

Почему он ничего не возвращает? Потому что ему ничего не передается.

Или, скорее, то, что передается ему, - это просто адрес (ы) параметра (ов). Ничего больше. Вот и все. Важно отметить, что нет длины.

PROGA

01 some-stuff. 
    05 a-bit-of-stuff PIC X. 
    05 the-rest-of-the-stuff PIC X(99). 

CALL .... USING a-bit-of-stuff 

PROGB

LINKAGE SECTION. 

01 stuff-that-is-somewhere-else PIC X(100). 
PROCEDURE DIVISION USING stuff-that-is-somewhere-else. 

а-бит из-материал определяют как только один байт. Это не имеет значения. Это определение в разделе LINKAGE РАЗДЕЛ пункта по ПРОГРАММНОМУ ОТДЕЛЕНИЮ ИСПОЛЬЗОВАНИЯ ... которое соответствует, в порядке ссылки, ничто иное, к CALL ... ИСПОЛЬЗОВАНИЕ ...

PROGB будет " прошел «адрес бит-материала». Если этот адрес затем сопоставляется с 100 байтами в LINKAGE SECTION программы CALLed, COBOL вообще не возражает.

Если мы заменим этот пример CALL на использование некоторого материала, поскольку у некоторого материала есть тот же самый начальный адрес, что и бит-бит, в сгенерированном коде абсолютно не будет изменений, и никаких изменений в выполнение двух программ.

Определение различных размеров данных «между« CALLer »и« CALLed »обычно не выполняется, потому что это делает вещи менее понятными для нас, людей. Компилятор не заботится ни о чем.

Что вам нужно, чтобы посмотреть на 01s (или 77s, если эта глупая идея примет ваше воображение), так как это ОТКЛЮЧЕНИЕ. Они являются НЕОБХОДИМЫМИ, НЕПОСРЕДСТВЕННЫМИ, данные, которые определены где-то в другом месте. Данные не определены для элементов в разделе LINKAGE SECTION (есть один исключение из этого на Mainframe). Уровни 01 в LINKAGE SECTION просто переопределяют или сопоставляют адрес данных, передаваемых программе. Данные не «оставляют» программу CALLing, и данные никогда не «возвращаются».

Вещи могут ошибочны, конечно, если вы используете разные длины для соответствия товарам в ИСПОЛЬЗОВАНИИ. Если хранилище из CALLer «приобретено» (например, GETMAIN в CICS), то попытка связать данные за пределами этого хранилища, даже один байт дальше, может заставить вас отказаться из-за исключения адресации (S0C4, который CICS будет любезно назовите что-нибудь еще для вас, AKEA).

Даже без приобретенного хранилища другие поля после «пройденного» могут быть случайно повреждены или само поле не может получить ожидаемое количество данных, переданных ему программой CALLed, если это определение коротко в CALLed программа.

На самом деле есть две вещи, которые «возвращаются» из программы CALLed. Это особый регистр RETURN-CODE и единственный элемент в ВОЗВРАЩЕНИИ ПРОЦЕДУРНОГО ОТДЕЛЕНИЯ (если используется, скорее всего, нет).

Несмотря на это, механизмы того, как они достигнуты, отличаются от нормального непонимания данных, «прошедших» между программами CALL и CALLed.

2

У меня не было радости программирования CICS в какой-то момент, этот ответ основан на том, что я до сих пор помню.

Вызывающая программа получает не более чем объем данных, меньший или равный размеру области данных, отправленной в вызывающей программе (или, как указано дополнительным параметром LENGTH). Не пытайтесь получить доступ к данным за пределами того, что вы отправили.

«Итак, если программа x LINKS для программирования y, любые обновления, сделанные для COMMAREA по y, будут видны в x». Источник: SOVF:How CICS Shared Memory Works.

«Когда область связи передается посредством команды EXEC CICS LINK, вызываемая программа передает указатель на саму коммуникационную область. Любые изменения, внесенные в содержимое области данных в вызываемой программе, доступный для вызывающей программы, когда управление возвращается к ней, для доступа к любым таким изменениям программа называет область данных, указанную в исходном параметре COMMAREA. " Источник: IBM-CICS-Ref.

Так, does program b only return the commarea that program a passed?

я бы ответил выше, как Yes.

Does it return the whole linkage section? 

Что касается этого, это зависит от структуры DFHCOMMAREA связанной программы. Если он содержит только одну такую ​​область, то ответ заключается в том, что он возвращает столько байтов, сколько было отправлено по команде связи из этой области (неявно или явно). Помните, что эта область находится вне вашего звонящего. Таким образом, если вызывающий абонент отправляет 100 байт, а секция связи имеет площадь 500 байт, вы получаете максимум 100.

+0

Помимо двух кавычек, вам нужно немного поработать над этим. –

0

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

Exec CICS 
    Return 
End-Exec 

выставит изменения в COMMAREA к программе Linking, но только случайно и только тогда, когда обе задачи выполняются на одной и той же CICS области. Это связано с тем, что на самом деле commarea является указателем. В распределенной программной ссылке область копируется, но не копируется обратно.

+0

Доу, ты прав, я запутываю свои инструменты. Извини за это. –

 Смежные вопросы

  • Нет связанных вопросов^_^