Delphi传递动态记录数组给函数

4
我有一个动态记录数组,希望通过引用将数组中的某个项传递给函数。
例如,数组项之一 - AArray [1] .arecorditem 是一个由6个字符组成的字符串String [6],
该函数会是 -
function dosomething(var AStringVal:string):Integer;

那么我将执行

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

然而,当我尝试编译时,会出现“实际和形式变量参数的类型必须相同”的错误。

是否可以这样做?或者我应该将数组项分配给一个字符串,然后将字符串传递给函数。

谢谢

Colin

4个回答

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];

将此类型用于您的字段和函数参数。


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.

3
尝试使用未写下的格式和语法约定。类型与我的昵称一样,在单词开头加上“T”。现在你正在混淆两件事情,请检查语法“名称:名称”。 - TLama
5
@TLama你是一个类还是一个实例?;-) - David Heffernan
@David,我只是一种类型 :) 有时候像一个类,因为我觉得我需要更多的实例在许多地方做同样的事情,有时候像一个声明的布尔类型,所以这取决于 :) - TLama
2
@TLama 我感觉自己像一个线程,因为我总是需要多个同时执行相同任务的我来实现更快的结果! - LaKraven

1

String[6]是一个最大长度为255个字符的ShortString。您需要将doSomething的定义更改为以下内容之一:

function dosomething(var AStringVal:string[6]):Integer;

或者

  function dosomething(var AStringVal:ShortString):Integer;

或者更改记录的定义,使得 arecorditem 的类型为 String(而不是 String[6])。


5
"string[6]"不是函数/过程声明中的有效类型。请将其声明在外部。类型"Str6 = string[6]"。 - LU RD

0

如果您在函数中不改变参数的值,可以将函数声明中的变量类型更改为const而不是var,编译器会为您进行转换:

从以下内容更改:

procedure doSomething(var AStringVal: String);

变成这样:

procedure doSomething(const AStringVal: String);

现在你可以毫无怨言地做到这一点:

var
  myShortString: String[6];
begin
  myShortString := '123456';
  doSomething(myShortString);
end;

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接