2 Stimmen

Dynamische Arrays und Zeiger in Delphi

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;

7voto

Ritsaert Hornstra Punkte 4921

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;

4voto

Warren P Punkte 61510

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);

3voto

Mason Wheeler Punkte 79858

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.com

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.

Powered by:

X