(delphi11最新学习资料) Object Pascal 学习笔记---第5章第1节(开放式数组形参)

5.1.5 开放式数组形参

​ 对于数组的使用有一个非常特殊的场景,即用于向函数传递一个灵活的参数列表。除了直接传递数组外,本节和下一节还将解释两种特殊的语法约定。在上一段代码中的 Format 函数就是一个使用了这种约定的函数,它的第二个参数接受一个就地定义的数组值。

​ 与 C 语言(以及其他一些基于 C 语法的语言)不同,在传统的 Pascal 语言中,函数或过程总是有固定数量的参数。然而,在 Object Pascal 中,有一种方法可以使用就地定义的数组向例程传递不同数量的参数,这种技术被称为开放数组参数。

注解:从历史上看,开放数组参数早于动态数组,但如今这两种功能的工作方式非常相似,几乎无法区分。这就是为什么我在讨论动态数组后才介绍开放数组参数。

​ 定义开放式数组形参与定义类型化动态数组类型的基本相同,但以const指示符作为前缀。 这意味着您可以指定参数的类型,但不需要指出数组要有多少个该类型的元素。 下面是这样一个定义的例子,摘自OpenArray的示例:

function Sum(const A: array of Integer): Integer;
varI: Integer;
beginResult := 0;for I := Low(A) to High(A) doResult := Result + A[I];
end;

​ 您可以通过传递一个整数常量表达式的数组(其中也可以包含变量,作为用于计算表达式各部分的值)来调用该函数:

X := Sum([10, Y, 27 * I]);

​ 给定一个整数动态数组,可以直接将其传递给需要相同基本类型(本例中为整数)的开放数组形参的例程。下面是一个将完整数组作为参数传递的示例:

varList: array of Integer;X, I: Integer;
begin// 初始化数组SetLength(List, 10);for I := Low(List) to High(List) doList[I] := I * 2;// 使用我们的函数获取列表元素的总和X := Sum(List);

​ 这适用于动态数组。如果你有一个与基本类型相匹配的静态数组,你也可以将它传递给期待一个开放数组形参的函数,或者你可以调用 Slice 函数只传递现有数组的一部分(如它的第二个参数所示)。下面的代码段(也是 OpenArray 示例的一部分)展示了如何将静态数组或其一部分传递给 Sum 函数:

varList: array[1..10] of Integer;X, I: Integer;
begin// 初始化数组for I := Low(List) to High(List) doList[I] := I * 2;// 使用我们的函数获取列表元素的总和X := Sum(List);Show(X.ToString);// 对数组的一部分求和X := Sum(Slice(List, 5));Show(X.ToString);

可变类型的开放式数组形参

​ 除了有类型的开放数组参数外,Object Pascal语言还允许定义可变类型或无类型的开放式数组。这种特殊类型的数组的元素数量未定义,但这些元素的数据类型也是未定义的,同时还可以传递不同类型的元素。这是该语言中类型不完全安全的领域之一。。

​ 从技术上讲,您可以定义一个类型为array of const的参数,将一个具有未定义数量且元素类型不同的数组传递给函数。例如,这是Format函数的定义(我们将在第6章中了解如何使用该函数,同时已在一些演示中使用过):

function Format(const Format: string;const Args: array of const): string;

​ 第二个参数是一个开放式数组,它接收未定义数量的值。实际上,您可以用以下方式调用此函数:

N := 20;
S := 'Total:';
Show(Format('Total: %d', [N]));
Show(Format('Int: %d, Float: %f', [N, 12.4]));
Show(Format('%s %d', [S, N * 2]));

​ 请注意,您可以以常量、变量值或表达式的形式传递参数。声明此类函数很简单,但如何编写代码呢?如何知道参数的类型?可变类型开放式数组参数的值与 TVarRec 类型元素兼容。

注解: 不要混淆 TVarRec 记录和变量类型使用的 TVarData 记录。这两种结构的目的不同,不兼容。甚至可能的类型列表也是不同的,因为 TVarRec 可以保存 Object Pascal 数据类型,而 TVarData 可以保存 Windows OLE 数据类型。本章稍后将介绍变体(Variants)。

​ 以下是可变类型的开放式数组值和 TVarRec 记录支持的数据类型:

