Wie kann ich diesen C++-Code in Delphi umschreiben?
int *intim = new int[imsize];
unsigned char *grays = new unsigned char[imsize];
int *intim2 = intim;
Wie kann ich den Zeiger auf diese Weise erhöhen:
*(intim++) = x;
Wie kann ich diesen C++-Code in Delphi umschreiben?
int *intim = new int[imsize];
unsigned char *grays = new unsigned char[imsize];
int *intim2 = intim;
Wie kann ich den Zeiger auf diese Weise erhöhen:
*(intim++) = x;
In Delphi können Sie Zeiger verwenden (wie in C/C++), aber normalerweise versuchen Sie, dies zu vermeiden.
sieht der Code am ehesten so aus
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;
Die Leute, die darauf hinweisen, dass man Array-Typen statt einer direkten Zeigermanipulation wie oben in C verwenden sollte, haben Recht, es ist für Delphi nicht idiomatisch, gefährliche Zeigertypen zu verwenden, wenn sichere Arrays einfacher sind, schneller verifiziert werden können und zur Laufzeit sicherer sind. Für die Pedanten da draußen, die die Verwendung der netten eingebauten Array-Typen vermeiden wollen, ist es jedoch möglich, wenn auch dumm, dies zu tun:
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);
Am besten wäre es, Arrays zu verwenden. Wenn imsize eine Konstante ist, benötigen Sie ein statisches Array, andernfalls verwenden Sie ein dynamisches Array. Hier ist die Syntax für beide:
Statisch:
var
intim: array[0..imsize - 1] of integer;
Dynamisch:
var
intim: array of integer;
begin
setLength(intim, imsize);
//do something with intim
end;
Wie für Grays, wie Sie es deklarieren, hängt davon ab, ob Sie Ihr Array von "unsigned chars" als Zeichen (eine Zeichenfolge) oder als Single-Byte-Ganzzahlen verwenden. Wenn es sich um Ganzzahlen handelt, können Sie eine vorzeichenlose Ein-Byte-Ganzzahl wie folgt deklarieren byte
und deklarieren ein Array (entweder statisch oder dynamisch) mit der oben beschriebenen Syntax. Wenn es sich um Zeichen handelt, verwenden Sie einfach die string
Typ.
Und die Zeigerberechnung ist zwar möglich, aber nicht empfehlenswert, da sie zu leicht zu Pufferüberläufen führt. Versuchen Sie stattdessen, Ihre andere Variable als eine der folgenden Variablen zu deklarieren integer
und verwenden ihn als Index für das Array. Wenn Sie die Begrenzungsprüfung eingeschaltet haben, wird dies verhindern, dass Sie über das Ende des Arrays hinausgehen und den Speicher beschädigen.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.