ada中的地址表示

时间:2010-04-27 09:31:55

标签: ada memory-address

我已经粘贴了一个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',那么arithmentic Storage_Offset'(40)如何满足实际的实现?

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

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

由于 麦迪

2 个答案:

答案 0 :(得分:2)

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's AdaMagic,它提供了一个服务,将Ada代码转换为ANSI C.回到当天(之前的两个所有者)他们使用声称它产生了可维护的C代码。无论哪种方式,它都可能比没有经验的(在Ada中)开发人员尝试手工完成所有成本便宜得多。

答案 1 :(得分:2)

my_func(int P1,int P2)
{
  return P2 + Storage_Offset'(4);
}

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

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

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

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

Myarr_Type是一个Character数组,任何常见架构上的任何普通编译器都将是一个标准的8位字节。因此Myarr_Type个对象的长度为11个字节,而不是44个,而Myarr('A')'Address + 4将是Myarr('E')的地址。

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

Myarr (Myarr'Last)'Address