Data structures 转换为固定位置的完全自由格式数据结构

Data structures 转换为固定位置的完全自由格式数据结构,data-structures,ibm-midrange,rpgle,Data Structures,Ibm Midrange,Rpgle,我正在将程序转换为完全自由格式,但不知道如何用固定位置替换数据结构。我在网上也找不到好的例子 我有如下两种数据结构。 我试过了 及 这是我试图转换的部分 //************************************************************************* // NORMAL DATA STRUCTURES * //**************

我正在将程序转换为完全自由格式,但不知道如何用固定位置替换数据结构。我在网上也找不到好的例子

我有如下两种数据结构。 我试过了

这是我试图转换的部分

 //*************************************************************************
  // NORMAL DATA STRUCTURES                                                 *
  //*************************************************************************
 D                 DS
 D  BL                     1     84
 D                                     DIM(12)                              BARCODE LABEL
 D  BL01                   1      7
 D  BL02                   8     14
 D  BL03                  15     21
 D  BL04                  22     28
 D  BL05                  29     35
 D  BL06                  36     42
 D  BL07                  43     49
 D  BL08                  50     56
 D  BL09                  57     63
 D  BL10                  64     70
 D  BL11                  71     77
 D  BL12                  78     84
 D                 DS
 D  TL                     1     72
 D                                     DIM(12)                              TEXT LABEL
 D  TL01                   1      6
 D  TL02                   7     12
 D  TL03                  13     18
 D  TL04                  19     24
 D  TL05                  25     30
 D  TL06                  31     36
 D  TL07                  37     42
 D  TL08                  43     48
 D  TL09                  49     54
 D  TL10                  55     60
 D  TL11                  61     66
 D  TL12                  67     72            

提前感谢编辑:不要在此处使用第一个选项。将答案保留在这里,因为当选项不正确时,最好注意一下

你有两个选择。您可以使用
pos
overlay
<代码>覆盖相对于另一个字段的位置,而
位置
是绝对位置

dcl-ds *n;
    bl char(7) dim(12);
    bl01 char(7) overlay(bl);
    bl02 char(7) overlay(bl:*next);
    bl03 char(7) overlay(bl:*next);
    bl04 char(7) overlay(bl:*next);
    bl05 char(7) overlay(bl:*next);
    bl06 char(7) overlay(bl:*next);
    bl07 char(7) overlay(bl:*next);
    bl08 char(7) overlay(bl:*next);
    bl09 char(7) overlay(bl:*next);
    bl10 char(7) overlay(bl:*next);
    bl11 char(7) overlay(bl:*next);
    bl12 char(7) overlay(bl:*next);
end-ds;
另一种选择:

dcl-ds *n;
    bl char(7) dim(12) pos(1);
    bl01 char(7) pos(1);
    bl02 char(7) pos(8);
    bl03 char(7) pos(15);
    ...
end-ds;

如果最后对数组进行编码,则不必硬编码所有其他子字段的位置

dcl-ds *n;                             
    bl01 char(7);                      
    bl02 char(7);                      
    bl03 char(7);  
    ...                 
    bl char(7) dim(12) pos(1);  
end-ds;
您还可以使用SAMEPOS(bl01)定义从与bl01相同的位置开始的阵列。我喜欢这样编码,因为它使BL01和BL之间的关系更加清晰。如果BL01不是数据结构中的第一个子字段,那么使用SAMEPOS将是对子字段进行编码的最佳方式

dcl-ds *n;                             
    bl01 char(7);                      
    bl02 char(7);                      
    bl03 char(7);  
    ...                 
    bl char(7) dim(12) samepos(bl01);  
end-ds;

虽然这些是直接转换,但我强烈建议命名数据结构,而不是通过
*n
将其保留为未命名。第一个选项不正确。当子字段(bl01、bl02等)覆盖数组(bl)时,它们也将成为数组。bl02的定义将出现错误,因为它将bl02数组从7字符bl数组的第8位开始。@Barbara Morris谢谢。我没有意识到这一点。我尽量避免在可能的情况下使用覆盖。它通常只有在旧的固定格式代码和糟糕的现代实践进行转换时才会出现。是否有正确的格式可以使用,或者我应该从答案中删除该选项?@Player1st,您可以添加一个未命名的项目,比如bl_info,然后定义所有bl01等以覆盖bl_info而不是bl,然后定义bl last,覆盖(bl_info:1)。最后定义bl数组很重要,因为*next表示“覆盖此对象的所有其他对象之后的下一个”,而不是“覆盖此对象之前定义的对象之后的下一个”。一般来说,覆盖数组非常有用。如果你有一个数组信息DIM(100),你有字段NAME,ADDR,ID叠加信息,那么当你对NAME,ADDR或ID数组排序时,整个信息数组被排序在一起。因此叠加数组基本上充当叠加数组的键。这是一个很酷的功能,但与将数组覆盖在一组类似字段上的问题无关。
dcl-ds *n;                             
    bl01 char(7);                      
    bl02 char(7);                      
    bl03 char(7);  
    ...                 
    bl char(7) dim(12) pos(1);  
end-ds;
dcl-ds *n;                             
    bl01 char(7);                      
    bl02 char(7);                      
    bl03 char(7);  
    ...                 
    bl char(7) dim(12) samepos(bl01);  
end-ds;