RPGLE 中的过程指针 (PROCPTR)
谁能提供这些有趣的用法示例?
Can anyone provide any interesting usage examples of these?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
谁能提供这些有趣的用法示例?
Can anyone provide any interesting usage examples of these?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
作为一个实际的例子,这可以在实现回调时使用。 常见的回调可以在 C 语言的 qsort() 函数中找到。是的,您可以从 ILERPG 中调用它。
qsort() 的
C
规范是:RPGLE
原型如下所示:这是一个使用 qsort() 的简单程序:
如果运行它,输出将是:
For a practical example, this can be used when implementing callbacks. A common callback can be found in the qsort() function in C. Yes, you can call that from ILERPG.
The
C
specification for qsort() is:The
RPGLE
prototype would look like:Here is a simple program that uses qsort():
If you run it, the output will be:
jjujuma,
对于一个简单的例子,您可以使用它来实现一些面向对象的样式过程,例如 Draw。 您可以通过将 Circle_Draw 或 Square_Draw 的适当 %PADDR 分配给 Draw 过程指针来调用 Circle_Draw 过程或 Square_Draw 过程。 当调用 Draw 过程指针时,您隐藏正在调用的过程(Circle_Draw 或 Square_Draw)。
jjujuma,
For a trivial example you could use this to implement some Object Oriented style procedure like Draw. You'd call a Circle_Draw procedure for a Circle or a Square_Draw procedure for a Square by assigning the appropriate %PADDR of the Circle_Draw or Square_Draw to your Draw procedure pointer. When calling the Draw procedure pointer you hide which procedure (Circle_Draw or Square_Draw) you're calling.
我使用过程指针将搜索假脱机文件的逻辑封装到其自己的名为
SPLFFUNC
的服务程序中,以便更轻松地迭代它们。在调用程序中,您可以使用如下代码:
对于每个符合请求条件的假脱机文件,
指向的过程将被调用一次。 这使您可以返回惰性可枚举而不是数组。 我喜欢这个,因为它是可重用的,它不依赖于特定大小的数组(因为我永远不知道要分配多少),而且它的内存占用要小得多,因为你一次只存储一个数据结构。 这大致相当于您在 C# 等语言中使用 lambda 所做的事情。 由于指向的过程可以访问客户端程序中的任何全局变量,因此它会关闭它们以执行客户端程序的实际工作。
服务程序中的代码处理调用 API、读取用户空间对象等的所有细节。因此,可以将这些细节排除在客户端程序之外。
请注意,RPG 不为此类技术提供编译类型类型检查,因此您必须确保您请求的格式与指向的过程中定义的数据结构匹配。
服务计划:
服务计划原型:
I have used procedure pointers to encapsulate the logic for searching spooled files into its own service program named
SPLFFUNC
for make it easier to iterate over them.In the calling program you can use code like:
and
The pointed to procedure will get called one time for each spooled file matching the requested criteria. This lets you return a lazy enumerable instead of an array. I like this because it is reusable, it is not beholden to a specific size of array (since I never know how much to allocate), and it has a much smaller memory footprint since you only ever store one data structure at a time. This is roughly equivalent to what you would do with a lambda in a language like C#. Since the pointed to procedure can access any global variables in the client program, it closes over them to perform the real work of the client program.
The code in the service program handles all the gory detail of calling the APIs, reading the userspace object etc. This detail can thus be kept out of the client program.
Note that RPG does not provide compile-type type checking for this kind of technique so you must make sure that the format you request and the data structure defined in the pointed to procedure match.
Service Program:
Service Program Prototypes:
例如,CEEHDLR/CEEHDLU(取消)注册当前堆栈(条目)帧的用户编写的条件处理程序。
For example, CEEHDLR/CEEHDLU (un)registers a user-written condition handler for the current stack (entry) frame.