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:如何解决“循环单元依赖”? 的相关文章

  • 标准 ada 包含路径是什么

    我在使用 apt get 安装的 Ubuntu 上使用 gnat 4 6 我需要知道在哪里安装下载的库 例如APQ http sourceforge net projects apq 我应该设置什么ADA INCLUDE PATH and
  • Ada 中类型/包别名的单独声明

    我想声明一些 用户定义的编译器常量 以使我的规范文件尽可能保持 常量 这在 C 中很常见 例如 misc config hh namespace misc typedef std shared ptr a A ptr namespace a
  • 在Android中使用Ada代码

    Android 中是否有可能使用旧的 Ada 代码 我有一个用 Ada 编写的旧脚本 如果我可以直接在 Android 中使用该代码 通过 NDK 或 JNI 等 那就太好了 这可能吗 或者我应该移植代码 以下是我找到的一些链接 但我不太明
  • Ada 中的字符串数组

    我在 Ada95 中有一个程序 我必须在其中创建一个字符串数组 该数组可以包含可变长度的字符串 例子 我已经声明了一个数组 其中所有索引都可以存储大小为 50 的字符串 当我为上面的数组分配一个较小的字符串时 我收到 约束错误 Code p
  • Python循环引用

    尝试在同一个文件中拥有两个相互引用的类 让它发挥作用的最佳方法是什么 class Foo object other Bar class Bar object other Foo if name main print all ok 问题似乎在
  • 如何使用“单独”关键字

    我无法找出关键字separateAda 及其深度概念 请举个小例子帮助我理解 假设我有一个嵌套过程 with ada text io use ada text io procedure main is procedure proc is b
  • 从 Ada 程序启动可执行文件并读取结果

    I found this https stackoverflow com questions 32663224 why isnt my gnats standout file descriptor working问题和第一个答案包含一些示例
  • 将分隔的字段合并为一个

    我在 Ada 工作 我有一个非常丑陋的类型 我无法修改 我想做一些易于使用的事情 类型是这样的 for T Ugly Type Alignment use 4 for T Ugly Type Size use 48 for T Ugly T
  • Java中的静态循环依赖

    对于以下代码 class A public static int X static X B Y 1 public class B public static int Y A X 1 static public static void mai
  • 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
  • Delphi:更好的设计以避免循环单元引用?

    我在 Delphi 10 中有一个三角形网格结构 出于性能原因 我将网格顶点 三角形面等的数据存储在 TList 的后代中 我让 TList 为列表中的每个成员进行计算 对于这些计算 我需要访问 TMesh 结构的某些字段 因此 在创建 T
  • 使用 EntityObjects 进行 Ajax 绑定的 Telerik MVC Grid 出现循环引用异常

    我已经使用 Telerik MVC Grid 有一段时间了 这是一个很好的控件 但是 与使用网格和 Ajax 绑定到从实体框架创建和返回的对象相关的一件烦人的事情不断出现 实体对象具有循环引用 当您返回IEnumerable
  • 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
  • 循环依赖注入角度2

    我一直在为注射而苦苦挣扎services进入彼此 以下博客构造函数中的循环依赖和依赖注入 http misko hevery com 2008 08 01 circular dependency in constructors and de
  • Ada T'Class 的基础知识

    虽然有点不好意思问这个问题 但我知道这是最好的 我已经使用 Ada 编程很多年了 并且几乎可以流利地理解该语言的每个部分 然而 我似乎始终无法完全理解 T Class 借用别人的话 有人可以 像我五岁一样解释一下吗 编辑 我买它只是为了拥有
  • Kotlin 中带有 val 的循环引用

    在 Kotlin 中 假设我有data class A val f B and data class B val f A 我想初始化本地var a A and var b B这样a f is b and b f is a A f and B
  • 创建不兼容的数字子类型

    在 Ada 中 可以创建不兼容的等效数字类型 type Integer 1 is range 1 10 type Integer 2 is range 1 10 A Integer 1 8 B Integer 2 A illegal 这可以
  • 从 Ada 代码构建静态库,无需 GNAT 即可链接

    我正在尝试从 Ada 代码创建一个静态库 该库可以与一些 C 代码链接 而无需使用 GNAT 工具进行最终链接 我的用例是 我正在尝试将一个用 Ada 编写的库交付给一个为嵌入式目标构建的 C 代码库 为目标构建最终二进制文件的工具链不包含
  • ‘access’参数模式有什么用处?

    Ada 中有三种传递参数的 正常 模式 in out and in out 但还有第四种模式 access 有什么需要它们的吗 即 否则不可能实现的事情 现在 我确实知道 GNAT JVM Ada 编译器在导入的 库 规范中大量使用了它们
  • 在 Ada 中定义通用标量类型包

    我想通过制作一个用于操作多项式的 Ada 包来测试编写 Ada 包的水 可以为多种代数结构定义多项式 因此为了反映这一点 我想使该包通用 以便它可以与浮点数 整数或其他数字子类型一起使用 我现在想说 我对 Ada 的类型系统如何工作或者它的

随机推荐

  • 如何迭代每隔一个数字

    阅读文档时 我注意到一句话 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