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 个字节,因为每个数组元素/堆栈元素是 10 个字节(DCL 和 ELEM)。这个特定的堆栈包含 5 个条目 - 5 乘以 10 = 50 (DCL & ARRAY)。加 10 字节为 PUSH,减 10 字节为 POP。当前的 &PTR 是最近的堆栈条目。

您的下一步应该是为大纲中的每个主要操作编写一个子例程。从推开始。如果您不熟悉 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 回答