2017-01-25 1 views
0

Я пытаюсь передать массив DS в качестве параметра, но при компиляции я получаю ошибку «RNF5343 Array с слишком большим количеством опущенных индексов».Как передать структуру данных массива в качестве параметра?

Структура массива данных определяется одинаковой в обеих программах, как

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 слишком много пропущенных индексы. Я не хочу передавать только один экземпляр массива, но все это.

Что мне делать, чтобы передавать структуру данных массива в качестве параметра между двумя программами?

ответ

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   

Хотя я бы порекомендовал сделать использование ключевого слова ШАБЛОН

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  
1

Если у вас действительно есть прототип PGM1, определенный в PGM1 и другое определение прототипа PGM1 в PGM2, тогда я рекомендую вам переместить прототип с ключевым словом EXTPGM в файл копии и скопировать его в PGM1 и PGM2. Наличие двух отдельных прототипов поражает способность компилятора гарантировать правильность передачи параметров. Слишком легко изменить прототип самой программы и забыть изменить все прототипы в вызывающих.

Смежные вопросы