2016-09-01 3 views
2

Я совершенно новый в ILE RPG. Сегодня я начал работать над книгой из своей работы. В одной из разделов приведены некоторые примеры использования подстрочной функции %SUBSTR. Вот код:Программа ILE RPG не будет компилироваться

DMOD    S    5 INZ('VWXYZ')      
DCON    S    5 INZ('abcde')      
DLENGTH   S    5 0 INZ(2)       
DSTART1   S    5 0 INZ(3)       
DSTART2   S    5 0 INZ(4)       
D*                  
C  mod   DSPLY            
C  con   DSPLY            
C  start1  DSPLY            
C  start2  DSPLY            
C  length  DSPLY            
C*                  
C     EVAL  %SUBST(mod:3:2) = con      
C*                  
C     EVAL  %SUBST(mod : 3 : 2) = %SUBST(con : 4 : 2) 
C*                  
C     EVAL  %SUBST(mod:start1:length) =    
C        %SUBST(con:start1:length)     
C*                  
C     EVAL  %SUBST(mod:start1-1:length) =    
C        %SUBST(con:start2/2:length+1)    
C*                  
C     MOVE  *ON   *INLR 

При компиляции, есть ненормальное исполнение, что говорит мне, что это неправильный параметр в функции %SUBST. Если быть точным: второй параметр неверен. Я получаю эту ошибку только в последних EVAL.

+0

я получил ошибку ... в ILE RPG нет '/' оператора. Автор просто пропустил. – Radinator

ответ

8

Вы бежите прервал РПГ precision rules ...

Оператора/не целое деления, это числовой и результаты имеют десятичное место.

Вам нужно точно контролировать тип результата вашего выражения:

DMOD    S    5 INZ('VWXYZ')       
DCON    S    5 INZ('abcde')       
DLENGTH   S    5 0 INZ(2)         
DSTART1   S    5 0 INZ(3)         
DSTART2   S    5 0 INZ(4)         
D*                   
C  mod   DSPLY             
C  con   DSPLY             
C  start1  DSPLY             
C  start2  DSPLY             
C  length  DSPLY             
C*                   
C     EVAL  %SUBST(mod:3:2) = con       
C*                   
C     EVAL  %SUBST(mod : 3 : 2) = %SUBST(con : 4 : 2)  
C*                   
C     EVAL  %SUBST(mod:start1:length) =     
C        %SUBST(con:start1:length)      
C*                   
C     EVAL  %SUBST(mod:start1-1:length) =     
C        %SUBST(con:%int(start2/2):length+1)   
C*                   
C     MOVE  *ON   *INLR       
+4

Или вы можете использовать% div (start2: 2), чтобы получить целочисленный результат. –

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