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

标签 ibm-midrange control-language

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

最佳答案

了解 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

发布一些代码;你尝试了什么?如果您无法发布任何代码,请发布伪代码并解释您希望代码执行的操作。

编辑: 上面的代码片段实现了一个数组。这与堆栈非常相似。后进先出就像跟踪最新的数组索引一样简单。在上面的代码片段中,CHGVAR 将 10 个字节添加到指针。它是 10 个字节,因为每个数组元素/堆栈元素都是 10 个字节(DCL &ELEM)。该特定堆栈包含 5 个条目 - 5 乘以 10 = 50(DCL 和数组)。加10个字节是PUSH,减10个字节是POP。当前的 &PTR 是最新的堆栈条目。

下一步应该是为大纲中的每个主要操作编写一个子例程。从“推”开始。如果您不熟悉 IBM i 上的调试器,请使用 DMPCLPGM 查看代码运行结果。尝试一下,如果您仍然有疑问,请发布您的代码并询问有关该代码的具体问题。编程就是编写代码,所以赶快尝试吧! :-)

关于ibm-midrange - CL 程序中的堆栈实现 (OS400/iSeries),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15597509/

相关文章:

ibm-midrange - CL CALL 语句中传递参数的类型

java - log4j 2.0 JDBC ConnectionFactory 到 DB2 未将记录添加到日志表 (log4j2.xml)

grails - 在 IBM 的 jetty 上启动 Grails 应用程序时出现 "Creation of DB2Driver object failed: CCSID value is not valid"

sql - 使用 JOIN 更新表

ibm-midrange - 增加 CL 中的文本字段

ibm-midrange - 当在我的程序中使用时,CPYTOPCD 仅复制一小部分信息,但当从命令行使用时,它会复制所有信息

ibm-midrange - CLLE 中的微调变量

ibm-midrange - 从COBOL或CL调用Web服务

c# - 创建类似 iSeries 的程序

jakarta-ee - javax.naming.NameNotFoundException : Name [jdbc/mydb] is not bound in this Context