1

jtopen / jt400ツールキットを使用して、JavaからIBM iシリーズr5v4(別名AS / 400)のプログラムを呼び出しています(実際にはJRubyですが、純粋なJavaでも同じ問題が発生しています)。これは一部のプログラムでは問題なく機能しますが、他のプログラムでは、出力バイトにすべてゼロが含まれます。これは間違っており、場合によっては無効です(たとえば、ZonedDecimalの場合)。ProgramCall、JobList、またはSYSOPR.MSGQにメッセージは添付されていません。なぜこれが起こるのか誰かが知っていますか?

いくつかのコードを表示するには(ライブラリを使用したことがある人なら誰でも、このJavaのRubyレンダリングを理解できると確信しています)。

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]になります。これは、ZonedDecimal.new(9、2)の無効なバイト値です。誰かが私を助けることができますか?

4

1 に答える 1

3

値がどこにも使用されていない場合でも、出力パラメーターに常に有効な値を設定する必要があることがわかりました。input_dataそうしないと、初期化されず、ガベージが含まれます(ただし、私の場合のように、メモリ位置にはゼロが含まれることがよくあります)。その後、プログラムが出力値を明示的に設定しない場合(これは、入力パラメーターの選択に当てはまります)、ディクタムガベージインはガベージアウトホールドに等しくなります。

もちろん、防御的なプログラミングでは、プログラマーがそのような値を初期化するか、コードを通過できるすべてのパスに値が設定されていることを確認することをお勧めします。これにより、この問題が最初から発生するのを防ぐことができます。ただし、出力パラメータには常に値を設定することが契約のようで、APIを誤って使用していました。

于 2011-02-16T12:21:04.327 に答える