在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
,但这也不起作用。这可能吗?
答案 0 :(得分:2)
发送时,代码看起来很奇怪。以下是各种不一致的快速回顾:
在程序包的实现中不使用两个形式参数Item
和Size
。所以你可能不需要这里的通用包。 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,它将文件名作为参数并返回文件的大小。
在尝试确定文件大小之前检查文件是否存在是有意义的。