相关疑难解决方法(0)

为什么两个别名的"字符串数组"处理不同?

在Pascal中有两种类型声明:

  • 类型别名:类型NewName = OldType
  • 类型创建:类型NewType = type OldType

前者只是创建方便的速记,如C中的typedef.别名是彼此兼容的,与原始类型兼容.创建的类型是故意不兼容的,并且在没有明确和不安全的情况下通过类型转换不能混合.

var
  nn: NewName; nt: NewType; ot: OldType;
...
  nn := ot; // should work
  nt := ot; // should break with type safety violation error.

  nt := NewType(ot); // Disabling type safety. Should work even if 
  // it has no sense semantically and types really ARE incompatible.
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这些是Pascal基础知识.

现在让我们看一个特定类型和两个别名:

  • System.Types.TStringDynArray = 字符串数组 ;
  • System.TArray <T> = T的数组 ;
    • 特别是这意味着 TArray <string> = 字符串数组 ; …

delphi generics

12
推荐指数
2
解决办法
2334
查看次数

为什么TArray &lt;recordType&gt;与recordType数组不同?

我有一个记录类型定义为:

type 
    TRecordType = record
        Field1: string;
        Field2: Variant;
    end;
Run Code Online (Sandbox Code Playgroud)

当我以这种方式定义一个函数时:

function Function1(const Records: TArray<TRecordType>): TAnyOtherClass;
Run Code Online (Sandbox Code Playgroud)

并这样称呼:

Function1([BuildRecord('string', value), BuildRecord('OtherString', otherValue)])
Run Code Online (Sandbox Code Playgroud)

编译器说:

[DCC错误] AnyUnit.pas(142):需要E2001序数类型

我很早以前就读过一些地方,Delphi的编译器在一种预处理器中处理泛型,并在代码中某种形式的字符串替换,然后我希望Function1计算结果类似于:

function Function1(const Records: array of TRecordType): TAnyOtherClass;
Run Code Online (Sandbox Code Playgroud)

因为TArray是定义的TArray<T> = array of T;

我认为这没有发生,因为当我将函数声明更改为:

function Function1(const Records: array of TRecordType): TAnyOtherClass;
Run Code Online (Sandbox Code Playgroud)

编译代码时没有错误或警告。

这个问题有一个答案,链接到一篇说明差异的文章,但是链接断开了。所以我的问题是,TArray<T>如果不是,那意味着什么array of T

arrays delphi delphi-xe

5
推荐指数
1
解决办法
760
查看次数

TDictionary保存到文件

我有很多文件(大约160 000),我需要有关于文件中单个单词位置的信息(全文).所以我用这样的字典:

WordDict : TDictionary<string, TDictionary<string, TIntegerDynArray>>;
Run Code Online (Sandbox Code Playgroud)

现在我知道WORD1在FILE1,FILE3和FILE100中并且位于每个文件<1,3,5>,<2,8,35>等等.我可以填写它,我可以使用它 - 它非常快.但我不知道如何有效地存储字典文件.

编辑:有效 - 我的意思是快速和小文件

delphi full-text-search save tdictionary

3
推荐指数
1
解决办法
2625
查看次数

如何简化创建一个未填充的整数数组

如何在不创建/定义x整数的情况下创建x整数数组.此示例将创建一个10整数数组(在每个元素中预先填充零):

 var
   IntArray : TArray<Integer>;
 begin
   IntArray := TArray<Integer>.Create(0,0,0,0,0,0,0,0,0,0);
 end;
Run Code Online (Sandbox Code Playgroud)

所以我创建了一个长整数为120的整数数组,这看起来很乱:

IntA := TArray<Integer>.Create(
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0);
Run Code Online (Sandbox Code Playgroud)

现在我需要创建一个9000个整数的数组,我不需要(或想要)用9000个零预先填充数组.

有这样的命令:

IntA := TArray<Integer>.Array[0..9000]; //This doesn't work
Run Code Online (Sandbox Code Playgroud)

谢谢.

delphi

2
推荐指数
1
解决办法
126
查看次数

如何使用Generic方法和<T>数组的参数数组?

很多时候,当使用通用数组时,我需要知道我正在使用的数组的最大长度.很长一段时间我一直在使用:

MaxIntValue([Length(Array1), Length(Array2) , Length(Array3)]); // from Math unit
Run Code Online (Sandbox Code Playgroud)

然后我用我的方法简化了这个(跳过输入Length()):

// array of array of TCardBrand
function GetMaxLength(const aArrays: array of TArrayOfCarBrand): integer;
Run Code Online (Sandbox Code Playgroud)

效果很好,但现在我想创建一个通用的MaxLength,我无法使其工作

class function MaxLength<T>(aArrays: array of array of T): integer; - it gives error: [dcc32 Error] Unit2.pas(31): E2029 Identifier expected but 'ARRAY' found
Run Code Online (Sandbox Code Playgroud)

这是我正在测试的代码,使用Math单元中的MaxIntValue和我的方法示例的工作示例,但扩展通用TArray不起作用:

TCarBrand = record
    BrandID: integer;
    BrandName: string;
    BrandCountry: string;
  end;

  TArrayOfCarBrand = array of TCarBrand;

  TArray = class(System.Generics.Collections.TArray)
  public          
      // ERROR:  E2029 Identifier expected but 'ARRAY' found
       class function MaxLength<T>(aArrays: array of array …
Run Code Online (Sandbox Code Playgroud)

delphi generics delphi-10.1-berlin

2
推荐指数
1
解决办法
423
查看次数

Delphi泛型类和动态数组

我曾在多次读取的回答这个有关的问题TArray<T>array of T.根据我的理解,第一个的使用比后者更通用,因为对于动态数组我应该声明类似......

type
   TMyFlexibleArray = array of Integer;
Run Code Online (Sandbox Code Playgroud)

......这是必要的(在某些情况下)因为我无法返回array of Integer例如.相反,当然,我可以返回泛型类型.动态数组没有固定长度,并且使用SetLength过程重新分配它们的内存.TArray是一个静态方法的泛型类; 有关它的文档说明:

您不应该创建此类的实例,因为它的唯一目的是提供排序和搜索静态方法.


它们具有两种不同的性质/功能,但是它们具有相同的结果(例如,当作为参数传递时或者当我只需要一个灵活的容器时)?我看到TArray也有一些有用的方法.

如果我说这TArray<T>是一个用泛型构建的动态数组并且type K = array of T是一个自己的动态数组(自定义数组),那是正确的吗?在我的问题中,我假设它们在作为动态数组的功能上是等价的(我更喜欢通用的方式只是为了舒适).

arrays delphi

1
推荐指数
1
解决办法
519
查看次数