Ada函数参数是否为访问类型

Ada函数参数是否为访问类型,ada,Ada,我正在重构一些最初使用访问类型编写但尚未测试的代码。我发现访问类型在Ada中很麻烦,因为它们只能引用动态分配的项,并且显然不允许引用在编译时定义的项。(这是Ada83。) 但现在我来讨论这样一个函数: function Get_Next(stateInfo : State_Info_Access_Type) return integer; 我知道我可以很容易地传递访问类型的参数“contents”,而不是访问指针本身,因此我考虑将其编写为 function Get_Next(stateInfo

我正在重构一些最初使用访问类型编写但尚未测试的代码。我发现访问类型在Ada中很麻烦,因为它们只能引用动态分配的项,并且显然不允许引用在编译时定义的项。(这是Ada83。)

但现在我来讨论这样一个函数:

function Get_Next(stateInfo : State_Info_Access_Type) return integer;
我知道我可以很容易地传递访问类型的参数“contents”,而不是访问指针本身,因此我考虑将其编写为

function Get_Next(stateInfoPtr : State_Info_Type) return integer;
其中State\u Info\u Type是State\u Info\u Access\u Type所指的类型

通过这次重构,无论出于何种目的,我认为我仍然在将一个隐式指针传递回内容(使用.all语法)

我想从最底层的函数开始重构和测试,沿着调用链一路进行。我的目标是在执行时将访问类型从代码中推出

我是否正确理解了这一点,或者我遗漏了什么


据我所知,每个Ada编译器都通过引用在机器寄存器中传递大于fit的对象。强制不将数据写回例程的是编译器,而不是参数传递机制的细节

由于这段代码还没有经过测试,我认为您完全正确地重新编写了看起来像是用C语言编写的代码。但是,你根本不应该提及指针;你建议

function Get_Next(stateInfoPtr : State_Info_Type) return integer;
但这会更好

function Get_Next(stateInfo : State_Info_Type) return integer;
甚至(国际海事组织)作为

使用更标准的Ada样式!我的编辑器(Emacs,但GPS也可以这样做)将动态地将
state\u info
更改为
state\u info

事后想一想,您可能能够完全摆脱
状态\信息\类型\指针。你提到了
。所有的
,所以我想你有

SITP : State_Info_Type_Pointer := new State_Info_Type;
... set up components
Next := Get_Next (SITP.all);
但是呢

SIT : State_Info_Type;
... set up components
Next := Get_Next (SIT);
我认为最初的作者,可能还有OP都遗漏了一点,那就是Ada参数模式是如何工作的

引用@T.E.D


据我所知,每个Ada编译器都通过引用在机器寄存器中传递大于fit的对象。强制不将数据写回例程的是编译器,而不是参数传递机制的细节

Ada会自动执行此操作,并将参数模式作为描述信息流的一种方式(这不是C风格的引用/值难题)。看看有用的

让我担心的是,您继承的代码看起来像是作者使用了显式的
access
参数类型,作为让函数产生副作用的一种方式(在Ada-World中通常被认为是一件坏事)

我的建议是将您的功能更改为:

function Get_Next(State_Info : in State_Info_Type) return Integer;
并查看编译器是否告诉您是否要修改
状态信息
。如果是这样,您可能需要将功能更改为以下过程:

procedure Get_Next(State_Info : in out State_Info_Type;
                   Result     :    out Integer); 
这明确显示了信息流,而不需要知道寄存器大小或状态信息类型的大小


另外,Ada 2012将允许您拥有具有
in-out
参数的函数。

我不建议这样做,但您可以使用“Address”获取Ada 83中变量的指针

然后,您可以使用覆盖(这也是所有Ada83的东西)来实现访问


函数something(int_address:address)返回整数
是
x:整数;
对于x'地址,使用int_地址;
开始
--尽情地玩x。

我想第一行的“你”是指我。关于吉姆的问题,你很可能是对的,在这种情况下,你的答案将上升到顶部,“你”将不再有意义!为清晰起见进行了编辑:)“据我所知,每个Ada编译器都会通过引用在机器寄存器中传递大于合适值的对象。”——这是错误的。一些平台上的ICC Ada将在寄存器中传递已知大小的小记录或数组,如果它们可以放入4个寄存器中。这并不能真正回答问题。。。这是一个问答网站!OP说。。。“我发现Ada中的访问类型很麻烦,因为它们只能引用动态分配的项,并且显然不允许引用编译时定义的项。(这是Ada83。)”我对他的原始前提进行了更正-这不在本网站的权限范围内吗?
procedure Get_Next(State_Info : in out State_Info_Type;
                   Result     :    out Integer);