2016-09-20 3 views
-1

В Ada, у меня есть следующие спецификации файла:инициализации переменной в родовом теле пакета, используя возвращаемое значение функции

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 integer к значению, возвращаемому get_size. Как я могу это сделать? Я попытался поставить свою функцию перед моей переменной size в спецификационном файле, но ожидал окончания файла. Я попытался установить size : integer := gwar.get_size, но это тоже не работает. Это возможно?

+0

Ваш размер var является частью общей спецификации. Вам нужно переместить его за пределы общей спецификации, создать экземпляр своего родословного, а затем вызвать функцию get_size. – NWS

+0

Вы можете сделать общий формальный 'размер' режима' in out' - [ARM 12.4] (http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-12-4.html) –

ответ

2

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

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 возвращается без ошибок.

2

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

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

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

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

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

1

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

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

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

+0

Размер массива. Я буду использовать переменную размера для выделения пространства в массиве –