RTNPARM 키워드에 대한 IBM 설명서를 읽은 후에도 어떻게 처리해야하는지 명확하지 않습니다.
누군가 작은 절차 예제를 줄 수 있습니까?RTNPARM 키워드 및 사용 사례의 예
훨씬 빠르다면 IBM이 왜 내재하지 않았을까요?
RTNPARM 키워드에 대한 IBM 설명서를 읽은 후에도 어떻게 처리해야하는지 명확하지 않습니다.
누군가 작은 절차 예제를 줄 수 있습니까?RTNPARM 키워드 및 사용 사례의 예
훨씬 빠르다면 IBM이 왜 내재하지 않았을까요?
RTNPARM이 절차를위한에서 위의 세부 사항 및 예제 더 s는 자주 부분적으로 만 사용되는 매우 긴 문자 값을 반환합니다. 반환 값이 스택에 푸시되고 스택에 64K 문자를 10 바이트 문자로 푸는 데 시간이 오래 걸립니다. 참조로 전달 된 매개 변수는 스택에 포인터 만 놓습니다. RTNPARM 키워드를 사용하면 리턴 값을 참조로 전달 된 매개 변수와 같이 처리합니다. 내부적으로 첫 번째 매개 변수는 참조로 전달 된 반환 값이됩니다. 평소와 같은 방법으로 반환 값을 전달하고 검색하지만, %parms()
을 사용하여 매개 변수의 개수를 얻으려면 매개 변수 번호가 1 씩 증가합니다. IBM은 이것을 처리하기 위해 %parmnum()
을 내장했습니다.
dcl-proc sample;
dcl-pi *n Varchar(65535) RtnParm;
parm1 VarChar(256) const options(*nopass);
end-pi;
dcl-s result Varchar(65535) Inz('');
dcl-s str1 Varchar(256) Inz('');
if %parms() >= %parmnum(parm1);
str1 = parm1;
endif;
// do some stuff
return result;
end-proc;
당신은 "그것을 다뤄야 만하는"것이 아니라, 그것의 아름다움입니다.
D TestProc1 Pr 32000a
D TestProcV7 Pr 32000a RTNPARM
myResults = TestProc1();
myResults = TesProcV7();
절차의 호출은 RTNPARM이 지정되었는지 여부에 관계없이 동일하게 코딩됩니다.
v7에서 추가 된대로 기본값 (즉, 암시 적)이 아닙니다. 또한 반환 값이 16 바이트보다 큰 경우에만 더 빠릅니다.
또한 호출 된 프로 시저에 선택적 parms가 있으면 호출 된 프로 시저 내에서 조금 다르게 처리해야합니다.
을 감안할 때
D MyProc PI LikeDS(myResult)
D Compulsory 20a
D Optional 10a Options(*NoPass)
오래된 방법 :
If %Parms > 1;
DoStuff();
EndIf;
새로운 방법
If %ParmNum(Optional) <= %Parms;
DoStuff();
EndIf;
RTNPARM 암시 할 수없는 또 다른 이유는 그것이 순수 RPG 일이 있다는 것입니다 : 그래서 여기
간단한 예입니다. 프로 시저가 다른 프로그래밍 언어로 작성되었거나 다른 언어에서 호출 된 경우 RTNPARM을 사용할 수 없습니다. 다른 언어는 정상적인 반환 값 메커니즘이 사용되고 있다고 가정하기 때문입니다.
Microsoft 절차 VB/VBA와 비교할 경우 rtnparm이 포함 된 하위 절차는 함수이고 rtnparm이없는 하위 절차는 sub입니다.