Ada-如何初始化包含File_Type成员的有限标记类型?

在下面的代码中,Mix_Card_Reader继承自Mix_IO_Device,后者是抽象的标记记录。

以前,它包含一个#!/usr/bin/env python3.7 import subprocess import re import os def main(): output=subprocess.check_output(["ps","aux"]) output=output.decode() print(output) if __name__=="__main__": main() 和两个Positive成员。我想更改代码,使其改为使用Stream_access个成员。

这样做的原因是,我希望这种类型的每个实例都能够在需要时打开和关闭其文件,或者在需要时完全不打开。

问题是我无法初始化此继承类型,因为File_Type是有限类型。如何编写我的File_Type函数以允许这样做?

  

.ads ...

Create_Mix_Card_Reader
  

.adb ...

   type Mix_IO_Device is abstract tagged limited
      record
         Block_Size : Positive;
         Input_File : File_Type;
         Output_File : File_Type;
      end record;

   type Mix_Card_Reader is new Mix_IO_Device with null record;

GNAT抱怨我不能将 function Create_Mix_Card_Reader return Mix_IO_Device_access is Ret : Mix_IO_Device_access := new Mix_Card_Reader'(16,null,null); begin return Ret; end Create_Mix_Card_Reader; 传递给成对的null,null成员,因为它们当然不兼容,空值是以前有{{1}时的剩余值}成员。似乎我必须在这里传递一些信息,但我不想过早地打开文件只是为了使编译器满意。

该怎么办?

编辑: 我有几个明显的选择:

  • 改为使用File_Type(但我仍然必须在其他位置保持文件的打开/关闭)。
  • 将所有File_Type对象分别存储在一个数组中,并像以前一样使用Streams对其进行引用,但这似乎很麻烦。
coffee3582 回答:Ada-如何初始化包含File_Type成员的有限标记类型?

这应该可以解决问题:

function Create_Mix_Card_Reader return Mix_IO_Device_Access is
   Ret : Mix_IO_Device_Access := new Mix_Card_Reader'(
     16,Input_Type => <>,Ouptut_Type => <>);
begin
   return Ret;
end Create_Mix_Card_Reader;

框符号是默认值的占位符。您至少需要Ada 2005才能在集合中使用它,并且不得使用位置表示法,详细信息在Ada 2005 Rationale中进行了说明。如果需要,可以将两个分配缩短为others => <>

,

您真的不需要初始化File_Type变量,因为它们从初始化(但未打开)开始。

给我的印象是您不是从使用访问类型开始的?尝试以下操作(不是所提出问题的答案,但可能仍然有用):

with Ada.Text_IO; use Ada.Text_IO;
package Wossname is

   type Mix_IO_Device is abstract tagged limited
      record
         Block_Size : Positive;
         Input_File : File_Type;
         Output_File : File_Type;
      end record;

   type Mix_Card_Reader is new Mix_IO_Device with null record;

   function Create_Mix_Card_Reader return Mix_IO_Device'Class;

end Wossname;

我不确定这里是否确切合法,但我认为这是“就地初始化”:

package body Wossname is

   function Create_Mix_Card_Reader return Mix_IO_Device'Class is
   begin
      return Ret : Mix_Card_Reader do
         Ret.Block_Size := 16;
      end return;
   end Create_Mix_Card_Reader;

end Wossname;

正如您所见,它可以编译(并运行!)。

procedure Wossname.Test is
   Reader : Mix_IO_Device'Class := Create_Mix_Card_Reader;
begin
   begin
      Create (Reader.Output_File,Name => "wossname.out",Mode => Out_File);
   exception
      when Use_Error =>
         Open (Reader.Output_File,Mode => Out_File);
   end;
   Put (Reader.Output_File,"hi!");
   Close (Reader.Output_File);
end Wossname.Test;
本文链接:https://www.f2er.com/3129055.html

大家都在问