AS400 之指针 Good Luck

指针基本概念
 

每台计算机都包含用于存储程序、文件、变量等的“存储器”。这种存储器(我们也将其称为“内存”,即使它实际上可能是任何现代操作系统上的磁盘空间)通常是编号,以便其中的每个字节都有一个唯一的地址。

当你运行一个程序时,它需要使用内存中的空间来放置过程、变量等内容。运行该程序(或任何其他程序)的每个作业都需要在内存中拥有自己独特的空间,不会与其他所有作业冲突运行所有其他程序。因此,应由操作系统在请求时分配有效的内存区域。

请求为程序提供内存的过程称为“分配内存”。一个典型的场景是这样的:

一个程序被调用。

当程序需要一个地方来存储变量时,它会询问操作系统,说“我需要 10 字节的内存”

操作系统回复类似“您可以使用从位置 71533 开始的 10 字节内存!”

程序继续运行,当它完成时,对操作系统说“我已经完成了位置 71533 的内存”


那么什么是指针呢?

指针只不过是一个保存内存地址的变量!

由于任何给定变量在内存中的起始地址可能因程序和作业而异,因此该地址必须存储在某种“内存地址变量”中。这种类型的变量称为“指针”。


怎么用指针

通常,RPG 编译器会自动创建程序代码,为您定义的变量分配内存,从而节省您必须自己完成的所有工作。

然而,有时,能够自己直接处理内存地址是很方便的。这允许您:

  • 将两个或多个变量放入同一内存区域。

  • 将变量从内存中的一个位置移动到另一个位置

  • 将整个数据结构在内存中从一个地方移动到另一个地方(对于处理列表非常有用)

  • 允许您创建可以根据需要增加和减少内存使用量的数据列表

  • 让你绕过RPG中单个字符串可以存储32k的限制


一个例子如下:

D Var1            S             12A                   D Ptr             S               *                   D Var2            S             12A   based(Ptr)      D                                                     D                                                     D                                                     c                   eval      Ptr = %addr(Var1)       c                   eval      Var1 = 'Hello World!'   c                   dsply                   Var2      c                                                      ** This displays "World Hello!"                      c                   eval      Var2 = 'World Hello!'   c                   dsply                   Var1                                                       C                                                     c                   eval      *inlr = *on             c                   return                            
 

大家可以互相猜下结果

图片


1) 定义变量Var 1 , 那就是说程序运行时,编译器会自动分配内存,比如在位置75555分配内存

2) 然后讲Ptr 这个指针指向了变量 Var 1, 将Var 1的内存位置75555给到了Ptr

3)定义变量Var 2是基于Ptr 内存地址,那么Var2 就不会被程序分配内存而是占用Ptr 指针指向的那个内存的变量

那么答案以上结果就出去来了:

当Var 1 给赋值到以下值的时候,对于Var 2也会得到Hello Word 的值。同样,当Var 2 的值变化了,对于75555后面的12位Char 也会变化,Var 也会同时变成World Hello!

​​​​​​​

    地址:Ptr=75555Var 1--> [hello word]    Var 2-->     

还有一种用法for 指针,就是大String之间的互相传参,比如说你有一个300万的字符的参数要传。在做API的时候,或者实时去接数据的时候,面对现在的Json格式你要怎么做;

Ptr 是入口参数指针​​​​​​​

D Var1            S             12A                                  D I               S              5S 0                                D wkMove1         S          30000A   DIM(100)                       D Ptr             S               *             入口参数                D Ptr1            S               *                                  D wkMove          S          30000A   DIM(100) BASED(Ptr1)                                                                                                                                       c                   eval      Ptr1 =%addr(wkMove1)                   c                   clear                   wkMove                   C                   eval      I  = 1                                 c                   dow       I  <  100                              c                   eval      wkMove(I) = 'form file loop'           c                   enddo                                            C                   eval      Ptr  = Ptr1                            c                   eval      *inlr = *on                            c                   return

Ptr 是对应的入口参数指针,当用Ptr1已经有值的时候,后续将Ptr的指针地址指向对应的Ptr1指针对应的变量


总结:

指针以使用复杂和危险而著称。许多人拒绝在 RPG IV 中使用指针,而不了解它们的用途以及为什么需要它们。

我希望本教程有助于消除这些恐惧,并展示指针如何成为一种有用的工具。你的下一步是编写程序和实验!通过实验和经验,您将学到的东西比任何教程都能教给您的要多得多。

祝你好运!

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Saidywin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值