2009-11-04 3 views
0

오버 플로우 될 때 C 라운드가 수행하는 것과 비슷한 방식으로 "랩 어라운드 (wrap round)"하는 ILE RPG에서 숫자 유형을 찾고 있습니다. 그런 것이 있습니까?프로그램을 중단하지 않고 오버 플로우되는 ILE RPG에 숫자 유형이 있습니까?

+0

처음 물었을 때 나는 "당신이 말하는 것은 무엇입니까? * 모든 * 숫자 유형이 랩 어라운드"라고 말했을 것입니다. 열쇠는 표현식이 아닌 연산 코드를 사용하는 것입니다 (Steve의 대답에 대한 저의 의견을보십시오). –

답변

3

RPG는 그렇게 할 수 없습니다. 내가 제안 할 수있는 최상의 솔루션은 수학을 수행하고 오버플로를 처리하는 프로 시저를 만드는 것입니다. RPG에는 TRUNCNBR 컴파일 옵션 및 제어 스펙 키워드가 있지만 특정 시나리오에서만 적용 가능합니다.

간단한 카운터를하고 있다면

,이 같은 숫자 필드를 중복과 데이터 구조를 만들 수 있습니다

DCounterDS  DS       
D Counter     5  8 0  
D CountOverflow   1  4 0  
D WholeCounter   1  8 0 INZ(0) 

은 그럼 당신은 WholeCounter에 추가 한 후 제로 아웃 직후 CountOverflow. 이 예제에서 Counter는 4 자리 숫자입니다. 정수 필드를 사용하여 동일한 작업을 수행 할 수 있지만 서명하지 않은 상태로 유지하는 것이 좋습니다.

DCounterDS  DS       
D Counter     5  8U 0  
D CountOverflow   1  4U 0  
D WholeCounter   1  8U 0 INZ(0) 

다시 한 번 가장 잘 수행됩니다.

2

또는 오버 플로우가 발생하면 오류 코드를 모니터 할 수는 :

D Counter   S    10I 0 

    /FREE 
    Monitor; 
     Counter += 1; 
    On-Error 103; 
     Clear Counter; 
    EndMon; 
    /END-FREE 
3

당신은 고정 된 형식으로 수학 연산 (이하, 멀티 포트를 추가를 DIV)를 사용할 수 있습니다. 오버플로에 도달하면 잘라 버릴 것입니다. 번거 롭지만 작동합니다.

0001.00 D Fld1   s    3 0           
0001.01 D                    
0002.00 C  999   add  3    Fld1        
0003.00 /free                   
0004.00 dsply ('The current value '+%editc(Fld1:'X'));        
0005.00 *inlr=*on;                 
0006.00 return;        

디스플레이 프로그램 메시지

작업 912834/SPRICE/DP88LT는 메시지 큐 SPRICE가 다른 작업에 할당 QINTER 서브 시스템에 15시 39분 15초에서 01/11/11에 시작했다.
DSPLY 현재 값 002

+0

나는 이것이 정말로 정말로 늦은 것을 알아 차리고 있다는 것을 안다. 그러나 이것이 처음에 제안되지 않은 이유가 확실하지 않다. 예, 구식 opcode는 "ILE RPG"가 아니지만 * 모든 * RPG 컴파일러는 여전히이를 수용합니다. 그리고 포장 동작을 얻는 것은 완전히 직접적인 방법입니다. 나는 그것이 실제로 성가신 것이라고 반대한다. –

+0

좋은 지적입니다, 스티브. 나는 단지 ILE에서 길을 잃었고 내가 가지고 오게되었던 오래되었던 학교 재료의 약간을 잊는다라고 생각한다. –

관련 문제