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