Ада-эквивалент локальной статической переменной из C/C++

Я исхожу из C/C++ во встроенных системах, и все время внутри функции мы используем статическую переменную, чтобы значение сохранялось во время вызовов.

В Аде кажется, что это делается только с эквивалентом статических переменных на уровне файла. Есть ли эквивалент Ады.

C++:

function Get_HW_Counter() {
   static int count = 0;
   return ++count;
}

Ада: ??


ada
person Awaken    schedule 05.05.2013    source источник


Ответы (1)


Переменные уровня пакета.

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

Если мое понимание С++ не слишком заржавело, близким эквивалентом будет:

package HW_Counter is
   function Get_Next;
private
   count : natural := 0; -- one way of initialising
   -- or integer, allowing -ve counts for compatibility with C++
end HW_Counter;

и это все, что нужно видеть покупателю пакета.

package body HW_Counter is

   function Get_Next return natural is
   begin
      count := count + 1;
      return count;
   end Get_Next;

begin  -- alternative package initialisation part
   count := 0;
end HW_Counter;

И использование, как правило, будет

   C := HW_Counter.get_next;
person user_1818839    schedule 05.05.2013
comment
Вы можете создать пакет, локальный для подпрограммы, но он будет уточняться для каждой записи (поэтому любые переменные будут повторно инициализированы). - person Simon Wright; 05.05.2013
comment
На самом деле, перечитав вопрос, я думаю, что это точно эквивалент статических переменных на уровне файла. Так что нет, я не верю, что существует аналог C на Аде. Но нетрудно получить тот же эффект, хотя и немного более утомительный. - person Simon Wright; 05.05.2013
comment
В Аде 2012 вам даже не нужно тело пакета, вы можете использовать функцию-выражение в приватном разделе для реализации аксессора. - person Shark8; 05.05.2013
comment
Shark8, я так не думаю? Как бы вы получили прибавку? - person Simon Wright; 05.05.2013
comment
Он сказал статические... и, черт возьми, это СТАТИЧЕСКИЕ! -- j/k... Вы абсолютно правы, забыл... но доступ можно сделать в спецификации. - person Shark8; 06.05.2013
comment
Каковы плюсы и минусы объявления фактической переменной в приватной части вместо тела? - person Álex; 18.05.2013
comment
Я думаю, что в этом случае это могло пойти в тело. В приватной части это позволяет пользователю пакета видеть, что пакету требуется (4 байта) памяти. Моя перспектива может быть окрашена тем фактом, что я недавно писал Аду для довольно небольшой цели ... 1 КБ исполняемого файла, 128 байт ОЗУ - newark.com/texas-instruments/ez430-t2012/ - person user_1818839; 18.05.2013
comment
@Simon: хорошая мысль относительно: пакеты локальны для подпрограмм. Но пакеты не обязательно находятся в области файла; например, они могут быть локальными для других пакетов. Приведенный выше пример, безусловно, выглядит тяжеловесно по сравнению с примером C++, но он является основой для чего-то более всеобъемлющего: непрозрачный тип, экспортирующий только разрешенные операции над ним. Как только вы захотите расширить пример, чтобы разрешить еще одну операцию над переменной: например. установить счетчик на определенное значение, это простое дополнение к пакету, но пример C++ в конечном итоге будет выглядеть намного ближе к версии Ada. - person user_1818839; 18.05.2013