首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CL程序中的堆栈实现(CL 400/iSeries)

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

Stack Overflow用户
提问于 2013-03-24 10:48:34
回答 3查看 1.2K关注 0票数 2

我正在IBM system i上开始使用CL编程,我的任务是用CL语言实现RPN计算器。通常,此计算器使用堆栈。但我不知道必须在CL中实现它。有人能给我一些建议吗?也许*PTR变量是解决方案,但是有人能给我一个例子来说明如何使用它吗?

提前感谢JS

编辑:

CL语言是由我的导师强加的。

我的程序应该接收来自用户的符号(数字/数字,数学运算的符号)。

在收到每个符号程序后,应分析所收到的内容,然后根据伪代码采取一些行动:

代码语言:javascript
复制
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顺序中的元素,我不知道结构最终将包含多少元素。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-24 14:21:58

明白CL不适合这样做。以下是未经检验的:

代码语言:javascript
复制
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个字节是推,减去10个字节是流行的。当前&PTR是最近的堆栈条目。

下一步应该是为大纲中的每个主要操作编写一个子例程。从推开始。如果您不熟悉IBM上的调试器,请使用DMPCLPGM查看正在运行的代码的结果。试一试,如果你还有问题,贴上你的代码,问一个关于这段代码的具体问题。编程是关于编写代码的,所以跳进去试试吧!:-)

票数 2
EN

Stack Overflow用户

发布于 2013-03-24 20:30:07

据我所知,导师说堆栈应该只有4个实体大小(10将是一个过头)。除非我们谈论的不是同一个导师(pwr?)。

谢谢你的回答,巴克,我理解了指针是如何工作的多亏了你:)

针对这个特定问题,我实现堆栈的方式是:

代码语言:javascript
复制
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                                                          

当然没有溢出控制,但是它给了您这样的想法:)

票数 1
EN

Stack Overflow用户

发布于 2014-04-06 15:02:51

创建一个*LIFO数据队列。发送到队列的条目可以按照先入先出的顺序接收.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15597509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档