vtInteger           vtBoolean           vtChar
vtExtended          vtString            vtPointer
vtPChar             vtObject            vtClass
vtWideChar          vtPWideChar         vtAnsiString
vtCurrency          vtVariant           vtInterface
vtWideString        vtInt64             vtUnicodeString

​ 记录结构有一个类型字段(VType)和变体(variant)字段,您可以使用以访问实际数据。这是该结构高级用法,稍后将更多介绍。

​ 一种常见的方法是使用case语句处理您在此类调用中接收的不同类型的参数。在SumAll函数示例中,我希望能够对不同类型的值求和,将字符串转换为整数,将字符转换为相应的序数值,并将布尔值True转换为1。这段代码确实相当高级(并使用了指针解引用),所以如果现在不完全理解它也没关系:

function SumAll(const Args: array of const): Extended;
varI: Integer;
beginResult := 0;for I := Low(Args) to High(Args) docase Args[I].VType ofvtInteger:Result := Result + Args[I].VInteger;vtBoolean:if Args[I].VBoolean thenResult := Result + 1;vtExtended:Result := Result + Args[I].VExtended^;vtWideChar:Result := Result + Ord(Args[I].VWideChar);vtCurrency:Result := Result + Args[I].VCurrency^;end; // Case
end;

​ 我已将此函数添加到OpenArray示例中,并在以下方式调用它:

varX: Extended;Y: Integer;
beginY := 10;X := SumAll([Y * Y, 'k', True, 10.34]);Show('SumAll: ' + X.ToString);
end;

​ 此调用的输出将Y的平方、K的序数值(为107)、布尔值的1以及扩展数的总和相加,结果为:

SumAll: 218.34

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/257219.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这种学习单片机的顺序是否合理?

这种学习单片机的顺序是否合理? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!&#xff01…

单片机学习笔记---DS18B20温度传感器

目录 DS18B20介绍 模拟温度传感器的基本结构 数字温度传感器的应用 引脚及应用电路 DS18B20的原理图 DS18B20内部结构框图 暂存器内部 单总线介绍 单总线电路规范 单总线时序结构 初始化 发送一位 发送一个字节 接收一位 接收一个字节 DS18B20操作流程 指令介…

OpenAI ChatGPT 记忆功能怎么实现?

你的聊天助手现在能“记住”你的对话了! 2月14日凌晨,OpenAI宣布正在测试ChatGPT的新功能——记住用户提问内容,并自由控制内存。这意味着,ChatGPT能帮你记住那些重要的聊天内容,让你的对话更流畅、更自然。 想象一下…

高效的工作学习方法

1.康奈尔笔记法 在这里插入图片描述 2. 5W2H法 3. 鱼骨图分析法 4.麦肯锡7步分析法 5.使用TODOLIST 6.使用计划模板(年月周) 7. 高效的学习方法 成年人的学习特点: 快速了解一个领域方法 沉浸式学习方法: 沉浸学习的判据&am…

2024年 前端JavaScript入门到精通 第一天

主要讲解JavaScript核心知识,包含最新ES6语法,从基础到API再到高级。让你一边学习一边练习,重点知识及时实践,同时每天安排大量作业,加深记忆,巩固学习成果。 1.1 基本软件与准备工作 1.2 JavaScript 案例 …

EsayExcel文件导入导出

目录 准备工作 监听器类 导入测试 导出测试 上传Excel 下载Excel 混合导出模板导出 headRowNumber(1)&#xff1a;从第几行开始读 准备工作 导入依赖 <!--easyexcel--> <dependency><groupId>com.alibaba</groupId>x<artifactId>easye…

小白水平理解面试经典题目LeetCode 102 Binary Tree Level Order Traversal【二叉树】

102. 二叉树层次顺序遍历 小白渣翻译 给定二叉树的 root &#xff0c;返回其节点值的层序遍历。 &#xff08;即从左到右&#xff0c;逐级&#xff09;。 例子 小白教室做题 在大学某个自习的下午&#xff0c;小白坐在教室看到这道题。想想自己曾经和白月光做题&#xff0c…

Spring Boot 笔记 017 创建接口_新增文章

1.1实体类增加校验注释 1.1.1 自定义校验 1.1.1.1 自定义注解 package com.geji.anno;import com.geji.validation.StateValidation; import jakarta.validation.Constraint; import jakarta.validation.Payload; import jakarta.validation.constraints.NotEmpty;import jav…

