استدعاء برنامج ط سلسلة من جافا غلة الإخراج غير صالح

StackOverflow https://stackoverflow.com/questions/5009329

  •  14-11-2019
  •  | 
  •  

سؤال

أنا باستخدام مجموعة أدوات جتوبين / جت 400 لاستدعاء البرامج على عب أنا سلسلة ر5 في 4 (ويعرف أيضا باسم أس / 400) من جافا (في الواقع:جروبي ، ولكن رأيت نفس المشكلة في جافا نقية).هذا يعمل على ما يرام لبعض البرامج ، في حين أن برامج أخرى ، بايت الإخراج تحتوي على جميع الأصفار ، وهو مجرد خطأ وأحيانا حتى غير صالحة (على سبيل المثال في حالة زونديسيمال).لا توجد رسائل مرفقة بالبرنامجاستدعاء ، في قائمة الوظائف أو على سيسوبر.إم إس جي كيو.لا أحد يعرف لماذا يحدث هذا?

لإظهار بعض التعليمات البرمجية (أنا متأكد من أن أي شخص الذي عمل مع المكتبة يمكن أن نفهم هذا روبي تقديم جافا):

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], وهي قيم بايت غير صالحة لمنطقة عشرية.جديد (9 ، 2).يمكن لأي شخص مساعدتي?

هل كانت مفيدة؟

المحلول

اتضح لك يجب دائما تعيين صالح input_data على معلمات الإخراج ، حتى عندما لا يتم استخدام القيم في أي مكان.إذا لم تقم بذلك ، فلن يتم تهيئتها وستحتوي على القمامة (ولكن غالبا ما تحتوي مواقع الذاكرة على أصفار ، كما في حالتي).إذا لم يقم البرنامج لاحقا بتعيين قيم الإخراج بشكل صريح ، وهو ما حدث بالنسبة لاختياري لمعلمات الإدخال ، فإن القول المأثور القمامة في يساوي القمامة خارج يحمل.

بالطبع ، تشير البرمجة الدفاعية إلى أن المبرمج يقوم بتهيئة هذه القيم أو يتأكد من تعيينها في كل مسار يمكن اتباعه من خلال الكود ، مما كان سيمنع حدوث هذه المشكلة في المقام الأول.ومع ذلك ، يبدو أن العقد هو تعيين القيم دائما على معلمات الإخراج ، لذلك كنت أستخدم واجهة برمجة التطبيقات بشكل خاطئ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top