我需要PL/I中的交错动态数组,但我不知道如何实现它。需要类似的东西:
dcl v dim(*,*) fixed bin(31) ctl;
allocate v dim(5,*);
allocate v(1) dim(10);
allocate v(2) dim(100);
我该怎么做?
声明中的星号仅在子例程中使用,并指示数组维度将取自参数中传递的数组的元数据。
要控制通过 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,请参阅当前 PDF 文档的 V5.1 语言参考手册部分受控存储和属性或第 260 页(实际第 296 页(。
我以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;