Как вы определяете глобальную переменную в программе rpg, к которой можно получить доступ в вызывающих функциях

РПГ на AS400

Это способ определить глобальную переменную, к которой могут обращаться функции внутри моей основной функции?

Например, у меня есть основная программа RPG (назовем ее «MAIN_PROGRAM», внутри нее я вызываю другую программу RPG (назовем ее SUB_PROGRAM). Теперь я хочу определить строковую переменную «ABC» в моей MAIN_PROGRAM, а затем при вызове моей SUB_PROGRAM используйте переменную внутри моей SUB_PROGRAM.

Причина, по которой я не хочу отправлять его в SUB_PROGRAM в качестве входного параметра, заключается в том, что моя MAIN_PROGRAM скомпилирована с помощью генератора (CA-PLEX)... и это дает мне ограничение на размер строки 60 000. Я получил способ обойти это, но не могу передать его в SUB_PROGRAM, потому что PLEX обрежет его на 60 000 символов.

Что я хотел бы сделать, так это создать глобальную переменную, на которую может ссылаться SUB_PROGRAM.

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


person Renier    schedule 18.08.2016    source источник
comment
Ваша основная программа может создать объект *USRSPC и получить указатель на него с помощью QUSPTRUS API. Затем добавьте свою переменную BASED() к этому указателю. Подпрограмма также вызывает API и имеет объявление переменной BASED(). Тогда две программы будут ссылаться на одни и те же значения.   -  person user2338816    schedule 25.08.2016


Ответы (2)


Между двумя программами? Нет.

Между двумя модулями, связанными с одним и тем же объектом *PGM (или *SRVPGM), вы можете использовать ключевые слова EXPORT и IMPORT в переменной d-spec.

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

Какую версию Plex вы используете? Я не использовал его с 6.1... Я был бы несколько удивлен, если бы текущая версия не поспевала за RPGLE.

Если вы еще этого не сделали, сообщество CA Plex / 2E является отличный ресурс для помощи.

person Charles    schedule 18.08.2016
comment
Привет, я использую Plex 6.1, спасибо, я посмотрю на ключевые слова экспорта и импорта, я также разместил сообщение на форуме ca. - person Renier; 19.08.2016

Вы можете экспортировать переменную из сервисной программы и привязать обе программы к сервисной программе. Вы бы импортировали переменную в программы. Пока программы находятся в одной и той же группе активации, а служебная программа имеет имя *CALLER или находится в группе активации с одним и тем же именем, переменные импорта в обеих программах будут обращаться к одной и той же экспортируемой переменной в служебной программе.

Вы должны быть очень осторожны, чтобы определить все переменные IMPORT и EXPORT одинаково. Способ сделать это — определить переменную в файле /copy следующим образом:

dcl-s shared_variable varchar(1000000)
     /if defined(do_export)
         export
     /else
         import
     /endif
   ;

Источник модуля srvpgm:

ctl-opt nomain;
/define do_export
/copy copyfile

Источник программ:

/copy copyfile
shared_variable = 'abcde';
if shared_variabe = '12345';
   ...

Другой подход состоит в том, чтобы определить переменную в сервисной программе без ключевого слова EXPORT и использовать процедуры для получения и установки значения. Это кажется более сложным, чем использование ИМПОРТ/ЭКСПОРТ, но может быть проще в долгосрочной перспективе, поскольку может быть сложно отладить проблемы, вызванные общим использованием переменных с помощью ИМПОРТ/ЭКСПОРТ. Например, если вы не хотите, чтобы переменная использовалась до того, как ей было явно присвоено значение, ваша процедура "get" может справиться с этим.

Копировать файл:

dcl-s shared_variable_t varchar(1000000);
dcl-pr set_shared_variable;
    val like(shared_variable_t) const;
end-pr;
dcl-pr get_shared_variable like(shared_variable_t) end-pr;

Источник модуля srvpgm:

ctl-opt nomain;
/copy copyfile
dcl-s g_shared_variable like(shared_variable_t);
dcl-proc set_shared_variable export;
   dcl-pi *n;
       val like(shared_variable_t) const;
   end-pi;
   g_shared_variable = val;
end-proc;

Источник программ:

/copy copyfile
set_shared_variable ('abcde');
if get_shared_variable () = '12345';
     ...
person Barbara Morris    schedule 18.08.2016