如何在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