gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:24:23 24 4
gpt4 key购买 nike

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

但现在我来到了这样一个函数:

function Get_Next(stateInfo : State_Info_Access_Type) return integer;

我知道我可以很容易地传递访问类型的参数“内容”而不是访问指针本身,所以我正在考虑将其写成

function Get_Next(stateInfoPtr : State_Info_Type) return integer;

其中 State_Info_Type 是 State_Info_Access_Type 所指的类型。

通过这种重构,出于所有意图和目的,我认为我仍然真正将相当于隐式指针的内容传递回内容(使用 .all)语法)。

我想从最低级别的函数开始重构和测试,然后逐步向上调用链。我的目标是在进行时将访问类型推出代码。

我理解正确还是我遗漏了什么?

最佳答案

我认为原作者,可能还有 OP 遗漏了一点,即 Ada 参数模式的工作原理。

引用@T.E.D

Every Ada compiler I know of under the hood passes objects larger than fit in a machine register by reference. It is the compiler, not the details of your parameter passing mechanisim, that enforces not writing data back out of the routine.

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

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

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

function Get_Next(State_Info : in State_Info_Type) return Integer;

并查看编译器是否告诉您您是否正在尝试修改 State_Info。如果是这样,您可能需要将函数更改为如下过程:

procedure Get_Next(State_Info : in out State_Info_Type;
Result : out Integer);

这显式地显示了信息流,而无需知道寄存器大小或 State_Info_Type 的大小。

顺便说一句,Ada 2012 将允许您拥有具有in out 参数的函数。

关于Ada 函数参数是否作为访问类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31032244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com