Есть ли различия между этими двумя файлами? - PullRequest
1 голос
/ 22 июня 2010

У меня есть два файла ada, показанных ниже

A1.ada

procedure KOR616 is

   I : Integer := 3;

   procedure Lowest_Level( Int : in out Integer );
   pragma Inline( Lowest_Level );

   procedure Null_Proc is
   begin
      null;
   end;

   procedure Lowest_Level( Int : in out Integer ) is
   begin
      if Int > 0 then
         Int := 7;
         Null_Proc;
      else
         Int := Int + 1;
      end if;
   end;

begin
   while I < 7 loop
      Lowest_Level( I );
   end loop;
end;

Следующим показанным ниже является B1.ada

procedure Lowest_Level( Int : in out Integer );
pragma Inline( Lowest_Level );

procedure Lowest_Level( Int : in out Integer ) is

   procedure Null_Proc is
   begin
      null;
   end;

begin
   if Int > 0 then
      Int := 7;
      Null_Proc;
   else
      Int := Int + 1;
   end if;
end Lowest_Level;

with Lowest_Level;
procedure KOR618 is

   I : Integer := 3;

begin
   while I < 7 loop
      Lowest_Level( I );
   end loop;
end;

Есть ли разница между этими двумя файлами?

Ответы [ 4 ]

2 голосов
/ 24 июня 2010

Как написано, KOR616 (A1) и KOR618 (B1) будут иметь одинаковый эффект. Разница заключается в видимости (и скомпилированный код, конечно, будет другим, но я сомневаюсь, что это важно).

В А1 тела как Null_Proc, так и Lowest_Level могут видеть I, но ничто вне KOR616 не может их видеть. Также тело KOR616 может видеть Null_Proc.

В B1 Lowest_Level (но не Null_Proc) виден всей программе, а не только KOR618.

1 голос
/ 25 июня 2010

Ну, главное отличие в том, что во втором примере Null_Proc недоступен за пределами Lowest_Level. В первом примере, если вы захотите позже, у вас может быть KOR618 или любая другая подпрограмма, которую вы можете добавить позже, также вызовите Null_Proc.

Обычно я не определяю подпрограммы внутри других подпрограмм подобным образом, если только нет какой-либо причины, почему внутренняя подпрограмма не имеет смысла вне внешней подпрограммы. Очевидным примером может быть, если внутренняя подпрограмма работает с локальными переменными, объявленными во внешней подпрограмме (без передачи их в качестве параметров).

В этом случае Null_Proc - это такая же обычная операция, как и она, поэтому я не вижу никаких веских причин для ее уничтожения внутри Lowest_Level таким образом. Конечно, он вообще ничего не делает, поэтому у меня нет никаких веских причин для его существования. : -)

1 голос
/ 22 июня 2010

В A1, procedure Null_Proc не вложено в procedure Lowest_Level; в B1 он вложен в в procedure Lowest_Level. Что касается pragma Inline, «реализация может свободно следовать или игнорировать рекомендацию, выраженную прагмой ». Я ожидаю, что вкладывание вложенных подпрограмм будет зависеть от реализации.

1 голос
/ 22 июня 2010

В B1 Null_Proc не встроен. (Это не в пределах Lowest_Level).

...