2013-03-24 1 views
2

IBM 시스템 i에서 CL을 사용하여 프로그래밍을 시작합니다. 내 임무는 CL 언어를 사용하여 RPN 계산기를 구현하는 것이다. 일반적으로이 계산기는 스택을 사용합니다. 그러나 나는 그것을 CL로 구현할 필요가 없다. 누군가 조언을 해줄 수 있습니까? 어쩌면 * PTR 변수는 해결책이지만, 누군가 그것을 사용하는 방법을 보여 줄 수 있습니까? 사전에CL 프로그램 (OS400/iSeries)에서 스택 구현

감사 JS

편집 :

CL 언어가 내 교사에 의해 부과됩니다.

내 프로그램에는 사용자의 기호 (숫자/숫자, 수학 연산의 부호)가 있어야합니다.
의사 코드에 따라, 수신 된 것을 analize 다음 몇 가지 조치를 취해야합니다 각각의 기호 프로그램을받은 후 :

Do when new sign was entered: 
if: entered sign is a number 
    then push it into stack 
else if: entered sign is a sign of mathematical operation 
    then 
    - pop two elements from stack 
    - make operation using this elements and entered sign 
    - push result into stack 

내 문제는 구현하거나이 스택을 substitude하는 방법입니다. LIFO 순서로 요소에 도달해야하며 구조에 최종적으로 포함될 요소의 수를 알지 못합니다.

답변

2

CL이이 작업에 적합하지 않음을 이해하십시오. 다음은 테스트되지 않았습니다.

DCL &ARRAY *CHAR 50 
DCL &PTR *PTR ADDRESS(&ARRAY) 
DCL &ELEM *CHAR 10 STG(*BASED) BASPTR(&PTR) 
DCL &i *DEC (9 0) 
... 
/* Loop through the array */ 
DOFOR VAR(&i) FROM(1) TO(5) BY(1) 
    CHGVAR %OFFSET(&PTR) (%OFFSET(&PTR) + 10) 
    /* &ELEM is the current array element */ 
ENDDO 

일부 코드를 게시하십시오. 너 뭐하려고 했니? 코드를 게시 할 수 없으면 의사 코드를 게시하고 코드에서 수행 할 내용을 설명하십시오.

편집 : 위의 코드 조각은 배열을 구현합니다. 이는 스택과 매우 유사합니다. LIFO는 최신 배열 색인을 추적하는 것만 큼 쉽습니다. 위의 스 니펫에서 CHGVAR은 포인터에 10 바이트를 추가합니다. 각 배열 요소/스택 요소는 10 바이트이기 때문에 10 바이트입니다 (DCL & ELEM). 이 특정 스택에는 5 개의 항목이 있습니다. 5 번 10 = 50 (DCL & ARRAY)입니다. 10 바이트를 더하면 PUSH가되고 10 바이트를 빼면 POP가됩니다. 현재 & PTR이 가장 최근의 스택 항목입니다.

다음 단계는 개요의 각 주요 작업에 대해 하나의 서브 루틴을 작성하는 것입니다. PUSH로 시작하십시오. IBM i의 디버거에 익숙하지 않은 경우 DMPCLPGM을 사용하여 작동중인 코드의 결과를 확인하십시오. 시도해보고 질문이있는 경우 코드를 게시하고 해당 코드에 대한 특정 질문을하십시오. 프로그래밍은 코드를 작성하는 것이므로 뛰어 들어가서 시도하십시오! :-)

+0

첫 번째 게시물에 세부 정보를 추가했습니다. – user2204293

+0

벅, 고마워요! 포인터가있는 짧은 코드는 내가 필요한 것입니다.이제 모든 프로그램에 대한 아이디어를 가지고 있습니다 :) 새로운 prbolems의 경우에 나는 쓸 것입니다. – user2204293

1

내가 아는 한, 가정교사는 스택이 크기가 4 엔티티 (10 개는 잔인 함) 여야한다고 말했다. 우리가 같은 가정교사 (pwr?)에 대해 말하지 않는 한. 답변 벅에 대한

덕분에, 나는 포인터가 당신에게 :)

나는이 특정 문제에 대한 스택을 구현하는 방법 덕분에 작동 방법을 이해하는 관리입니다 : 물론

PGM                 
DCL  VAR(&STACK) TYPE(*CHAR) LEN(20)       
DCL  VAR(&STACKPTR) TYPE(*PTR) ADDRESS(&STACK)     
DCL  VAR(&STACKVAL) TYPE(*CHAR) STG(*BASED) BASPTR(&STACKPTR) LEN(5)             

/* ----------------------------------------------------- */ 
/* code that uses PUSH and POP subroutines when required */ 
/* ----------------------------------------------------- */ 

SUBR  SUBR(PUSH)                
    CHGVAR  VAR(&STACKVAL) VALUE(&WYRAZENIE)     
    CHGVAR  VAR(%OFFSET(&STACKPTR)) VALUE(%OFFSET(&STACKPTR)+5) 
ENDSUBR               
SUBR  SUBR(POP)            
    CHGVAR  VAR(%OFFSET(&STACKPTR)) VALUE(%OFFSET(&STACKPTR)-5)    
ENDSUBR               
ENDPGM               

는 오버 플로우가 없다 컨트롤이나 뭐든간에, 그것은 당신에게 아이디어를 제공합니다 :)

+0

잘 했어! 시작하기는 때로는 가장 어려운 부분입니다. :-) –

0

* LIFO 데이터 큐를 만듭니다. 대기열로 보낸 항목은 선입 선출 순서로 수신 할 수 있습니다.