Инициализация переменной в общем теле пакета с использованием возвращаемого значения функции

В Аде у меня есть следующий файл спецификации:

GENERIC
   TYPE Item IS PRIVATE; --type of array
   size : integer; --size of array
   PACKAGE gwar IS
    function get_size return integer;
   END gwar;

И файл тела:

with Ada.Text_Io;
use Ada.Text_Io;

package body gwar is
   --Get_Size allows the txt file to specify how much space to allocate.
   function get_size return Integer  is
      Filename : String := "win.txt";
      File : Ada.Text_IO.File_Type;
      Line_Count : Integer := 0;
      ReturnSize : Integer;
   begin
      Ada.Text_IO.Open(File => File,
                       Mode => Ada.Text_IO.In_File,
                       Name => Filename);
      while Line_Count /= 1 loop
         declare
            Line : String := Ada.Text_IO.Get_Line(File);
         begin
            ReturnSize := Integer'Value(Line);
            Line_Count := 1;
         end;
      end loop;
      Ada.Text_IO.Close (File);
      return ReturnSize;
   end get_size;

begin
    null;
end gear;

Что я хочу сделать, так это установить целое число size в значение, возвращаемое get_size. Как я могу это сделать? Я попытался поместить свою функцию перед моей переменной size в файле спецификаций, но ожидался конец файла. Пробовал ставить size : integer := gwar.get_size, тоже не работает. Это возможно?


person Jaken Herman    schedule 20.09.2016    source источник
comment
Ваш размер var является частью общей спецификации. Вам нужно переместить его за пределы общей спецификации, создать экземпляр вашей общей спецификации, а затем вызвать функцию get_size.   -  person NWS    schedule 20.09.2016
comment
Вы можете сделать общий формальный size режима in out - ARM 12.4   -  person Simon Wright    schedule 20.09.2016


Ответы (3)


Предпочтительно учитывая замечания manuBriot, я думаю, вы все равно могли бы технически следовать предложению Саймона Райта. Я сделал несколько упущений, чтобы сосредоточиться на том, как присвоить значение универсальному параметру в самом универсальном.

GENERIC
   TYPE Item IS PRIVATE; --type of array
   size : in out integer; --size of array
PACKAGE gwar IS
   function get_size return integer;
END gwar;

with Ada.Text_Io;
use Ada.Text_Io;

package body gwar is

   function get_size return Integer  is
      ReturnSize : Integer;
   begin
      ReturnSize := Integer'Value("2");
      return ReturnSize;
   end get_size;

begin
   Size := Get_Size;
end gwar;

Таким образом, когда вы создаете универсальный экземпляр, эффект тела экземпляра будет заключаться в установке для параметра size значения 2 при условии, что get_size возвращается без ошибок.

person B98    schedule 20.09.2016

При отправке код выглядит странно. Вот краткий обзор различных несоответствий:

  • два формальных параметра Item и Size не используются в реализации пакета. Так что, скорее всего, вам не нужен универсальный пакет. Get_Size - это функция, и ей не нужно где-либо хранить информацию (хотя вызывающая сторона в другом пакете может, конечно, захотеть сохранить ее в локальной переменной). Лучше иметь функции без побочных эффектов, когда это возможно

  • В Get_Size у вас есть цикл, который будет выполняться только один раз, так как Line_Count всегда установлено в 1. Есть лучшие функции для вычисления размера файла. Например, если вам нужно подсчитать количество строк, рассмотрите возможность использования GNATCOLL.Mmap для одновременного чтения всего файла в памяти. Это будет быстрее.

  • Вероятно, вы должны обрабатывать исключения, например, в случае, если файл не существует на диске или не читается.

  • Лучше иметь документацию Get_Size в спецификации, чем в теле, чтобы пользователи пакета могли видеть эту документацию. Редактор GPS, если вы его используете, будет отображать всплывающие подсказки для всех ссылок на Get_Size, и эти всплывающие подсказки включают документацию.

person manuBriot    schedule 20.09.2016

Если все, что вам нужно, это определить размер файла, вам следует взглянуть на пакет Ada.Directories. Документация по этому пакету находится в разделе A.16 Справочного руководства по языку Ада. Если вы используете среду разработки GPS, вы можете получить доступ к Справочному руководству по языку Ада через меню Справка.

Пакет Ada.Directories содержит множество функций и процедур для работы с файлами и их понимания. Например, функция Exists принимает в качестве параметра имя файла и возвращает логическое значение, указывающее, существует ли указанный файл. Существует также функция Size, которая принимает имя файла в качестве параметра и возвращает размер файла.

Имеет смысл проверить, существует ли файл, прежде чем пытаться определить его размер.

person Jim Rogers    schedule 20.09.2016
comment
Размер массива. Я буду использовать переменную size для выделения места в массиве. - person Jaken Herman; 20.09.2016