Ada:如何解决“循环单元依赖”?

2024-04-24

假设我有两条记录:Person and Animal。每条记录都在一个单独的包中。

包人:

with animals;
use animals;

package persons is 

    type person is record
     ...
     animalref: animalPOINTER;
     ...
    end record;

    type personPOINTER is access person;

end persons;

包装动物:

with persons;
use persons;

package animals is 
    type animal is record
     ...
     ownerref:  personPOINTER;
     ...
    end record;

    type animalPOINTER is access animal;

end animals;

我这里有循环单元依赖,编译器产生致命错误。

有人有解决此类问题的模式吗?

Thanks!


你需要limited with,它的引入正是为了解决这个问题。请参阅Ada 2005 第 4.2 节的基本原理 http://www.adaic.org/resources/add_content/standards/05rat/html/Rat-4-2.html.

Animals and Persons是对称的(我的编辑器调整了布局和大小写;我为每个组件添加了一个记录组件,以便下面的演示程序可以打印一些内容):

limited with Animals;
package Persons is

   --  One of the few things you can do with an incomplete type, which
   --  is what Animals.Animal is in the limited view of Animals, is to
   --  declare an access to it.
   type AnimalPOINTER is access Animals.Animal;

   type Person is record
      Name : Character;
      Animalref : AnimalPOINTER;
   end record;

end Persons;

limited with Persons;
package Animals is

   type PersonPOINTER is access Persons.Person;

   type Animal is record
      Name : Character;
      Ownerref : PersonPOINTER;
   end record;

end Animals;

演示程序具有完整的视图Animals and Persons。这个例子相当笨拙;您可以通过添加子程序来更好地组织事情Animals and Persons。请注意,body of Animals可以(并且必须)with Persons;如果需要使用任何东西Persons.

with Ada.Text_IO; use Ada.Text_IO;
with Animals;
with Persons;
procedure Animals_And_Persons is
   A : Persons.animalPOINTER := new Animals.Animal;
   P : Animals.PersonPOINTER := new Persons.Person;
begin
   A.all := (Name => 'a', Ownerref => P);
   P.all := (Name => 'p', Animalref => A);
   Put_Line (P.Name & " owns " & P.Animalref.Name);
   Put_Line (A.Name & " is owned by " & A.Ownerref.Name);
end Animals_And_Persons;

编译并运行时给出