vuex中Actions详解,代码示例

Vuex 中的 Actions 是用于触发mutations 的一种方式&#xff0c;它可以包含异步操作&#xff0c;并通过提交(commit)mutations 来改变 store 的状态。以下是 Actions 的详细介绍、使用步骤和示例代码&#xff1a; Actions 的介绍&#xff1a; Actions 是 Vuex 中的一个重要概…

Hive的相关概念——架构、数据存储、读写文件机制

目录 一、架构及组件介绍 1.1 Hive整体架构 1.2 Hive组件 1.3 Hive数据模型&#xff08;Data Model&#xff09; 1.3.1 Databases 1.3.2 Tables 1.3.3 Partitions 1.3.4 Buckets 二、Hive读写文件机制 2.1 SerDe 作用 2.2 Hive读写文件流程 2.2.1 读取文件的过程 …

Java微服务学习Day2

文章目录 Nacos配置管理统一配置管理配置热更新![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c8a2d17baeef411980b44b432eb9692a.png)配置共享搭建Nacos集群 Feign远程调用介绍自定义配置性能优化最佳实践 Gateway服务网关介绍搭建网关服务路由断言工厂路由过滤器…

CTFshow web(文件上传151-154)

web151 哈&#xff0c;都直接送嘴边了&#xff0c;前端检测领域的问题&#xff0c;那就改前端啊&#xff0c;作者都直接提示了&#xff01; 第一种方法也是最好用的就是直接把前端内容的png改成php就好 这里教大家一个非常好用的技巧&#xff0c;可以极大节省你的时间&#xf…

单片机学习路线(简单介绍)

学习单片机对于电子爱好者和未来的嵌入式系统工程师来说是一段激动人心的旅程。单片机因其强大的功能、灵活性以及在各种智能设备中的广泛应用&#xff0c;成为了电子和计算机科学领域一个不可或缺的组成部分。如果你对如何开始这段旅程感到好奇&#xff0c;那么你来对地方了。…

Java的接口

目录 1.接口的概念 2.语法规则 3.接口的使用 4.接口的特性 总结&#xff1a; 5.实现多个接口 6.接口间的继承 1.接口的概念 接口就是公共的行为规范标准&#xff0c;大家在实现时&#xff0c;只要符合规范标准&#xff0c;就可以通用。 在Java中&#xff0c;接口可以看成…

统计图饼图绘制方法(C语言)

统计图饼图绘制方法&#xff08;C语言&#xff09; 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图绘制较难。今值此介绍饼图的绘制方法。 本方法采用C语言的最基本功能&#xff1a; &#xff08; 1.&#xff09…

Pytorch+NCCL源码编译

目录 环境1. 安装cudnn2. 使用pytorch自带NCCL库进行编译3. 修改NCCL源代码并重新编译后测试&#xff0c;体现出源码更改 环境 Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic x86_64)cuda 11.8 cudnn 8python 3.10torch V2.0.1 nccl 2.14.3NVIDIA GeForce RTX 4090 *2 1.…

基于BitVM的乐观 BTC bridge

1. 引言 前序博客&#xff1a; 区块链互操作协议Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f;BitVM&#xff1a;Bitcoin的链下合约 基于BitVM的乐观 BTC bridge&#xff1a; Trust-minimized two-way peg 机制 BitVM BTC bridge背后的主要思想是&#xff1a; 为比…

538. 把二叉搜索树转换为累加树

给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下&#xff0c;二叉搜索树满足下列约束条件&#…

bugku 2

社工-初步收集 购买辅助--下载辅助 得到一个zip文件 里面有exe 不知道有啥用 先用dirsearch扫一下 找到/admin/login.php 随便用了个弱口令登录失败 后面看了要用wireshrak抓包 找到邮箱和pass 把pass解码 本来以为后台直接登录 但是登录失败 就是要用邮箱登录 找到账…

[NISACTF 2022]easyssrf

它提示我们输入 那我们输入file:///flag file:// 访问本地文件系统 它提醒我们输file:///fl4g 它提醒我们输ha1x1ux1u.php 看到代码stristr($file, “file”)当我们输入file它会提示我们输了 啥意思可以前面加个/ 也可以通过read读取 思路都是前面加/不等于flag绕过 filephp://…