我正在IBM system 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顺序中的元素,我不知道结构最终将包含多少元素。
发布于 2013-03-24 14:21:58
明白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个字节是推,减去10个字节是流行的。当前&PTR是最近的堆栈条目。
下一步应该是为大纲中的每个主要操作编写一个子例程。从推开始。如果您不熟悉IBM上的调试器,请使用DMPCLPGM查看正在运行的代码的结果。试一试,如果你还有问题,贴上你的代码,问一个关于这段代码的具体问题。编程是关于编写代码的,所以跳进去试试吧!:-)
发布于 2013-03-24 20:30:07
据我所知,导师说堆栈应该只有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 当然没有溢出控制,但是它给了您这样的想法:)
发布于 2014-04-06 15:02:51
创建一个*LIFO数据队列。发送到队列的条目可以按照先入先出的顺序接收.
https://stackoverflow.com/questions/15597509
复制相似问题