$ ./animals_and_persons 
p owns a
a is owned by p
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ada:如何解决“循环单元依赖”? 的相关文章

  • Gson 使用存根序列化循环引用

    我正在尝试实现一些简单的 Json 序列化功能 但我很难应对 Gson 的巨大复杂性 所以基本上我有一堆实体类 它们通过大量循环引用相互引用 为了将此结构序列化为 JSON 我想跟踪已序列化的对象 实体类都实现了一个名为Identified
  • Ada.Containers.Functional_Maps 在 Ada2012 中可用吗?

    有关的信息Ada Containers Functional Maps https docs adacore com gnat rm docs html gnat rm gnat rm the gnat library html ada c
  • 使用相互或循环(循环)导入时会发生什么?

    在 Python 中 当两个模块尝试执行操作时会发生什么import彼此 更一般地说 如果多个模块尝试import在一个循环中 See also What can I do about ImportError Cannot import n
  • 从 Ada 访问 c 常量

    我有一个带有这样类型定义的头文件 ifndef SETSIZE define SETSIZE 32 endif typedef struct set unsigned array SETSIZE set t 要使用相应的 C 函数 我需要在
  • 确定 Ravenscar 程序中堆栈使用情况的最佳实践

    我正在使用 Ravenscar 子集编写一个 Ada 程序 因此 我知道执行时正在运行的任务数量 该代码是由 gcc 编译的 fstack check https gcc gnu org onlinedocs gnat ugn Stack
  • Python 中的循环导入依赖项[重复]

    这个问题在这里已经有答案了 假设我有以下目录结构 a init py b init py c init py c file py d init py d file py In the a包的 init py the c包已导入 但c fil
  • 使用 SPARK 证明选择排序算法

    我试图证明我在 Ada 中的选择排序实现是正确的 我尝试了一些循环不变量 但使用 gnatprove 只能证明内部循环的不变量 package body Selection with SPARK Mode is procedure Sort
  • 在 Ada 中立即开始循环的下一次迭代

    我想要一个无限循环 其中循环几乎贯穿整个程序 并且在任何时候 基于条件语句 我希望它退出循环的特定迭代并返回到顶部并执行 有办法做到这一点吗 它不必是无限循环 它可以是一个for循环 我只想让它进入该循环的下一次迭代 您可以使用 goto
  • 让 Ada(用 GNAT 编译)从当前目录外部导入文件?

    我正在大学学习编程入门课程 选择的语言是 Ada 我正在 Kate 中编码并使用 GNAT 4 6 3 进行编译 我们必须为我们的程序使用教师提供的库 如下所示 with foo use foo 当然 然后文件foo adb必须包含在与我的
  • ServiceStack.Text序列化循环引用

    我需要像这样序列化对象图 public class A public B Link1 get set public class B public A Link2 get set 这样json只得到两个实例 但又被正确反序列化了 例如 使用元
  • Mac OS 上的 Ada 编译器 GNAT

    我正在尝试使用 mac 上的终端编译 ada 但总是收到此错误 错误 x ada 中的 ada 值无效 有人知道如何解决这个问题吗 你可能没有安装Ada编译器 OSX自带的gcc不支持Ada 目前 有两种适用于 OSX 且支持 Ada 的免
  • GraphQL 代码中的 Javascript 循环依赖

    我是 Javascript 新手 不知道如何解决这个问题 我正在创建一个 GraphQL 服务来提供对数据库的查询 我想定义三种类型 个人 公司和关系 type Relation person Person company Company
  • 具有动态嵌套组件的角度循环依赖性

    我在互联网上寻找解决方案 但无济于事 不同情况等 所以请原谅下面的代码转储 我遇到的问题与循环依赖有关 代码转储是为了提供上下文 旁注 我对 Angular 和 Typescript 相当陌生 这个概念 当然 我正在尝试构建一组嵌套组件 它
  • 防止 Ada DLL 中的名称损坏

    有没有一种简单的方法可以防止在创建 Ada DLL 时 Ada 名称被破坏 这是我的 adb 代码 with Ada Text IO package body testDLL is procedure Print Call is begin
  • 如何正确设计数据库的这一部分(循环引用?)

    情况 一个公司有很多项目一个项目有很多标签一个项目只属于1家公司一个标签可以属于多个项目公司必须有权访问自己的标签 示例1 在第一张图片中 公司的所有标签都可以通过projects project tag 获得 但如果所有项目都被删除 那么
  • “敌人”不是在这个范围内宣布的吗?

    好的 这就是我的错误 Enemy 未在此范围内声明 错误位于 map h 文件中 即使 map h 包含敌人 h 如图所示 ifndef MAP H INCLUDED define MAP H INCLUDED include
  • 我应该如何解决 GNAT GPS“找不到库”问题并在 Mac 上构建我的第一个“Hello World”程序?

    我下载了 GNAT Community 2019 并安装在我的 Mac 上的主文件夹 Users leon opt GNAT 中 我在目录 Users leon opt GNAT 2019 bin 中运行命令 gps GPS 出现了 然后我
  • Visual Studio 2012 - 高效查找循环引用

    目前 如果我想检查解决方案中的循环引用 我选择Architecture Generate Dependency Graph For Solution 然后从打开的新选项卡中选择Layout Analyzers Circular Refere
  • 如何将 ImmutableJS Map 与 TypeScript 结合使用

    我有一个看起来像这样的树结构 interface TreeData id number text string children TreeData 我想将其包装到一个不可变的映射中 但由于我使用的是 TypeScript 所以我希望使用 g
  • 将所有代码放入 C++ 头文件中的优点和缺点?

    您可以构造一个 C 程序 以便 几乎 所有代码都驻留在头文件中 它本质上看起来像一个 C 或 Java 程序 但是 您至少需要一个 cppfile 来在编译时拉入所有头文件 现在我知道有些人绝对会讨厌这个想法 但我还没有发现这样做有任何令人

