- 论坛徽章:
- 0
|
franliu 发表于 2014-05-28 10:36
看来胖有型 C++ 很熟。 其实RPGLE 也可以做同样的事情。
函数 %ADDR() 可以返回变量 所在的内存地址, ...
F先生您好,我仔细看了一下,您这里说的是在RPGLE里取变量地址位,以及根据地址位获取具体的值,也就是类似于C里面的& 和 * 的用法。
我之前说的,是在内存中缓存一份变量名和变量地址的对应关系,这个是不一样的。
以楼主的要求为例,楼主的需求我们不妨这样分解一下:
1. 有一张配置表PF, 其中有个字段FLD1, 然后假设第一条记录中, FLD1的值为 "VAR1"
2. 楼主的程序中,其实是有VAR1这样一个字段的,它可能是某个独立的变量,也可能是某个PF的字段,还可能是某个DS中的一个成员变量,总之有这么一个变量。
假设VAR1的初始值为"HELLO WORLD"
3. 楼主希望的是,他有一个应用程序,读取PF表,取出第一条记录中FLD1的值"VAR1";
然后他想根据这个字符串"VAR1",找到对应的"HELLO WORLD", 或者是把这个"HELLO WORLD"修改成为"HELLO AS400"
您举的伪代码的例子中,YYYY对应的是FLD1的地址位,所以最终取出的YYYY的值一定是"VAR1", 不可能是"HELLO WORLD“
所以针对楼主的这个需求,我们需要有一个初始化的动作。
比如假设我们已经用%Addr取出VAR1这个变量的地址是0XF8305891(随便编的),那么就需要建立好字符串"VAR1”和这个0XF8305891的对应关系。
以后用的时候就可以根据字符串找到对应的地址位,即而找到相应的值了。
MAP的好处是可以动态扩展,并且使用堆排序,查找效率恒定。
当然考虑到这里是400板块,过于炫耀C++的知识也有踩场子嫌疑,所以我后来也补充了,用纯净的RPGLE也可以实现,只是没那么优雅罢了。
比如我们可以建两个数组,保持逻辑上的一致性,也就是说这个一致性只存在于程序员的大脑中,没有代码级别的限制。
一个数组DIMA是存放字符串,一个数组DIMB存放事先取出的变量的地址位。
要用的时候通过LOOKUP操作符,查找出"VAR1“这个字符串在数组DIMA中的下标位置,然后直接用这个下标在数组DIMB中取地址就可以了。
之所以说用数组没有map优雅,一个是数组需要约定最大元素,再一个LOOKUP操作好象是全数组扫描,没有map的查询快。 不知道I5以后的版本有没有对数组查询这部分做优化。
当然,我也深深的怀疑,我们讨论得这么热火朝天,楼主到底看到没,看明白没。。。
|
|