سؤال

أدناه هو بعض التعليمات البرمجية في ADA

  with TYPE_VECT_B; use TYPE_VECT_B;

  Package TEST01 is
  procedure TEST01
           ( In_State   : IN     VECT_B ;
             Out_State  : IN OUT VECT_B );

  function TEST02
           ( In_State   : IN     VECT_B ) return Boolean ;

  end TEST01;

يتم تحديد مواصفات حزمة type_vect_b والجسم أدناه أيضًا

  Package TYPE_VECT_B is

  type VECT_B is array (INTEGER  range <>) OF BOOLEAN  ;

  rounded_data : float ;
  count : integer ;
  trace : integer ;
  end TYPE_VECT_B;

  Package BODY TYPE_VECT_B is
  begin
   null;
 end TYPE_VECT_B;

ماذا يعني المتغير in_state و out_state بالفعل؟ أعتقد أن in_state يعني متغير الإدخال. أنا فقط أشعر بالارتباك مع ما يعنيه out_state في الواقع؟

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

المحلول

و in يمكن قراءة المعلمة ولكن غير مكتوبة بواسطة البرنامج الفرعي. in هو الافتراضي. قبل ADA 2012 ، تم السماح للوظائف فقط in المعلمات. المعلمة الفعلية هي تعبير.

و out المعلمة تعني أن القيمة السابقة ليست ذات فائدة. من المتوقع أن يكتب البرنامج الفرعي إلى المعلمة. بعد الكتابة إلى المعلمة ، يمكن للبرنامج الفرعي قراءة ما كتبته. عند الخروج ، تتلقى المعلمة الفعلية القيمة المكتوبة إليها (هناك مضاعفات في هذا المجال!). يجب أن تكون المعلمة الفعلية متغيرًا.

و in out المعلمة مثل out المعلمة باستثناء أن القيمة السابقة ذات أهمية ويمكن قراءتها بواسطة البرنامج الفرعي قبل المهمة. علي سبيل المثال،

procedure Add (V : Integer; To : in out Integer; Limited_To : Integer)
is
begin
   --  Check that the result wont be too large. This involves reading
   --  the initial value of the 'in out' parameter To, which would be
   --  wrong if To was a mere 'out' parameter (it would be
   --  uninitialized).
   if To + V > Limited_To then
      To := Limited_To;
   else
      To := To + V;
   end if;
end Add;

نصائح أخرى

في الأساس ، كل معلمة إلى وظيفة أو إجراء لها اتجاه إليها. الخيارات in, out, in out (كلاهما) ، أو access. إذا كنت لا ترى واحدة من هؤلاء ، فهذا افتراضيات in.

in تعني البيانات يمكن أن تذهب إلى الروتين الفرعي من المتصل (عبر المعلمة). يُسمح لك بالقراءة من in المعلمات داخل الروتين. out تعني أن البيانات يمكن أن تخرج من الروتين بهذه الطريقة ، وبالتالي يُسمح لك بتعيين قيم للمعلمة داخل الروتين. بشكل عام ، كيف ينجز المترجم أن تمرير البيانات يصل إلى المترجم ، والذي يتوافق مع فلسفة ADA العامة للسماح لك بتحديد ما تريد القيام به ، وليس كيف تريد القيام به.

access هي حالة خاصة ، وتشبه تقريبًا وضع "*" في تعريف المعلمة الخاص بك بلغات Cish.

السؤال التالي عادة ما يكون الناس هو "إذا قمت بتمرير شيء كبير مثل in المعلمة ، هل ستدفع كل هذه البيانات على المكدس أو شيء من هذا القبيل؟ بالرجوع إليه. إنه المترجم ، وليس تفاصيل معلمة Mechanisim الخاصة بك ، والتي تفرض عدم كتابة البيانات مرة أخرى من الروتين. مرة أخرى ، تخبر ADA بما تريد القيام به ، فهو يكتشف الطريقة الأكثر فعالية للقيام بذلك.

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