Зубчатый массив PL1 (PL/I)

Мне нужен зубчатый динамический массив в PL/I, но я не знаю, как это реализовать. Нужно что-то вроде:

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

Как мне это сделать?

2 ответа

Решение

Я решил эту проблему так, как сказал 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; 

Звездочка в объявлении массива используется только в подпрограмме и указывает, что измерения массива будут взяты из метаданных массива, переданных в аргументе.

Для управления размером массива, выделенного через 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 " Контролируемое хранилище и атрибут" или стр. 260 (настоящая стр. 296) текущего документа PDF.

Другие вопросы по тегам