2

IBMシステムiでCLを使用してプログラミングを開始しています。私の仕事は、CL言語を使用してRPN計算機を実装することです。通常、この計算機はスタックを使用します。しかし、CLで実装する必要があるとは思いません。誰かが私にアドバイスをくれますか?たぶん*PTR変数は解決策ですが、誰かがそれを使用する方法の例を教えてもらえますか?

よろしくお願いしますJS

編集:

CL言語は私の家庭教師によって課されます。

私のプログラムは、ユーザーから記号(数字/数字、数学演算の記号)を受け取る必要があります。
各サインを受け取った後、プログラムは受け取ったものを分析し、擬似コードに従って何らかのアクションを実行する必要があります。

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

私の問題は、このスタックをどのように実装または置換するかです。LIFOの順序で要素に到達する必要があり、構造に最終的に含まれる要素の数がわかりません。

4

3 に答える 3

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バイト(DCL&ELEM)であるため、10バイトになります。この特定のスタックは、5つのエントリを保持します-5 x 10 = 50(DCL&ARRAY)。10バイトを加算することはPUSHであり、10バイトを減算することはPOPです。現在の&PTRは、最新のスタックエントリです。

次のステップは、アウトラインの主要な操作ごとに1つのサブルーチンを作成することです。PUSHから始めます。IBM iのデバッガーに精通していない場合は、DMPCLPGMを使用して、動作中のコードの結果を確認してください。それを試してみてください。それでも質問がある場合は、コードを投稿して、そのコードについて具体的な質問をしてください。プログラミングはコードを書くことですので、飛び込んで試してみてください!:-)

于 2013-03-24T14:21:58.140 に答える
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                                                          

もちろん、オーバーフロー制御などはありませんが、それはあなたにアイデアを与えます:)

于 2013-03-24T20:30:07.700 に答える
0

*LIFOデータキューを作成します。キューに送信されたエントリは、後入れ先出しの順序で受信できます。

于 2014-04-06T15:02:51.043 に答える