2010-02-16 105 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,並將其用作數組中的索引。如果啓用了邊界檢查,這將阻止您超出數組末尾並破壞內存。