سؤال
أدناه هو بعض التعليمات البرمجية في 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 بما تريد القيام به ، فهو يكتشف الطريقة الأكثر فعالية للقيام بذلك.