2010-02-16 95 views
2

如何在Delphi中重写这个C++代码?Delphi中的动态数组和指针

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

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

*(intim++) = x; 

回答

4

那些指出你应该使用数组类型而不是像上面在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

我第一次发布这个代码,它分配了内存,存储然后递增,然后释放了一个与我从分配器收回的指针不同的指针。这可能是不好的。 (固定!) – 2010-02-16 20:06:01

7

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

而不是使用:= 0到高(XXX),你应该使用: =低(xxx)至高(xxx) 如果您习惯了这种情况,如果您突然遇到定义为Integer的[10..20]的数组,您将不会遇到麻烦。 所以 - 习惯使用低和高 - 它会在最后得到回报... – HeartWare 2010-02-16 21:21:31

+0

@heartware:你说得对,我已经习惯了严格的策略,除了基于零的数组之外,绝对不会使用其他任何东西。作为Kowalikus的警告:数组并不总是以零为基础!动态数组(如上例所示)始终为零。然而,字符串是基于1的,与上个世纪的古代Pascal版本兼容。 – 2010-02-16 21:28:59

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,并将其用作数组中的索引。如果启用了边界检查,这将阻止您超出数组末尾并破坏内存。