2017-03-24 12 views
0

RTNPARM 키워드에 대한 IBM 설명서를 읽은 후에도 어떻게 처리해야하는지 명확하지 않습니다.
누군가 작은 절차 예제를 줄 수 있습니까?RTNPARM 키워드 및 사용 사례의 예

훨씬 빠르다면 IBM이 왜 내재하지 않았을까요?

답변

1

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; 
1

당신은 "그것을 다뤄야 만하는"것이 아니라, 그것의 아름다움입니다.

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; 

Large Subprocedure Return Values: V7 Brings Relief

1

RTNPARM 암시 할 수없는 또 다른 이유는 그것이 순수 RPG 일이 있다는 것입니다 : 그래서 여기

간단한 예입니다. 프로 시저가 다른 프로그래밍 언어로 작성되었거나 다른 언어에서 호출 된 경우 RTNPARM을 사용할 수 없습니다. 다른 언어는 정상적인 반환 값 메커니즘이 사용되고 있다고 가정하기 때문입니다.

0

Microsoft 절차 VB/VBA와 비교할 경우 rtnparm이 포함 된 하위 절차는 함수이고 rtnparm이없는 하위 절차는 sub입니다.