오버 플로우 될 때 C 라운드가 수행하는 것과 비슷한 방식으로 "랩 어라운드 (wrap round)"하는 ILE RPG에서 숫자 유형을 찾고 있습니다. 그런 것이 있습니까?프로그램을 중단하지 않고 오버 플로우되는 ILE RPG에 숫자 유형이 있습니까?
답변
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)
다시 한 번 가장 잘 수행됩니다.
또는 오버 플로우가 발생하면 오류 코드를 모니터 할 수는 :
D Counter S 10I 0
/FREE
Monitor;
Counter += 1;
On-Error 103;
Clear Counter;
EndMon;
/END-FREE
당신은 고정 된 형식으로 수학 연산 (이하, 멀티 포트를 추가를 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
나는 이것이 정말로 정말로 늦은 것을 알아 차리고 있다는 것을 안다. 그러나 이것이 처음에 제안되지 않은 이유가 확실하지 않다. 예, 구식 opcode는 "ILE RPG"가 아니지만 * 모든 * RPG 컴파일러는 여전히이를 수용합니다. 그리고 포장 동작을 얻는 것은 완전히 직접적인 방법입니다. 나는 그것이 실제로 성가신 것이라고 반대한다. –
좋은 지적입니다, 스티브. 나는 단지 ILE에서 길을 잃었고 내가 가지고 오게되었던 오래되었던 학교 재료의 약간을 잊는다라고 생각한다. –
처음 물었을 때 나는 "당신이 말하는 것은 무엇입니까? * 모든 * 숫자 유형이 랩 어라운드"라고 말했을 것입니다. 열쇠는 표현식이 아닌 연산 코드를 사용하는 것입니다 (Steve의 대답에 대한 저의 의견을보십시오). –