如何在Delphi中重写这个C++代码?Delphi中的动态数组和指针
int *intim = new int[imsize];
unsigned char *grays = new unsigned char[imsize];
int *intim2 = intim;
我怎样才能增加指针这样的:
*(intim++) = x;
如何在Delphi中重写这个C++代码?Delphi中的动态数组和指针
int *intim = new int[imsize];
unsigned char *grays = new unsigned char[imsize];
int *intim2 = intim;
我怎样才能增加指针这样的:
*(intim++) = x;
那些指出你应该使用数组类型而不是像上面在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);
在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到高(XXX),你应该使用: =低(xxx)至高(xxx) 如果您习惯了这种情况,如果您突然遇到定义为Integer的[10..20]的数组,您将不会遇到麻烦。 所以 - 习惯使用低和高 - 它会在最后得到回报... – HeartWare 2010-02-16 21:21:31
@heartware:你说得对,我已经习惯了严格的策略,除了基于零的数组之外,绝对不会使用其他任何东西。作为Kowalikus的警告:数组并不总是以零为基础!动态数组(如上例所示)始终为零。然而,字符串是基于1的,与上个世纪的古代Pascal版本兼容。 – 2010-02-16 21:28:59
,最好的办法是使用数组。如果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
,并将其用作数组中的索引。如果启用了边界检查,这将阻止您超出数组末尾并破坏内存。
我第一次发布这个代码,它分配了内存,存储然后递增,然后释放了一个与我从分配器收回的指针不同的指针。这可能是不好的。 (固定!) – 2010-02-16 20:06:01