2010-06-22 2 views
1

Я два 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; 

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

+0

Переформатированный код; пожалуйста, верните, если это неверно. – trashgod

ответ

1

В B1, Null_Proc не встроен. (Он не находится в пределах Lowest_Level).

+0

@ rursw1 - Извините, но я не получил его. Можете ли вы объяснить? – maddy

+0

Я в замешательстве; в 'B1',' Null_Proc' представляется вложенным в 'Lowest_Level'. – trashgod

+0

Хорошая точка. В первом примере нет 'pragma inline', который применяется к' Null_Proc'. Во втором случае, чтобы встроить внешнюю процедуру, логически она должна была бы встроить и внутреннюю. –

1

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

+0

Вот почему я никогда не беспокоюсь о «прагма-инлайн», если для этого нет ** доказанной ** необходимости. «этот код должен быть быстрым» недостаточно хорош. Ваше объяснение было бы лучше: «без встроенного кода он генерировал код, который сделал X. С его помощью вместо этого Y». –

2

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

В A1 тела Null_Proc и Lowest_Level могут видеть I, но ничего за пределами KOR616 не видят их. Кроме того, тело KOR616 может видеть Null_Proc.

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

1

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

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

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

+1

Я ожидаю, что Мэдди удалит ненужные детали в Null_Proc. –

Смежные вопросы