如何将数组数据结构作为参数传递?

时间:2017-01-25 18:18:07

标签: ibm-midrange rpgle rpg

我试图将数组DS作为参数传递但是在编译时我得到了一个" RNF5343数组有太多的省略索引"错误。

阵列数据结构在两个程序中的定义与

相同
D ResponseData    DS                  Dim(100) Qualified
D  Field1                        3  0
D  Field2                       26  
    ...
D  Field45                      26  

被叫程序的简单定义" PGM1"

D PGM1            PI
D  ReceiveVar                         LikeDS(ResponseData) Dim(100)
D  ReceiveCount                 10U 0 Const

D PGM1            PR
D  ReceiveVar                         LikeDS(ResponseData) Dim(100)
D  ReceiveCount                 10U 0 Const

...
Multiple row fetch using embedded SQL into RecieveVar
...

调用程序的简单定义" PGM2"

D PGM2            PR                  ExtPgm('PGM1')
D  ReceiveVar                         LikeDS(ResponseData) Dim(100)
D  ReceiveCount                 10U 0 Const

PGM1(RecieveVar: RecieveCount);

编译调用程序" PGM2" RNF5343阵列发生了太多的省略索引。我不想只传递一个数组实例,而是整个事情。

如何才能将数组数据结构作为参数传递给两个程序?

2 个答案:

答案 0 :(得分:2)

如果您确实在PGM1中定义了PGM1原型,并在PGM2中定义了PGM1原型,那么我建议您将带有EXTPGM关键字的原型移动到复制文件中,并将其复制到PGM1和PGM2中。具有两个单独的原型会使编译器无法确保正确传递参数。在程序本身更改原型并且忘记更改调用者中的所有原型是太容易了。

答案 1 :(得分:0)

我认为您的示例中有一些拼写错误......可能在您的实际代码中。

以下(PGM2)编译好我:

 H option(*nodebugio) debug(*INPUT) cvtopt(*datetime)

 D ResponseData    DS                  Dim(100) Qualified
 D  Field1                        3  0
 D  Field2                       26
 D  Field45                      26

 D PGM1            PR                  ExtPgm('PGM1')
 D  ReceiveVar                         LikeDS(ResponseData) Dim(100)
 D  ReceiveCount                 10U 0 Const

  /FREE

   pgm1(ResponseData:10);

   *INLR=*ON;
   return;
  /END-FREE        

虽然我建议使用TEMPLATE关键字

 H option(*nodebugio) debug(*INPUT) cvtopt(*datetime)

 D ResponseData_t  DS                  template
 D  Field1                        3  0
 D  Field2                       26
 D  Field45                      26

 d myData          ds                  likeds(ResponseData_t) dim(100)

 D PGM1            PR                  ExtPgm('PGM1')
 D  ReceiveVar                         LikeDS(ResponseData_t) Dim(100)
 D  ReceiveCount                 10U 0 Const

  /FREE

   pgm1(myData:10);

   *INLR=*ON;
   return;
  /END-FREE