可变类型的开放数组
现在回到文章开头提到的可变类型的开放数组,可变类型的开放数组允许向单个过程或函数传递不同类型表达式的数组。要定义含有变体开放数组参数的方法,需要指定“array of const”或“array of TVarRec”作为参数类型。【注1】
//定义含有变体开放数组参数的方法
procedure DoSomething(A: array of const);
procedure DoSomething(A: array of TVarRec);
array of const在定义参数时等价于array of
TVarRec
。array of const 只能指定参数的类型为可变类型的开放数组参数(array of TVarRec),而不能用其定义数组变量,但array of TVarRec还可以用来定义TVarRec类型的数组变量,而且可以将这个数组变量当作参数传递给可变类型的开放数组参数的方法。
arr:array of const;//错误
arr:array of TVarRec;//合法
DoSomething(arr);//合法
TVarRec类型用于含有array of const类型的参数的函数内部,编译器自动通过
开放数组构造器
来构造开放数组参数的实参,
将构造器中的每个元素转换为TVarRec值,VType字段表示每个TVarRec值的简单类型,可变类型常量(如vtInteger类型时的VInteger)表示为传递到TVarRec结构中的标记字段的值。
虽然TVarRec是可变类型,它能“容纳”各种基础数据类型,但这种“容纳”是通过
开放数组构造器
来实现的,编译器本身并不能自动实现,即
TVarRec与其他数据类型是不兼容的,不能将其他类型的数组变量传递给开放数组参数的方法。
DoSomething([1,2,'a','tht']);//正确
arr:array[0..10] of Integer;
...//赋值
DoSomething(arr);//错误
开放数组构造器
开放数组构造器允许在函数或过程调用中直接构造数组;它们仅用于传递开放数组参数或可变类型开放数组参数。
与集合构造器相似,开放数组构造器是一个由方括号封装、逗号隔开的表达式序列。开放数组构造器仅用于传递值参数或常量参数。构造器中的表达式必需与开放数组参数的基类型是赋值兼容的。对于可变类型开放数组参数的情况,表达式可以是不同类型的。【注2】
注1:请参考
http://www.87871.cn/tool/help/Pascal/Source/Procedures%20and%20functions/Variant%20open%20array%20parameters.htm
注2:请参考
http://www.87871.cn/tool/help/Pascal/Source/Procedures%20and%20functions/Open%20array%20constructors.htm
上接delphi与变长参数——开放数组(2)。 可变类型的开放数组 现在回到文章开头提到的可变类型的开放数组,可变类型的开放数组允许向单个过程或函数传递不同类型表达式的数组。要定义含有变体开放数组参数的方法,需要指定“array of const”或“array of TVarRec”作为参数类型。【注1】//定义含有变体开放数组参数的方法proc
几乎所有高级语言都实现了一个format函数用于处理不同
类型
的数据组合转换为字符串。
delphi
中有format,FormatBuf,FmtStr等,VC中有sprintf,CString中的format等,都是相当常用且方便的函数。
这些函数使用起来与普通函数最大的区别就是其中一个
参数
的个数、
类型
、是不确定的,反过来说,就是
参数
是
可变
的,这个特点使得该类函数功能
变
得异常强大,当然也极其方便...
貌似没有这样的指令。不过,
delphi
可以用[a,b,c……]的形式表示
数组
,所以就有一个办法了,比如:
procedure a1(b: array of integer);
最近在编写代码时遇到一个编译错误:Constant object cannot be passed as var parameter,但是IDE环境自动定位光标的时候不够准确,总是定位到后面一个
参数
的位置上,所以来来回回看了好几遍都解决不了问题。最后才发现原来是前面将TADOQuery
类型
的属性作为
可变
参数
传递给了
可变
参数
,因此才造成了编译错误。
unit Unit1;
interface
当过程或函数使用
数组
参数
时,不能在声明
参数
时包含索引说明符。也就是说,声明定义下面函数将产生编译错误。
procedure Sort(A:array[1..10] of Integer);//语法错误
但使用下面这种方法是有效的。但在大多数情况下,
开放
数组
参数
是更好的办法。
type TDigits=array
delphi
中,
开放
数组
是指
数组
元素个数不定的
数组
,并非是
变
量
类型
,而是一种
参数
类型
,只有在声明方法定义形参时才会用到。而在调用
参数
为
开放
数组
的方法时,传入的实参可以是静态
数组
,也可以是动态
数组
。
开放
数组
和动态
数组
的形式都是array of Type,只是根据位置的不同表明不同的身份,在方法声明中定义形参时使用array of Type定义的是
开放
数组
参数
;在其他位置使用array of Ty
与C/C++不同,
Delphi
中是通过
可变
类型
(TVarRec)的
开放
数组
来指定
变
长
参数
的。其实这里已经不能称“
变
长
参数
”了,因为实际上只传递了一个
参数
,只是该
参数
是由多个基础
类型
数据构成的一个
开放
数组
。
Delphi
使用
开放
数组
来容纳不定数目的
参数
,使用
可变
类型
(TVarRec)表示各种
类型
数据,因此二者的结合可以达到C/C++中
变
长
参数
的功能。
TVarRec是一个记录
类型
,该记
yu7764: