高完整性系统:Programming and Proving with Pointers

news/2024/11/28 11:33:22/

目录

1. 引言

2. Pass By Value

3. Pass By Reference

4. Equality - Pass by Value

5. Equality - Pass by Reference


1. 引言

本章介绍霍尔逻辑和指针编程,通过Ada语言来阐述函数的传参方法。主要讲解了两种传参方式,分别是按值传递(Pass By Value)和按引用传递(Pass By Reference),同时讨论了这两种方式在比较两个对象是否相等时的不同表现。

2. Pass By Value

procedure Pass_By_Value istype Rec is recordX : Integer;end record;R : Rec;procedure Print_R isbeginPut("R.X: "); Put(R.X); New_Line;end Print_R;procedure CheckR(givenR : in out Rec) is beginput("In CheckR"); New_Line;givenR.X := R.X + 1;Print_R;end CheckR;beginR.X := 5;CheckR(R);Put("CheckR done"); New_Line;Print_R;
end Pass_By_Value;
  • 在这个例子中,我们创建了一个记录类型Rec,包含一个整型字段X,并且定义了一个该类型的变量R
  • 然后,我们定义了两个程序Print_RCheckRPrint_R程序负责打印R.X的值,CheckR程序接受一个Rec类型的参数givenR,并将其X字段设为R.X + 1,然后打印R的值。
  • 在主程序中,我们首先将R.X设为5,然后调用CheckR(R),最后打印R的值。
  • 霍尔逻辑中的重要思想是程序的状态通过程序变量来表现,这种按值传递的方式,被调用函数会复制一份实参的值,对复制的值进行修改并不会影响到原实参的值。因此,调用CheckR后,R的值并未改变。
    procedure CheckR(givenR : in out Rec) is beginput("In CheckR"); New_Line;givenR.X := R.X + 1;Print_R;end CheckR;

CheckR中的Print_R;会打印什么?

In CheckR
R.X         5
CheckR done
R.X         6

3. Pass By Reference

