如何将字符串数组长尾词传递给方法?

2026-04-10 20:545阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计609个文字,预计阅读时间需要3分钟。

如何将字符串数组长尾词传递给方法?

我想创建一个以shortstring数组为参数的过程 procedure f(const a: shortstring; b: Array of shortstring);我想使用已知长度和已知长度的短字符串数组来称呼它,例如 var A, B: array[1..2] of string[5]; C, D: array[1..40] of string[5];

我想创建一个以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,因为它依赖于事实/希望/ ……数组中的字符串是连续布局的.但它现在已经有一段时间了.

本文共计609个文字,预计阅读时间需要3分钟。

如何将字符串数组长尾词传递给方法?

我想创建一个以shortstring数组为参数的过程 procedure f(const a: shortstring; b: Array of shortstring);我想使用已知长度和已知长度的短字符串数组来称呼它,例如 var A, B: array[1..2] of string[5]; C, D: array[1..40] of string[5];

我想创建一个以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,因为它依赖于事实/希望/ ……数组中的字符串是连续布局的.但它现在已经有一段时间了.