加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

arrays – 如何将shorttring数组传递给方法

发布时间:2020-12-15 09:05:33 所属栏目:大数据 来源:网络整理
导读:我想创建一个以shorttring数组作为参数的过程 procedure f(const a,b: Array of shortstring); 我想用已知长度和已知长度的短线阵列来称呼它,例如 var A,B: array[1..2] of string[5]; C,D: array[1..40] of string[12];begin f(A,B); f(C,D);end; 这导致编
我想创建一个以shorttring数组作为参数的过程

procedure f(const a,b: Array of shortstring);

我想用已知长度和已知长度的短线阵列来称呼它,例如

var
  A,B: array[1..2] of string[5];
  C,D: array[1..40] of string[12];
begin
  f(A,B);
  f(C,D);
end;

这导致编译器错误E2008不兼容的类型.
这是为什么?我可以编写一个可以获取shorttring数组的过程(任何长度的数组/字符串)吗?

为什么要使用短裤?

缺点是现有记录中的字段.这些记录有很多短线串.为了将数据从turbo power B-Tree Filer迁移到SQL数据库,一步是将记录转换为数据集,然后返回记录,以确认所有字段都在两个方向上正确转换.我一直在记录上使用CompareMem来检查这一点,但它没有提供关于转换错误所在的字段的足够信息.因此创建了一个小程序,它从记录定义中生成代码来比较两个记录.对于这个代码生成器,我需要一个函数来比较shorttrings.它最终在短线上使用CompareMem.

解决方法

在类似的情况下,我使用了以下内容:

type
  TOpenArrayOfOpenString = record
  strict private
    FSizeOfString: Integer;
    FpStart: PChar;
    FArrayLength: Integer;
    function GetItemPtr(AIndex: Integer): PShortString;
  public
    constructor Init(var AFirstString: Openstring; AArrayLength: Integer);
    function Equals(const AArray: TOpenArrayOfOpenString): Boolean;

    property SizeOfString: Integer read FSizeOfString;
    property pStart: PChar read FpStart;
    property ArrayLength: Integer read FArrayLength;
    property ItemPtrs[AIndex: Integer]: PShortString read GetItemPtr; default;
  end;

{ TOpenArrayOfOpenString }

constructor TOpenArrayOfOpenString.Init(var AFirstString: Openstring; AArrayLength: Integer);
begin
  FSizeOfString := SizeOf(AFirstString);
  FpStart := @AFirstString[0]; // incl. length byte!
  FArrayLength := AArrayLength;
end;

function TOpenArrayOfOpenString.Equals(const AArray: TOpenArrayOfOpenString): Boolean;
begin
  Result := CompareMem(pStart,AArray.pStart,SizeOfString * ArrayLength);
end;

function TOpenArrayOfOpenString.GetItemPtr(AIndex: Integer): PShortString;
begin
  Result := PShortString(pStart + AIndex * SizeOfString);
end;

你可以像这样使用它:

procedure f(const a: TOpenArrayOfOpenString);
var
  i: Integer;
begin
  for i := 0 to Pred(a.ArrayLength) do
    Writeln(a[i]^);
end;

procedure Test;
var
  A: array[1..2] of string[5];
  C: array[1..40] of string[12];
begin
  f(TOpenArrayOfOpenString.Init(A[1],Length(A)));
  f(TOpenArrayOfOpenString.Init(C[1],Length(C)));
end;

它不像语言中内置的解决方案那样优雅,而且它有点hacky,因为它依赖于事实/希望/ ……数组中的字符串是连续布局的.但它现在已经有一段时间了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读