Ada 中的 In/Out 与 Out

2024-06-02

我有一个简短的艾达问题。如果我有一个程序may写出一个变量,或者我might不用管它,它应该是一个Out参数或In Out范围?我想这可以归结为一个问题:

如果调用者调用参数如下的过程,它会看到什么Out但该过程不触及参数。它看到相同的值吗?未定义的行为?

编译器不会抱怨,因为它看到了对Out变量...它恰好位于条件中,可能无法到达它,并且编译器不会费心检查所有路径。

我怀疑安全的赌注是将参数标记为In Out,但我想知道这是否有必要或者只是在风格上更可取。

Thanks!

-prelic


在 Ada 中,当一个过程带有out参数不会向该参数写入任何内容,传回调用者的结果是不明确的。这意味着调用者中该变量中的任何内容都会在从过程返回时被垃圾覆盖。

Ada 中的最佳实践是明确初始化所有out在程序开始时使用合适的默认值的参数。这样,过程之外的任何代码路径都会将有效数据传回调用者。

如果调用者中有一些内容might如果要通过程序进行更改,则必须使用in out范围。

来自艾达95 RM 6.4.1 (15) http://www.adaic.org/resources/add_content/standards/05rm/html/RM-6-4-1.html:

对于任何其他类型,形式参数未初始化。如果是复合的,则评估实际参数到形式的名义子类型的视图转换(这可能会引发 Constraint_Error),并且形式的实际子类型是视图转换的子类型。如果是基本形式,形式的实际子类型由其名义子类型给出。

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

Ada 中的 In/Out 与 Out 的相关文章

  • Ada 中的派生类型和子类型

    有什么区别 首先 术语 它是 Ada 不是 ADA 它是以 Ada Lovelace 命名的 它不是一个缩写词 子类型与其基类型兼容 因此您可以将基类型的操作数与基类型的操作数混合 例如 subtype Week Days is Integ
  • Ada:在块语句中写入文件

    我正在处理一个数组 其长度在程序执行期间确定 所以我正在利用block我可以在其中设置数组限制的语句 我在将数组的元素写入文件时遇到问题因为我在写入过程中使用了存根 我删除了存根 使所有内容都在同一代码中 虽然现在我的代码编译并运行 它没有
  • 在 GPS (Ada IDE) 中使用 glib.h 进行编译时出现问题

    我在尝试在 GPS 中编译 Ada 代码时遇到一些麻烦 当我将 GPS 放入包裹中时 它显示丢失 我尝试使用 apt get 安装 确实如此 但错误仍然存 在 接下来我能做什么 我在 x64 Ubuntu 12 04 上运行 GPS 这是我
  • Ada 中有“this”关键字吗?

    具体来说 任务有没有办法获得对其自身的引用 例如 task type someTask type someTaskAccessor is access someTask task body someTask is pointerToTask
  • Ada 与 Netbeans

    我下载了 Netbeans 插件 用于使用 Ada 进行编程 但是 我不知道如何将Eclipse链接到Ada平台库 什么应该链接到 IDE lib 等 bin 我不知道该怎么办 安装后Ada 插件模块 http wiki netbeans
  • 如何在 Ada 中从其他字符串构建字符串?

    我想在日志文件中输出标题行 然后在数据之前输出一行 为此 我创建了一个标题字符串 然后输出相同数量的 但下面的代码总是失败并出现 CONSTRAINT ERROR 因为生成的字符串不是 1024 个字符 在 Ada 中 字符串赋值需要完全相
  • Ada:从文件中读取

    我正在尝试读取一个包含单列的文件Long Float值在Ada如下 with Ada Text IO use Ada Text IO with Ada Long Float Text IO with Ada Sequential IO pr
  • 将从 C 例程分配的数组传递给 Ada

    将结构 记录数组从 Ada 传递到 C 例程是一回事 在本例中 内存管理是在 Ada 中完成的 但是在与第三方库接口时经常会出现这样的问题 内存管理是在C部分完成的 例如 对于 C 结构 typedef struct MYREC int n
  • “在 SPARK Ada 中接受挑战”- 后置条件下的总和鬼函数有意外行为

    我正在 SPARK Ada 中编写一个软件 它需要后置条件来验证函数返回值是否等于数组的求和值 在证明函数所在的文件后 我不断收到一个错误 该错误并没有完全加起来 没有双关语的意图 我将发布代码的屏幕截图以便更好地查看 大小为 10 的数组
  • ADA 文件名与包名称

    我继承了一个 ADA 程序 其中源文件名和包文件名不遵循默认命名约定 ADA 对我来说是新的 所以我可能会错过一些简单的东西 但我在 GNAT Pro 用户指南中看不到它 这个类似的问题 https stackoverflow com qu
  • 确定 Ravenscar 程序中堆栈使用情况的最佳实践

    我正在使用 Ravenscar 子集编写一个 Ada 程序 因此 我知道执行时正在运行的任务数量 该代码是由 gcc 编译的 fstack check https gcc gnu org onlinedocs gnat ugn Stack
  • 创建不兼容的数字子类型

    在 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 中立即开始循环的下一次迭代

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

    我正在大学学习编程入门课程 选择的语言是 Ada 我正在 Kate 中编码并使用 GNAT 4 6 3 进行编译 我们必须为我们的程序使用教师提供的库 如下所示 with foo use foo 当然 然后文件foo adb必须包含在与我的
  • Ada:如何解决“循环单元依赖”?

    假设我有两条记录 Person and Animal 每条记录都在一个单独的包中 包人 with animals use animals package persons is type person is record animalref
  • ‘access’参数模式有什么用处?

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

    我正在编写一个 Ada 程序 该程序应该对字母字符进行大小写转换 该程序使用 1 2 或 3 个命令行参数 我几乎已经把事情写下来了 但我不知道如何进行论证 命令行参数是 单个字符指定是否要进行大写转换或小写转换 应用于输入 U 或 u 表
  • 在 Ada 中定义通用标量类型包

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

    如何为对数组元素求和的函数编写 Spark 后置条件 Spark 2014 但如果有人向我展示如何为早期的 Spark 做到这一点 我应该能够适应它 所以如果我有 type Positive Array is array Positive
  • 在 Ada 中使用递归绘制保龄球瓶(金字塔)

    我知道这是通过展示我最不复杂的作品来推动社区的善意 期待有人来拯救我 但我别无选择 没有什么可失去的 过去几周我已经浏览了数据包 文件 类型 标志和框 但没有涉及太多递归 特别是不要用递归来绘图 我的考试大约还有一周时间 我希望有足够的时间

随机推荐