使用 return 函数值在通用包体中初始化变量

Variable initialization in generic package body using return value of function

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

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

  • 两个形式参数ItemSize在包的实现中没有使用。很可能您在这里不需要通用包。 Get_Size 是一个函数,不需要将信息存储在任何地方(尽管在另一个包中的调用者当然可能希望将其存储在局部变量中)。尽可能使用没有副作用的函数

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

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

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

如果您只想确定文件的大小,您应该查看包 Ada.Directories。这个包的文档可以在 Ada 语言参考手册的 A.16 部分找到。如果您使用的是 GPS 开发环境,您可以通过帮助菜单访问 Ada 语言参考手册。

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

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

最好考虑 的评论,我想,您仍然可以在技术上遵循 Simon Wright 的建议。我做了一些遗漏,专注于如何在泛型本身中为泛型参数赋值。

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_sizereturns没有错误。