2011-02-15 2 views
1

jtopen/jt400 툴킷을 사용하여 Java에서 IBM i- 시리즈 r5v4 (일명 AS/400) 프로그램을 호출합니다 (실제로는 JRuby이지만 순수한 자바에서 같은 문제). 다른 프로그램의 경우 출력 바이트가 모두 0을 포함하는 반면, 일부 프로그램에서는 제대로 작동합니다. 이는 잘못되었거나 때로는 유효하지 않은 경우도 있습니다 (예 : ZonedDecimal의 경우). ProgramCall, JobList 또는 SYSOPR.MSGQ에 첨부 된 메시지가 없습니다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까? 하지만, 내가 말했듯이Java에서 i-series 프로그램을 호출하면 유효하지 않은 결과가 출력됩니다.

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)의 잘못된 바이트 값입니다. 누구든지 나를 도울 수 있습니까?

답변

3

은 출력 매개 변수에 항상 input_data을 설정해야합니다. 값이 어디에도 사용되지 않는 경우에도 마찬가지입니다. 그렇지 않으면 초기화되지 않고 가비지가 포함될 것입니다 (그러나 메모리 위치에는 제 경우와 같이 0이 포함되는 경우가 많습니다). 프로그램이 결과적으로 출력 매개 변수를 명시 적으로 설정하지 않은 경우 입력 매개 변수를 선택했을 때 쓰레기 값이 쓰레기 값과 같음이됩니다.

물론 방어 프로그래밍은 프로그래머가 이러한 값을 초기화하거나 코드를 통해 가져올 수있는 모든 경로에 설정되어 있는지 확인하여 처음부터이 문제가 발생하지 않도록합니다. 그러나 계약은 출력 매개 변수에 항상 값을 설정하는 것으로 보이므로 API를 잘못 사용하고있었습니다.