procedure Pass_By_Rererence istype Rec is record X: Integer;end record;-- pointer typetype RecPtr is access all Rec;-- allows constructing pointers to RR : aliased Recprocedure Print_R isbeginPut("R.X: "); Put(R.X); New_Line;end Print_R; -- takes a pointer as its argumentprocedure CheckR(givenR : in RecPtr) isbeginPut("In CheckR"); New_Line;givenR.X := R.X + 1;  print_R;end CheckR;beginR.X := 5;CheckR(R'Access);Put("CheckR done"); New_Line;Print_R;end Pass_By_Rererence;
In CheckR
R.X         6
CheckR done
R.X         6
  • 这个例子和前一个例子很类似,不同的是我们引入了指针类型RecPtr,并将R定义为别名(aliased)类型,使得我们可以获取R的引用(使用R'Access)。
  • CheckR程序中,我们接受一个RecPtr类型的参数givenR。在这个程序中,我们将givenR.X设为R.X + 1,然后打印R的值。
  • 在主程序中,我们首先将R.X设为5,然后调用CheckR(R'Access),最后打印R的值。
  • 按引用传递方式下,被调用函数得到的是实参的地址,对地址所指向的值进行修改,会直接影响到实参。因此,调用CheckR后,R的值被改变。

4. Equality - Pass by Value

procedure Pass_By_Value istype Rec is record X : Integer;end record;R : Rec;procedure CheckR(givenR : in out Rec) is begingivenR.X := R.X + 1;if GivenR = R then Put("Equal");elsePut("Not Equal");end if;New_Line;end CheckR;beginR.X := 5;CheckR(R);
end Pass_By_Value;
Prints “Not Equal”
  • 这个例子和第一个例子类似,不同的是在CheckR程序中,我们在修改givenR.X后,使用if语句检查givenRR是否相等。如果相等则打印“Equal”,否则打印“Not Equal”。
  • 按值传递时,由于givenRR的复制品,所以givenR的修改并不会影响到R,即使他们的X字段相等,givenRR在内存中仍然是两个不同的对象,因此打印出“Not Equal”。

5. Equality - Pass by Reference

procedure Pass_By_Reference istype Rec is record X : Integer;end record;type RecPtr is access all Rec;R : aliased Rec;procedure CheckR(givenR : in RecPtr) is begingivenR.X :=R.X + 1;if GivenR = R'Access then put("Equal");elsePut("Not Equal");end if;New_Line;end CheckR;beginR.X := 5;CheckR(R'Access);
end Pass_By_Reference;
Prints “Equal”
  • 这个例子和第二个例子类似,不同的是在CheckR程序中,我们在修改givenR.X后,使用if语句检查givenRR的引用(R'Access)是否相等。如果相等则打印“Equal”,否则打印“Not Equal”。
  • 按引用传递时,givenRR的引用,它们指向内存中的同一个对象。因此,即使我们修改了givenR.XgivenRR仍然相等,所以打印出“Equal”。

这些例子清晰地展示了按值传递和按引用传递的不同,以及它们在判断等价性时的不同表现。


http://www.ppmy.cn/news/109774.html

相关文章

【ros/ros2】LCN及ros2节点的LCN改写

文章目录 序言1. ros2两种节点类型2. LCN是什么3. LCN状态转换4. LCN状态转换要做的事5. LCN节点功能划分6. ros2节点的LCN改写 序言 背景:ros2节点改写为lifecycle node节点 1. ros2两种节点类型 Node:和ros1中一样的节点基类LifecycleNode&#xff…

Sequelize:Node.js 中的强大 ORM 框架

❤️砥砺前行,不负余光,永远在路上❤️ 目录 前言优势:提高效率,不用SQL即可完成数据库操作。 那什么是 Sequelize?主要特性:1、模型定义和映射:2、关联和联接:3、事务管理&#xff…

JavaEE HTTPS加密原理

HTTPS加密原理✿✿ヽ(▽)ノ✿ 文章目录 JavaEE & HTTPS加密原理1. 为什么要加密2. HTTPS加密原理2.1 初始想法2.2 引入非对称加密2.3 中间人攻击2.4 引入证书 JavaEE & HTTPS加密原理 1. 为什么要加密 例子:(运营商劫持) 你可能经常…

C语言实现守护进程

C语言实现守护进程 守护进程(daemon)是在后台运行的一种特殊进程,它没有控制终端,通常用于在系统启动时启动一些需要常驻后台的服务程序。 Linux的大多数服务器就是用守护进程的方式实现的。如web服务器进程http等。守护进程在后…

【Linux网络服务】Apache配置与应用

Apache配置与应用 一、构建虚拟Web主机1.1httpd服务支持的虚拟主机类型包括以下三种 二、基于域名的虚拟主机三、基于IP地址的虚拟主机四、基于端口的虚拟机五、Apache连接保持六、构建Web虚拟目录与用户授权限制七、日志分割 一、构建虚拟Web主机 虚拟Web主机指的是在同一台服…

制作嵌入式busybox rootfs系统

1、busybox下载 BusyBox 此篇使用版本BusyBox 1.31.1 (stable) 2、设置交叉编译环境变量 source environment-setup-aarch64-poky-linux或者其他架构的编译链工具 3、busybox编译设置 cd busybox-1.31.1 修改根目录Makefile中的CROSS_COMPILE和ARCH参数 比如ARCH ? ar…

基于ChatGPT的文本生成

ChatGPT是一种基于Transformer的自然语言处理模型,能够生成自然而流畅的文本序列。在文本生成领域,ChatGPT模型具有非常广泛的应用,可以用于实现文本摘要、文本生成、翻译等多种任务。 一、模型架构 基于ChatGPT的文本生成模型与基于ChatGP…

创建第一个.NET MAUI应用

1.打开VS2022,创建新项目,并选择.NET MAUI应用,然后点击下一步 2.输入项目相关配置,然后点击下一步 3. 选择框架版本,然后点击创建 4.项目创建成功后会自动打开概述页 5.平台框架切换 6.启动应用,如有下图提示,启动开发者模式 成功启动应用 7.修改应用 修改MainPage.xml如下图…