0

我需要 PL/I 中的锯齿状动态数组,但我不知道如何实现它。需要类似的东西:

dcl v dim(*,*) fixed bin(31) ctl;
allocate v dim(5,*);             
allocate v(1) dim(10);           
allocate v(2) dim(100);    

我该怎么做?

4

2 回答 2

0

数组声明中的星号仅在子例程中使用,表示数组维度将从参数中传递的数组的元数据中获取。

allocate要控制通过语句分配的数组的大小,请使用变量:

dcl v dim(d1, d2) ctl, 
   d1 fixed bin(31), 
   d2 fixed bin(31); 

 d1 = 5; 
 d2 = 15; 
 alloc v;

这会给你v(5, 15)

您可以将变量用于下限和上限:

dcl w dim(l1:u1, l2:u2) ctl, 
   l1 fixed bin(31), 
   l2 fixed bin(31),
   u1 fixed bin(31), 
   u2 fixed bin(31); 

 get data(l1, u1, l2, u2);
 alloc w;

使用 SYSIN 输入l1=-4; u1=6; l2=15; u2=144;w分配为w(-4:6, 15:144)

对于 IBM PL/I,请参阅V5.1 语言参考手册部分受控存储和属性,或当前 PDF 文档的第 260 页(实际第 296 页)。

于 2017-06-13T15:55:47.050 回答
0

我以 piet.t 所说的方式解决了这个问题。已创建指针数组并为每个指针分配数组。恕我直言,这看起来不太方便。

    mainp:procedure options(main);                                 

    dcl n fixed bin(31);                                           
    dcl pp ptr;                                                    
    dcl 1 pointers based(pp),                                      
          2 length fixed bin(31),                                  
          2 at dim(n refer (length)) ptr;                          

    dcl m fixed bin(31);                                           
    dcl 1 values based,                                            
          2 length fixed bin(31),                                  
          2 at dim(m refer (length)) fixed bin(31);                

    n=2;                                                           
    allocate pointers;                                             
    m=2;                                                           
    allocate values set(pointers.at(1));                           
    m=4;                                                           
    allocate values set(pointers.at(2));                           

    pointers.at(1)->values.at(1)=1;                                
    pointers.at(1)->values.at(2)=2;                                
    pointers.at(2)->values.at(1)=10;                               
    pointers.at(2)->values.at(2)=20;                               
    pointers.at(2)->values.at(3)=30;                               
    pointers.at(2)->values.at(4)=40;                               

    put skip list("Line 1 length: ",pointers.at(1)->values.length);
    put skip list("Line 2 lenght: ",pointers.at(2)->values.length);
    put skip list('');                                             
    put skip list(pointers.at(1)->values.at(1),                    
                  pointers.at(1)->values.at(1));                   

    put skip list(pointers.at(2)->values.at(1),                    
                  pointers.at(2)->values.at(2),                    
                  pointers.at(2)->values.at(3),
              pointers.at(2)->values.at(4));                               
end; 
于 2017-06-19T10:49:46.903 回答