RPGLE 子程序中是否不允许使用静态动态数组

Is Static Dynamic Array not allowed in RPGLE sub-procedure

如果我尝试在 RPGLE 子过程中声明静态动态数组,SEQ 会抛出 RNF3772 错误。子程序中不允许静态动态数组吗?

下面是我在 SEQ 中输入的示例。我得到的错误是 "The keyword is not allowed following keyword STATIC; keyword is ignored."

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

P                 E                                                    

static 表示内存在调用之间保留(分配)在本地
based表示本地没有分配内存

所以是的,两者是互斥的...

除非你自己是 %alloc() 内存,否则 RPG 中没有动态数组......我认为即使是 7.4 中的新 "dynamic arrays" 实际上也只是分配最大内存。好的是他们会跟踪自动使用了多少元素。

edit2 正如芭芭拉所说,如果你自己做 %Alloc()/%Realloc(),那么你所需要的只是声明的基指针 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                                                    

只需使用静态。与使用全局变量相同的内存要求,但隐藏在过程中。

如果你真的想要动态数组,你可以在 *SRVPGM 中构建你自己的例程来使用。或者您可以使用一些开源软件。
RPG Next Gen - Vector
RPG Array List/Linked List
RPGMap
Dynamic Array using a user space

对于实际的动态数组,您可能会在过程中得到一个指针(或者可能是一个整数)变量,您希望将其定义为 STATIC 以便它在调用之间保留。

您还需要考虑完成后如何清理内存。

要将您的数组定义为基础数组,但要在调用之间保留其值,您必须将基础指针 定义为静态。除非回收激活组,否则可能无法释放分配的存储空间,除非您的过程有办法知道将来的调用不再需要该数组。