【问题标题】:Dynamic Arrays and pointers in DelphiDelphi中的动态数组和指针
【发布时间】:2010-02-17 15:49:34
【问题描述】:

如何在 Delphi 中重写此 C++ 代码?

int *intim = new int[imsize];
unsigned char *grays = new unsigned char[imsize];
int *intim2 = intim;

我怎样才能像这样增加指针:

*(intim++) = x;

【问题讨论】:

    标签: delphi


    【解决方案1】:

    在 Delphi 中,您可以使用指针(就像在 C/C++ 中一样),但通常您会尽量避免使用它。

    代码看起来最像

    uses
      Types;
    
    procedure Test();
    var
      intim: TIntegerDynArray;
      grays: TByteDynArray;
      P:     PInteger;
      i, s:  Integer;
    begin
      // 'allocate' the array
      SetLength(intim, imsize);
      SetLength(grays, imsize);
    
      // if you want to walk through the array (Delphi style)
      for i := Low(intim) to High(intim) do intim[i] := GetValueFromFunction();
      // or (read only access, sum the array)
      s := 0;
      for i in intim do Inc( s, i );
      // or with pointers:
      P := @intim[ 0 ];
      for i := 0 to High(intim) do begin
        P^ := x;
        Inc( P ); // like P++;
      end;
    end; 
    

    【讨论】:

    • 而不是使用 :=0 到 High(xxx) 你应该使用 :=Low(xxx) 到 High(xxx) 如果你习惯了这个,你永远不会遇到麻烦,如果你突然遇到一个定义为 [10..20] 的 Integer 数组。所以 - 习惯同时使用 Low 和 High - 它最终会得到回报......
    • @heartware:你说得对,我已经习惯了我们的严格政策,除了从零开始的数组之外,我永远不会使用任何东西。作为对 Kowalikus 的警告:数组并不总是从零开始的!动态数组(如上例所示)始终从零开始。然而,字符串是从 1 开始的,以便与上个世纪的古老 Pascal 版本兼容。
    【解决方案2】:

    那些指出你应该使用数组类型而不是像上面在 C 中看到的那样直接进行指针操作的人是对的,当安全数组更容易时,使用危险的指针类型对 Delphi 来说是不习惯的,可以更快地验证,并且在运行时更安全。然而,对于那些想要避免使用漂亮的内置数组类型的书呆子来说,这样做是可能的,尽管很愚蠢:

    var
     intim,intim2:PInteger;
     x:Integer;
    begin
      x := 0;
      intim := AllocMem(SizeOf(Integer)*imsize);
      intim2 := intim;
    //  dereference pointer intim2, store something, then increment pointer
      intim2^ := x;
      Inc(intim2);
    
      FreeMem(intim);
    

    【讨论】:

    • 我第一次发布这段代码时,它分配了内存,存储然后递增,然后释放了一个与我从分配器返回的指针不同的指针。那可能很糟糕。 (已修复!)
    【解决方案3】:

    最好的方法是使用数组。如果 imsize 是一个常量,则需要一个静态数组,否则,您将使用一个动态数组。以下是两者的语法:

    静态:

    var
      intim: array[0..imsize - 1] of integer;
    

    动态:

    var
      intim: array of integer;
    begin
      setLength(intim, imsize);
      //do something with intim
    end;
    

    至于灰色,您将如何声明它取决于您是使用“无符号字符”数组作为字符(字符串)还是单字节整数。如果它们是整数,您可以将无符号单字节整数声明为byte,并使用上述语法声明它们的数组(静态或动态)。如果是字符,只需使用 string 类型即可。

    并且指针数学是可能的,但不推荐,因为它使缓冲区溢出太容易了。相反,请尝试将您的其他变量声明为 integer 并将其用作数组的索引。如果您打开了边界检查,这将防止您超出数组的末尾并损坏内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-07
      • 2017-11-20
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      相关资源
      最近更新 更多