免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10221 | 回复: 10
打印 上一主题 下一主题

如何把文件里面的字段保存的值,在程序里面当做变量名称使用!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-10 10:52 |只看该作者 |倒序浏览
RT:

例如,表A, 有一个一个字段F1 = VEW1,
在程序里面,当我取到字段F1的时候,我需要把VEW1当做变量使用,而不是把他当做字符串值‘VEW1’.

有谁知道如何处理,给点意见,急,非常感谢。。。

论坛徽章:
0
2 [报告]
发表于 2014-01-10 10:52 |只看该作者
自己沙发。。。

论坛徽章:
0
3 [报告]
发表于 2014-01-10 10:52 |只看该作者
自己板凳。

论坛徽章:
0
4 [报告]
发表于 2014-01-13 09:36 |只看该作者
现在论坛里面,好没有人气啊。。。。看来400真的要悲剧啊。。。。

问了个问题,3天了,没人回答,呜呜呜,伤心鸟。。。

论坛徽章:
0
5 [报告]
发表于 2014-01-13 10:12 |只看该作者
对这种问题,建议你考虑元编程。
目前不知道那种编程语言支持动态使用变量名的,但还是有变通的方法的。
比如你要动态的去读写一张表,规则一样,但这张表的结构是未知的,这种情况你可以考虑做一个模版程序+配置文件方式。需要读写的时候根据模版程序和配置文件动态生成一个程序源码并编译,只要保证调用接口一致就可以了。
整个流程大概是这样的。
需要调用一个动态的B程序,但B程序此时并不存在。那么就先定义一个C程序,在C程序里定义一个动态调用程序,程序名未知,但输入输出参数固定。
接着实现一个D程序,根据配置文件和传入的参数动态生成B程序。
那么最终的调用模式就是:
A—>D—>C—>B

论坛徽章:
0
6 [报告]
发表于 2014-04-14 15:30 |只看该作者
给出你的实际的需求,我们可以替你想出解决问题的方法。
由于需求的复杂性,有时候我们甚至需要动态的生成一个程序来解决问题。

论坛徽章:
0
7 [报告]
发表于 2014-05-27 16:16 来自手机 |只看该作者
如果楼主不介意引入c++的话,这个问题是很好解决的。
这类问题在c++中都有标准处理模式:
使用map,初始化的时候把可能用到的变量逐一取地址,以变量名为键,地址位为值,写到map里。
实际使用的时候,以PF中的字段值为键值直接在map中查出对应变量的地址位,然后就可以随心所欲了。
不需要动态生成程序。

直觉上用java还能更简单点,因为c++没有反射机制。不过我们这边一般在400上都没装java开发包,所以推荐c++。

论坛徽章:
0
8 [报告]
发表于 2014-05-27 16:26 来自手机 |只看该作者
好吧,其实核心思想就是在内存里缓存数据,保留以字段名和实际字段的地址的对应关系。

如果用纯净的RPGLE写的话,可以考虑使用一个结构体数组来实现这个伟大的目的。

论坛徽章:
0
9 [报告]
发表于 2014-05-28 10:36 |只看该作者
看来胖有型 C++ 很熟。 其实RPGLE 也可以做同样的事情。

函数 %ADDR()   可以返回变量 所在的内存地址,而我们可以把这个地址内存用数据结构定义成变量来存取。

xxxxx     ds    based(addr)
yyyyy

譬如说  数据库 字段指明 变量  FLD1, 含值 VAR1,

      EVAL  ADDR = %ADDR(FLD1)  可以返回变量 VAR1的地址
这时候变量 YYYY 就可以拿到变量 VAR1的值了。

论坛徽章:
0
10 [报告]
发表于 2014-05-29 00:36 |只看该作者
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以后的版本有没有对数组查询这部分做优化。

当然,我也深深的怀疑,我们讨论得这么热火朝天,楼主到底看到没,看明白没。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP