static
означает, что память сохраняется (выделяется) локально между вызовами
based
означает, что память не выделяется локально
Так что, да, эти два взаимоисключающие ...
Если вы сами не используете% allo c () памяти, в RPG нет динамических c массивов ... Я думаю, что даже новые "динамические c массивы" в 7.4 на самом деле просто выделяют максимальное количество памяти. Что приятно, они отслеживают, сколько элементов используется автоматически.
edit2 Как сказала Барбара, если вы делаете% Allo c () /% Reallo c () самостоятельно, то все, что вам нужно, это объявленный базисный указатель static
Я бы включил парм, чтобы указать, что память должна быть очищена.
P proc1 B
D pi
d cleanUp n value
D myArray s 10 dim(1000) based(myArray_p)
d myArray_p s * static
if cleanUp;
dealloc(myArray_p);
return;
endif;
P E
Просто используйте stati c. Те же требования к памяти, как если бы вы использовали глобальную переменную, но скрытые внутри процедуры.
Если вы действительно хотите динамические c массивы, вы можете создать свои собственные подпрограммы в * SRVPGM для использования. Или вы можете использовать какой-нибудь открытый исходный код.
RPG Next Gen - Vector
RPG Array List / Linked List
RPGMap
Dynami c Массив с использованием пользовательского пространства
С реальным массивом динамического c вы, скорее всего, получите переменную-указатель (или, возможно, целое число) в вашем процедуру, которую вы хотели бы определить как STATIC
, чтобы она оставалась между вызовами.
Вам также нужно будет подумать, как очистить память, когда вы закончите.