JavaからIシリーズプログラムを呼び出すと無効な出力が得られます
-
14-11-2019 - |
質問
JOPEN / JT400ツールキットを使用して、JavaからのIBM iシリーズR5v4(AKA AS / 400)でプログラムを呼び出しています(実際:JRuby、しかし、純粋なJavaで同じ問題を見ました)。これはいくつかのプログラムでは問題ありませんが、他のプログラムでは、出力バイトにはすべてが間違っていて、無効でさえ(たとえばZoneddecimalの場合)、すべてのゼロが含まれています。ProgramCall、joblistまたはsysopr.msgqに添付されているメッセージはありません。誰かがこれが起こる理由を知っていますか?
いくつかのコードを表示する(私はライブラリで働いていた誰かがこのRubyレンダリングをjavaのレンダリングすることができます):
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]のバイト配列になります。これは意図した結果ではありません。さらに悪いことに、params[3].output_data
は[0,0,0,0,0,0,0,0,0,0,0,0]になります。これは、ZoneddEcimal.New(9,2)の無効なバイト値です。誰かが私を助けてくれることができますか?
解決
値がどこにでも使用されていない場合でも、が常に有効なinput_data
を常に出力パラメータに設定してください。そうでなければ、それらは初期化されず、それらはゴミを含みます(ただし、私の場合のようにメモリの場所にはゼロが含まれます)。その後プログラムが私の入力パラメータの選択に起こった場合に起こった出力値を明示的に設定しない場合、Dictum のゴミは、Grabe Out HOLDSを保持します。
もちろん、防御的なプログラミングは、プログラマがそのような値を初期化するか、またはコードを通して実行できるすべてのパスに設定されていることを示唆しているため、この問題が最初に発生するのを防ぎました。ただし、契約は常に出力パラメータに値を設定することですので、APIを誤って使用していました。