2

我在下面粘贴了一个 Ada 语言的代码。我需要对一些实现进行一些说明。

  C  : character;

  Char : character;
  type Myarr_Type is array (character range 'A'..'K') of character;
  Myarr : Myarr_Type := ('A','B','C','D','E','F','G','H','I','J','K');

  Next_Address := Myarr'address --'
  Last_Address := Next_Address + Storage_Offset'(40); --'

   return P2 + Storage_Offset'(4); --'

  Last_Address := Next_Address + Storage_Offset'(4); --'

现在我的疑问是1)P2 + Storage_Offset'(4)实际上是什么意思。这是否意味着它返回数组中下一个元素的地址,即Ada中的'B'.Storage_Offset'(4)-这样做表示 4 位或 4 字节的内存。2) 如果我假设 Last_Address 指向数组的最后一个元素“K”,那么算术 Storage_Offset'(40) 如何满足实际实现?

如果您需要更多说明,请回复我。

请假设该功能不存在。事实上,我有一些 ada 文件,我的工作是将它们转换为 C 文件。因为我是 ada 的初学者,所以我遇到了很多问题。如果有任何混淆,请见谅

谢谢麦迪

4

2 回答 2

3

Storage_Offset是包System.Storage_Elements中的一种特殊整数类型,可以添加到 类型的对象中System.Address。确切的单位AddressStorage_Offset是什么是实现定义的,但可能几乎所有存在的实现都使用字节。所以Next_Address + Storage_Offset'(4)意味着“地址超过 Next_Address 所指的四个字节”。

你谈到了 Ada 移植。在 99% 的情况下,这是一个非常愚蠢的想法(%1 是当您需要移植到没有 Ada 编译器的平台时)。无论您移植哪种语言,我都会说同样的话。这是一个傻瓜的游戏。在移植代码时,您可以期望的最好结果是,经过大量的努力,它可以像以前一样工作。编码最好的情况永远不会发生。

Ada 可以很好地与 C 接口,因此在 Ada 中保持不变的代码并且只“移植”你需要更改的东西会更聪明。

如果您遇到任何任务代码、受保护类型或自定义流,您将陷入痛苦的世界。这些东西并没有简单的 C 类比。

如果您的老板真的对 C 或其他东西有兴趣,我建议您研究一下Sofcheck 的 AdaMagic,它提供将 Ada 代码转换为 ANSI C 的服务。在过去(之前有两个所有者),他们曾经声称它产生了可维护的C 代码。无论哪种方式,它都可能比让一个没有经验的(在 Ada 中)开发人员尝试手动完成所有工作要便宜得多。

于 2010-04-27T20:58:56.577 回答
2
my_func(int P1,int P2)
{
  return P2 + Storage_Offset'(4);
}

嗯,这是一个 C 函数,它的主体是用 Ada 编写的。没有“+”运算符采用整数和 Storage_Offset;也许你正在寻找

function "+"(Left : Address; Right : Storage_Offset)
 return Address;

也许你打算打电话my_func(something, Next_Address)

在这种情况下,表达式将返回 4Storage_Element秒后的地址,即字节Myarr('A')

Myarr_Type是一个 的数组Character,对于任何通用架构上的任何普通编译器,它都将是一个标准的 8 位字节。所以Myarr_Type对象将是 11 个字节长,而不是 44 个字节,并且Myarr('A')'Address + 4Myarr('E').

如果您想要 的最后一个元素的地址Myarr,请尝试

Myarr (Myarr'Last)'Address
于 2010-04-27T21:11:00.120 回答