在c ++中考虑以下简单函数...
int function(int *a, int x)
{
return x*x;
}
我的问题是:如何将上述函数转换为ada函数,因为我无法编写指针。
提前致谢
答案 0 :(得分:3)
您可以将指针(访问类型)传递给Ada函数或过程,但您通常不想这样做。
将指针传递给C函数的通常原因是允许函数修改指向的东西。
C没有更好的方法让你这样做;阿达确实。
不是传递值或指针(或在C ++中引用),而是使用适当的模式传递对象:In,Out,In Out,描述如何使用参数。
所以你可能想写
function My_Func (a : in out Integer;
x : in Integer) return integer is
begin
return x * x;
end My_Func;
但有几个问题:
out
或in out
参数;它们是为程序保留的(C称之为" void functions")最后一个可能看起来很奇怪:Ada的功能在理论上是数学意义上的功能,而不是C的意义和任何旧的子程序"。也就是说,他们接受参数,处理它们而不修改它们或其他任何东西并返回结果。这些被称为纯函数,就像proper operators一样,你可以更安全地优化它们。
与一些更严格的语言不同,Ada允许不纯的函数,这可能会修改状态(例如,在每次调用时更新随机生成器中的种子),并且截至2012年还允许out
和{ {1}}参数;合法用途是更新" OK"标记在文件读取等一系列操作中。
那么我们通常如何使用in out
参数?在一个像语句一样的过程中,可以修改事物(赋值)或改变状态。因此,如果您打算使用参数Out
,您可以写:
a
将函数视为表达式的抽象,而过程则抽象语句。 (这会导致一些明显的重构;用函数,语句或块替换表达式)。
如果这实际上没有回答问题而您认为您可能真的需要指针,请添加评论或更新问题。
答案 1 :(得分:1)
除了Brian的回答,您可以声明
type Arr is array (Integer range <>) of Integer;
(也就是说,Arr
的所有实例都是包含由Integer
索引的Integer
的数组,但不同的实例可以有不同的边界)。编写使用Arr
s。
如果您只想阅读值,请使用(或默认)in
模式:
function Sum (A : Arr) return Integer
is
Total : Integer := 0;
begin
for J in A'Range loop
Total := Total + A (J);
end loop;
return Total;
end Sum;
如果您不关心以前的内容,请使用out
模式:
procedure Initialize (A : out Arr; To : Integer)
is
begin
for J in A'Range loop
A (J) := To;
end loop;
end Initialize;
如果您想更新以前的内容,请使用in out
模式:
procedure Multiply (A : in out Arr; By : Integer)
is
begin
for J in A'Range loop
A (J) := A (J) * By;
end loop;
end Multiply;
坚持使用Ada 2005,不允许函数包含out
或in out
个参数,但(如NWS所说)您可以使用access
模式:
function Divide_And_Sum (A : access Arr; By : Integer) return Integer
is
Sum : Integer := 0;
begin
for J in A'Range loop
A (J) := A (J) / By;
Sum := Sum + A (J);
end loop;
return Sum;
end Divide_And_Sum;
但是你需要声明实际的数组aliased
:
T : aliased Arr := (0, 1, 2, 3, 4, 5);
并在通话中传递’Access
:
New_Sum := Divide_And_Sum (T'Access, 2);
答案 2 :(得分:0)
在Ada中,指针未被隐式定义(通过使用*),您需要明确定义其类型,如下所示:
type Int_Ptr is access Integer;
function My_Func (A : in Int_Ptr;
X : in integer) return Integer is
begin
return X*X;
end My_Func;
然后你可以生成一个与你提供的C ++完全相同的函数。 这有助于你的问题我不确定。 @Brian Drummond在他的回答中对此进行了有益的讨论。