首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Java调用i系列程序会产生无效的输出

从Java调用i系列程序会产生无效的输出
EN

Stack Overflow用户
提问于 2011-02-16 04:49:15
回答 1查看 672关注 0票数 1

我正在使用jtopen/jt400工具包从Java (实际上是: JRuby,但我在纯Java中看到了同样的问题)中调用IBM系列r5v4 (也称为AS/400)上的程序。这对于某些程序很有效,而对于其他程序,输出字节包含全零,这是错误的,有时甚至是无效的(例如,在ZonedDecimal的情况下)。没有消息附加到ProgramCall、JobList或SYSOPR.MSGQ上。有人知道为什么会发生这种情况吗?

为了展示一些代码(我相信任何使用过这个库的人都能理解这个Java的Ruby渲染):

代码语言:javascript
复制
as400 = AS400.new(host, user, password)
call = ProgramCall.new(as400)
call.program = "/QSYS.LIB/LIBRARY_NAME.LIB/PROGRAM_NAME.PGM"

# Prepare converters
text1_converter = AS400Text.new(1)
text3_converter = AS400Text.new(3)
decimal92_converter = AS400ZonedDecimal.new(11, 2)

# Prepare parameters
call.parameter_list = []

# Input parameters
call.parameter_list << ProgramParameter.new(text1_converter.to_bytes('N'))
call.parameter_list << ProgramParameter.new(decimal92_converter.to_bytes(1500.25))

# Output parameters
call.parameter_list << ProgramParameter.new(text3_converter.byte_length)
call.parameter_list << ProgramParameter.new(decimal92_converter.byte_length)  

# Execute the call    
call.run

# Show the results
puts "Text3 output value: " + text3_converter.to_object(params[2].output_data).to_s
puts "Decimal92 output value: " + decimal92_converter.to_object(params[3].output_data).to_s

正如我所说的,这在某些程序中工作得很好,而对于其他程序,params[2].output_data将是一个0,0,0的字节数组,这不是预期的结果。更糟糕的是,对于ZonedDecimal.new(9,2),params[3].output_data将是0,0,0,0,0,0,0,0,0,0,0,0,0,0,这是无效的字节值。有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-16 20:21:04

事实证明,您必须始终在输出参数上设置有效的input_data,即使这些值不在任何地方使用。如果不这样做,它们将不会被初始化,它们将包含垃圾(但通常内存位置将包含零,就像我的例子一样)。如果程序随后没有显式地设置输出值,这恰好是我选择输入参数的情况,那么dictum垃圾输入等于垃圾输出成立。

当然,防御性编程建议程序员初始化这些值,或者确保在代码中可以采用的每条路径中设置这些值,这将从一开始就防止这种问题的发生。但是,合同似乎总是设置输出参数的值,所以我错误地使用了API。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5009329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档