指针用C和其他语言

时间:2014-03-28 20:35:29

标签: pointers

在c ++中考虑以下简单函数...

int function(int *a, int x)
{
     return x*x;
}

我的问题是:如何将上述函数转换为ada函数,因为我无法编写指针。

提前致谢

3 个答案:

答案 0 :(得分:3)

您可以将指针(访问类型)传递给Ada函数或过程,但您通常不想这样做。

将指针传递给C函数的通常原因是允许函数修改指向的东西。

C没有更好的方法让你这样做;阿达确实。

不是传递值或指针(或在C ++中引用),而是使用适当的模式传递对象:In,Out,In Out,描述如何使用参数。

  • In:参数只是一个输入,无法修改。 (这是默认设置;未指定模式,您将获得模式输入。
  • Out:参数是一个输出(对于一个过程:函数不应该有Out参数,但是Ada-2012放宽了这个规则),程序将更新参数中的值。
  • In Out:毫不奇怪,无论是输入还是输出。

所以你可能想写

function My_Func (a : in out Integer;
                  x : in     Integer) return integer is
begin
   return x * x;
end My_Func;

但有几个问题:

  1. 你不能命名它"功能"因为这是一个保留字
  2. 未使用的参数是错误
  3. (直到Ada-2012)你不能从函数中获得outin out参数;它们是为程序保留的(C称之为" void functions")
  4. 最后一个可能看起来很奇怪: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,不允许函数包含outin 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在他的回答中对此进行了有益的讨论。