随机推荐

  • 如何迭代每隔一个数字

    阅读文档时 我注意到一句话 Rust 没有C stylefor 循环 所以 我想知道 如何制作一个相当于for i 0 i lt 10 i 2 我能想到的方法是这样的 for i in 0 10 if i 2 0 Do stuff Or e
  • 如何获取2d dict python中的所有键

    我有一本形式词典 d 123 2 1 3 1 124 3 1 125 2 1 126 1 1 那么 让我们看看二阶键 123 gt 2 3 124 gt 3 125 gt 2 126 gt 1 所以唯一的二阶键的总数是 1 2 3 现在 我
  • 在 Flash 对象上方显示图像

    我在这里面临着一个棘手的情况 这就是问题 我有一个 Flash 对象 我想在其上显示图像这些是我尝试过的技巧 1 玩转z index 没用 2 将wmode参数设置为透明 不透明 同样没有用 3 使用javascript并仅在页面加载后显示
  • 没有这样的模块“RestKit”与 cocoapods 和 swift

    我在一个全新的项目中遇到了这个问题 RestKit 和 Facebook SDK 都会出现此问题 奇怪的是 SwiftyJSON 工作得很好 我创建了一个全新的 swift 项目和一个 Podfile 其中包含 source https g
  • 当 CURLOPT_HTTPHEADER 需要“Content-Length”时

    我的应用程序的客户端中有此代码 ch curl init url curl setopt ch CURLOPT CUSTOMREQUEST GET curl setopt ch CURLOPT RETURNTRANSFER true cur
  • Ruby on Rails 过滤返回模型对象的属性

    我正在为 Rails 应用程序创建 API 我想返回User用于 API 调用但没有的对象crypted password salt or login token属性 有没有办法做这样的事情 do api fetch user u user
  • 命名空间 + 函数与类上的静态方法

    假设我已经或将要编写一组相关函数 假设它们与数学相关 从组织上来说 我应该 编写这些函数并将它们放入我的MyMath命名空间并通过引用它们MyMath XYZ 创建一个名为MyMath并使这些方法静态并引用类似的MyMath XYZ 为什么
  • iOS-示例中的协议和委托

    好吧 我正在寻找 但没有任何方法对我有用 以下代码基于许多教程和苹果文档 但我无法让它工作 有人可以帮忙吗 代码崩溃于 obj delegatee self 在 B h 类中 respondsToSelector 和 PerformSele
  • 尝试使用工作台将 postgresql 数据库迁移到 mysql 时出错

    我正在尝试按照本教程将 postgresql 数据库迁移到 mysql http mysqlworkbench org 2012 11 how to migrate postgresql databases to mysql using t
  • Healpy python-3..4 在 ubuntu-14.04 上的安装问题

    我是 ubuntu 新手 在 lenovo t410 上使用 ubuntu 14 04 和 python 3 4 为了安装 Healpy 我遵循了以下步骤 我已经使用安装了 python3 dev 包 sudo apt get instal
  • Visual Studio Code / powershell 命令历史记录向上键

    我可以通过什么方式在 Visual Studio Code 中记录之前输入的命令 例如 当我按下向上键时 我可以向上浏览之前的所有命令 如果可能的话 我想将这些记录到文件中 它们本地存储在哪里 我可以用节点之类的东西记录它吗 实际上 我自己
  • 在页面显示到屏幕之前删除 DOM 元素(在 Chrome 扩展中)

    我正在尝试创建一个扩展 该扩展将在页面显示到屏幕上之前删除某些页面元素 按 id 或类 我尝试在文档上使用事件侦听器 以 DOMContentLoaded 作为事件 但 javascript 似乎在页面显示给用户后执行 然后删除它 所以它不
  • 基于 Django 类的视图和表单集

    我有一个基于类的视图称为OrganizationsCreateView它包括附加到模型表单的表单集作为该表单的实例变量 当用户输入数据时 这可以正常工作 可以很好地创建一个新对象 当用户想要向表单集中添加其他行时 我有一个提交按钮 可以触发
  • iOS glGenerateMipmap 是同步的,还是可能是异步的?

    我正在开发一个在 OpenGL ES 中使用大纹理的 iPad 应用程序 当场景首次加载时 我在天花板上看到了几帧的大型黑色伪像 如下图所示 就好像更高级别的 mipmap 尚未填充 在后续帧中 天花板正确显示 当我开始使用 mipmapp
  • 如何使用 mongocxx c++ 驱动程序递归生成 Mongodb 文档?

    如何使用 mongocxx c 驱动程序递归生成 Mongodb 文档 1 我使用 mongocxx c 驱动程序 v 3 和 c 11 2 这是我的 main cpp 方法 它解析十六进制字符串并生成 mongocxx 代码 如下所示 控
  • 在 Trie 中插入值

    我在 SML 目录中找到了 Trie 的实现 signature DICT sig type key string concrete type type a entry key a concrete type type a dict abs
  • Android 无法初始化 Visualizer 引擎,错误:-4

    我有一个错误 public class VisualizerCapture extends Activity implements Visualizer OnDataCaptureListener private Visualizer mV
  • 玩 Scala 和线程安全

    该项目是使用编写的Play framework and Scala语言 我已经实施了compile time dependency 我按照 Play 中的这个例子进行操作 https github com playframework pla
  • 通过循环遍历另一个数组来填充新数组

    我正在做一些计算 根据用户输入 应进行计算并构建包含数据的表格 我的第一个数组 calcTable正在按预期工作 但是每一行代表一个月 在我的决赛表中 我想要一行代表一年 所以我目前正在尝试填充一个新数组 calcTableShow将保存这
  • Ada:如何解决“循环单元依赖”?

    假设我有两条记录 Person and Animal 每条记录都在一个单独的包中 包人 with animals use animals package persons is type person is record animalref