【问题标题】:Is there a clean way to declare a TBytes-compatible value at compile time?是否有一种干净的方法可以在编译时声明与 TBytes 兼容的值?
【发布时间】:2011-03-03 16:30:29
【问题描述】:

如果我想声明一个 Byte 的静态编译时数组,我可以这样做:

var
  bytes :array[0..24] of Byte = (1, 2, 3, .... );

但是,它的类型是字节数组[0..24],而不是System.TArray<System.Byte>,通常称为TBytes

我需要的是 TBytes 类型的东西,但我不想添加一个初始化部分来以某种痛苦的方式保存这些字节值:

var
    bytes2:TBytes;
initialization
    SetLength(bytes2,24); 
    bytes2[0] := 1; bytes2[1] := 2; ....

有什么方法可以代替:

var
    bytes2:TBytes = (1,2,3, .... );

我还试图找到一种方法来快速从 TBytes 转换(System.TArray<System.Byte>) 和 Byte 的数组 [0..24],如下所示:

 bytes2 := byte;

不幸的是,我能得到的最接近的是这个蛮力代码:

  SetLength(bytes2,Length(bytes));
  for n := 0 to Length(bytes) do begin
     bytes2[n] := bytes[n];
  end;

在我看来,两种类型密切相关,编译器可以更好地允许我从一种类型强制或复制到另一种类型。其他人对各种类型的“X 数组”有这种感觉吗?知道任何很酷的方法吗?如果编译器做了一些魔术,它可能会使 Move(...) 函数在这种情况下工作,但 Move 实际上会给您带来访问冲突,并且不能与动态数组或泛型集合一起使用。

【问题讨论】:

    标签: arrays delphi


    【解决方案1】:

    怎么样:

    var
      bytes: TBytes;
    begin
      bytes := TBytes.Create(1,2,3, .... );
    end;
    

    也就是说,我总是发现这种语法不接受开放数组的限制。所以我有一堆看起来像这样的函数:

    function Bytes(const A: array of Byte): TBytes;
    var
      i: Integer;    
    begin
      SetLength(Result, Length(A));
      for i := low(Result) to high(Result) do
        Result[i] := A[i];
    end;
    ...
    var
      b1, b2: TBytes;
      b3: array of Byte;
      b4: array [0..42] of Byte;
    ...
      b1 := Bytes(b2);
      b1 := Bytes(b3);
      b1 := Bytes(b4);
      b1 := Bytes([1,2,3,4]);
    

    我相信 XE 中的各种泛型增强意味着这可以通过泛型来完成,而无需为每个不同的标量重复像 Bytes 这样的例程。

    【讨论】:

    • 啊。你必须将这样的东西放入代码区域(开始..结束)而不是 var 区域,这让我感到震惊。 (我今天的想法太像 C++ 人了。)。我希望编译器会自动为我添加“var x :TBytes = (1,2,3) --> TBytes.Create”。
    • 可能应该为 i := Low(result) to High(result)... 以防万一.. 我想知道...
    • SetLength(Result,High(Result)+1) 可能更安全,以防万一你得到一个 TByte 数组 [5..9] 传入那里。
    • @warren 没有代码是正确的开放数组总是基于 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 2014-02-28
    • 2021-09-13
    相关资源
    最近更新 更多