Stati c Dynami c Массив не разрешен в подпроцедуре RPGLE - PullRequest
0 голосов
/ 14 апреля 2020

SEQ выдает ошибку RNF3772, если я пытаюсь объявить массив Stati c Dynami c в подпрограмме RPGLE. Массив stati c dynamici c не разрешен в подпроцедуре?

Ниже приведен пример того, что я ввел в SEQ. Полученная ошибка: «Ключевое слово не разрешено после ключевого слова STATIC; ключевое слово игнорируется».

P proc1           B                                                    
D                 pi                                                   
D myArray         s             10    dim(1000) static based(myArray_p)

P                 E                                                    

Ответы [ 2 ]

4 голосов
/ 15 апреля 2020

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, чтобы она оставалась между вызовами.

Вам также нужно будет подумать, как очистить память, когда вы закончите.

1 голос
/ 15 апреля 2020

Чтобы определить ваш массив как основанный, но сохранить его значения между вызовами, вы должны определить базовый указатель как stati c. Вероятно, будет невозможно освободить выделенное хранилище, кроме как путем восстановления группы активации, если только ваша процедура не знает, что массив больше не нужен для будущих вызовов.

...