我有一个Dynamc数组记录,我希望通过引用将数组中的一个项目传递给函数
例如,其中一个数组项--Arrray [1] .arecorditem是一个由6个字符组成的字符串String [6]
该功能将是 -
function dosomething(var AStringVal:string):Integer;
所以我会执行
Aresult:= dosomething(AArray[1].arecorditem);
然而,当我尝试编译时,我得到实际和正式var参数的错误类型必须相同。
这是可行的,还是应该将数组项分配给字符串,然后将字符串传递给函数。
由于
科林
答案 0 :(得分:5)
您的问题标题和实际问题不一样,因此我将向您概述这两个主题。
您需要定义数组类型
TMyRecord = record
Field1: String
Field2: String
end;
TMyRecordArray = Array of TMyRecord
function DoSomething(const ARecordArray: TMyRecordArray): Integer;
如果您想将整个动态数组项传递给该函数。如果你只想传递一个项目,你可以像这样定义函数:
function DoSomething(const ARecord: TMyRecord): Integer;
现在,如果要将Field1的值传递给函数,则必须将函数定义为:
function DoSomething(const AField: String): Integer;
您无法将参数定义为var
,或者您最终会得到错误!
其他:
正如其他人所说,如果你在字段中使用固定长度的字符串,则需要将其定义为类型,就像我上面针对TMyRecordArray
所说明的那样。
TString6 = String[6];
使用Type为Field和您的函数Parameter。
答案 1 :(得分:4)
您必须创建一个类型:
type
TName = string[80];
所以你可以用这种方式调用你的函数:
function doSomething(var name: TName): Integer;
begin
...
...
...
end;
program HelloWorld;
type
TName = string[80];
type
TCustomer = record
name : Name;
age : byte;
end;
procedure qwerty(var name: TName);
begin
name := 'doSomething';
end;
var
customers : array[1..3] of TCustomer;
b : Byte;
begin
with customers[1] do
begin
name := 'qwerty';
age := 17;
end;
with customers[2] do
begin
name := 'poiuy';
age := 18;
end;
writeln(customers[1].name);
qwerty(customers[1].name);
writeln(customers[1].name);
Readln(b);
end.
答案 2 :(得分:1)
String [6]是一个ShortString,最大长度为255个字符。您需要将doSomething的定义更改为:
function dosomething(var AStringVal:string[6]):Integer;
或
function dosomething(var AStringVal:ShortString):Integer;
或更改记录的定义,以便arecorditem的类型为String(而不是String [6])。
答案 3 :(得分:0)
如果你没有改变函数中参数的值,你可以将函数声明中的变量类型改为const
而不是var
,编译器会为你做转换:
更改自:
procedure doSomething(var AStringVal: String);
对此:
procedure doSomething(const AStringVal: String);
现在你可以做到这一点,没有抱怨:
var
myShortString: String[6];
begin
myShortString := '123456';
doSomething(myShortString);
end;
通过引用传递变量时,它们必须是相同的类型。当您通过其他方式传递时,编译器将尝试为您转换。