【发布时间】: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
如何在 Delphi 中重写此 C++ 代码?
int *intim = new int[imsize];
unsigned char *grays = new unsigned char[imsize];
int *intim2 = intim;
我怎样才能像这样增加指针:
*(intim++) = x;
【问题讨论】:
标签: delphi
在 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;
【讨论】:
那些指出你应该使用数组类型而不是像上面在 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);
【讨论】:
最好的方法是使用数组。如果 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 并将其用作数组的索引。如果您打开了边界检查,这将防止您超出数组的末尾并损坏内存。
【讨论】: