CL程序中的堆栈实现(OS400 / iSeries)

时间:2013-03-24 10:48:35

标签: ibm-midrange control-language

我正在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顺序到达元素,我不知道结构最终将包含多少元素。

3 个答案:

答案 0 :(得分: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查看运行中的代码结果。试试吧,如果您还有问题,请发布您的代码并询问有关该代码的具体问题。编程是关于编写代码,所以跳进去试试! : - )

答案 1 :(得分: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                                                          

当然没有溢出控制或其他什么,但它给你的想法:)

答案 2 :(得分:0)

创建* LIFO数据队列。发送到队列的条目可以以后进先出顺序接收。