Delphi传递动态数组记录功能

时间:2011-12-06 16:46:19

标签: arrays delphi dynamic

我有一个Dynamc数组记录,我希望通过引用将数组中的一个项目传递给函数

例如,其中一个数组项--Arrray [1] .arecorditem是一个由6个字符组成的字符串String [6]

该功能将是 -

function dosomething(var AStringVal:string):Integer;

所以我会执行

Aresult:= dosomething(AArray[1].arecorditem);

然而,当我尝试编译时,我得到实际和正式var参数的错误类型必须相同。

这是可行的,还是应该将数组项分配给字符串,然后将字符串传递给函数。

由于

科林

4 个答案:

答案 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;

通过引用传递变量时,它们必须是相同的类型。当您通过其他方式传递时,编译器将尝试为您转换。