Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi中的动态数组和指针 如何在Delphi中重写这个C++代码?< /P> int *intim = new int[imsize]; unsigned char *grays = new unsigned char[imsize]; int *intim2 = intim;_Delphi - Fatal编程技术网

Delphi中的动态数组和指针 如何在Delphi中重写这个C++代码?< /P> int *intim = new int[imsize]; unsigned char *grays = new unsigned char[imsize]; int *intim2 = intim;

Delphi中的动态数组和指针 如何在Delphi中重写这个C++代码?< /P> int *intim = new int[imsize]; unsigned char *grays = new unsigned char[imsize]; int *intim2 = intim;,delphi,Delphi,如何像这样递增指针: *(intim++) = x; 在Delphi中,您可以使用指针(如在C/C++中),但通常会尝试避免使用指针 代码看起来最像 uses Types; procedure Test(); var intim: TIntegerDynArray; grays: TByteDynArray; P: PInteger; i, s: Integer; begin // 'allocate' the array SetLength(intim

如何像这样递增指针:

*(intim++) = x;

在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; 

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

静态:

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

var
  intim: array of integer;
begin
  setLength(intim, imsize);
  //do something with intim
end;
至于灰色,如何声明它取决于将“无符号字符”数组用作字符(字符串)还是用作单字节整数。如果它们是整数,则可以将无符号单字节整数声明为
byte
,并使用上述语法声明它们的数组(静态或动态)。如果它们是字符,只需使用
字符串
类型


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

指出您应该使用数组类型,而不是像您在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);

我第一次发布这段代码时,它分配内存,存储,然后递增,然后释放一个与我从分配器收到的指针不同的指针。那可能很糟糕。(修正!)不要使用:=0到高(xxx)你应该使用:=Low(xxx)到高(xxx)如果你习惯了这一点,如果你突然遇到一个定义为整数[10..20]的数组,你永远不会遇到麻烦。所以-习惯使用低和高-最终会有回报的…@heartware:你是对的,我已经习惯了我们严格的政策,除了基于零的阵列之外,绝不使用任何其他阵列。作为对Kowalikus的警告:数组并不总是零基的!动态数组(如上面的示例中所示)始终是基于零的。但是,字符串是基于1的,以便与上个世纪的古老Pascal版本兼容。