使用函数的返回值在通用包体中进行变量初始化

时间:2016-09-20 03:43:32

标签: generics ada

在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整数设置为get_size返回的值。我怎样才能做到这一点?我已经尝试将我的函数放在spec文件中的size变量之前,但它期望文件结束。我尝试设置size : integer := gwar.get_size,但这也不起作用。这可能吗?

3 个答案:

答案 0 :(得分:2)

发送时,代码看起来很奇怪。以下是各种不一致的快速回顾:

  • 在程序包的实现中不使用两个形式参数ItemSize。所以你可能不需要这里的通用包。 Get_Size是一个函数,不需要在任何地方存储信息(尽管调用者在另一个包中可能希望将它存储在本地变量中)。最好尽可能在没有副作用的情况下使用

  • Get_Size中,您有一个只会执行一次的循环,因为Line_Count始终设置为1。有更好的函数来计算文件的大小。例如,如果需要计算行数,请考虑使用GNATCOLL.Mmap一次读取内存中的整个文件。那会更快。

  • 您可能应该处理异常,例如,如果磁盘上不存在该文件或该文件不可读。

  • 最好在规范中提供Get_Size的文档,而不是在正文中,以便包的用户可以看到该文档。 GPS编辑器,如果您正在使用它,将在Get_Size的所有引用上显示工具提示,这些工具提示包括文档

答案 1 :(得分: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 :(得分:1)

如果你想要的只是确定文件的大小,你应该看看包Ada.Directories。有关该软件包的文档,请参阅Ada语言参考手册的A.16部分。如果您使用的是GPS开发环境,可以通过“帮助”菜单访问“Ada语言参考手册”。

Ada.Directories包中包含大量用于操作和理解文件的函数和过程。例如,Exists函数将文件名作为参数,并返回一个布尔值,指示命名文件是否存在。还有一个函数Size,它将文件名作为参数并返回文件的大小。

在尝试确定文件大小之前检查文件是否存在是有意义的。