Frage

Var
     A : Array [1..4] of Integer;
     B : Array [1..4] of Integer;

Begin
    A := B;

Ich werde nicht arbeiten, wie Loren-Pechtel sagte hierDas Problem ist, dass A und B für mich in verschiedenen Einheiten sind. Gibt es also eine Möglichkeit, eine Typdefinition aus einem vorhandenen in einer anderen Klasse zu definieren?

War es hilfreich?

Lösung

Definieren Sie den Typ im Grenzflächenblock einer Einheit und schließen Sie diese Einheit über über uses Klausel in anderen Einheiten, in denen Sie diesen Typ benötigen.

unit A;
interface
type
  TMyArray = array [1..4] of Integer;

...

Wenn Sie verwenden müssen TMyArray in einer anderen Einheit:

unit B;
interface
uses A;

...
var x : TMyArray;

Andere Tipps

Definieren Sie alternativ Ihren Typ im Schnittstellenabschnitt von Einheit C und verwenden Sie diese Einheit sowohl in A als auch in B.

Array -Typen in Delphi sind etwas seltsam. Es sieht aus Wie A und B sind genau den gleichen Typ, aber Delphi ist nicht der Ansicht, dass sie gleich sind. "Array [1..4] von Ganzzahl" erscheint zweimal, so dass Delphi glaubt, dass es zwei verschiedene Typen gibt. Das ist nur eine Kuriosität von Delphi. Ich denke, die meisten anderen Sprachen würden sich nicht interessieren. Es ist kein Problem in der Praxis; Es ist nur ein bisschen seltsam. Vielleicht gibt es einen guten Grund dafür. Wer weiß. Die Lösung ist, wie die anderen gesagt haben, Ihren eigenen Typ definiert, den Sie in ein Gerät einfügen können, das von anderen Einheiten verwendet werden kann. Ich erwähne nur dieses Problem der Array -Typen, weil es Sie möglicherweise verwirrt.

Ein anderer Ansatz, ein bisschen alte Schule, aber immer noch funktioniert, besteht darin, das absolute Schlüsselwort zu verwenden, um das Gedächtnis eines anderen zu zwingen, einen anderen zu überlagern und den anderen Typ kompatibel zu machen. In Einheit A beispielsweise haben Sie Folgendes: Sie haben Folgendes:

TYPE
  TArrayA = Array[1..4] of integer;

Dann haben Sie in Einheit B Folgendes:

TYPE
  TArrayB = Array[1..4] of integer;  

Für die Kompatibilität können Sie Folgendes tun:

VAR
  InstanceA : TArrayA;
  InstanceB : TArrayB;
  InstanceBasA : TArrayA ABSOLUTE InstanceB;

Dies erstellt eine Variable "InstanceBasa" von Typ -Arraya, die denselben Speicherplatz wie die Variable "InstanceB" überlagert. Auf diese Weise können Sie den folgenden Befehl ausführen:

InstanceA := InstanceBasA;

Eine weitere Methode zum Verschieben von Daten von Variablea zu VariableB ist die Verwendung des Befehls für Verschieben. Um beispielsweise von Arraya nach ArrayB zu wechseln, können Sie Folgendes tun:

var
  ArrayA : array[1..4] of Integer;
  ArrayB : Array[1..4] of Integer;
begin
  FillChar(ArrayB[1],SizeOf(ArrayB),#0);
  ArrayA[1] := 1234;
  ArrayA[2] := 3456;
  ArrayA[3] := 7890;
  ArrayA[4] := 9876;

  // This is where the move from ArrayA to ArrayB happens.
  Move( ArrayA[1], ArrayB[1], SizeOf(ArrayA) );

  Assert( ArrayA[4] = ArrayB[4], 'ArrayA[4] <> ArrayB[4]');
end;

Dies funktioniert dadurch, dass das Array linear ausgelegt ist, sodass Sie die Bytes kopieren, die an der ersten Array -Position beginnen, für die Länge des Arrays.

Sie können den Compiler zwingen, davon auszugehen, dass er vom gleichen Typ ist, indem er sie typisiert:

type
  TIntArray = array[1..4] of integer;

begin
  Assert(SizeOf(ArrayA) = SizeOf(TIntArray));
  Assert(SizeOf(ArrayB) = SizeOf(TIntArray));
  TIntArray(ArrayA) := TIntArray(ArrayB);

Aber Sie sollten sicherstellen, dass beide tatsächlich Array [1..4] von sonst überschreiben werden. Deshalb habe ich die beiden Behauptungen hinzugefügt.

Verwenden Sie einfach Unita in Unitb danach inteface und vor dem Implementierung ...!!!!

Verwenden Sie niemals so diesen Code:

// This is where the move from ArrayA to ArrayB happens.
Move( ArrayA[1], ArrayB[1], SizeOf(ArrayA) );

Wo ist der Fehler? Sie verwenden die Quellgröße, um die Anzahl der Bytes zu bewegen, nicht die Zielgröße !!! Wenn sizeof (a)> sizeof (b) Sie einen Pufferüberlauf haben und das Speicher überschreiben. Wenn Sie Glück haben, erhalten Sie einen AV, wenn Sie nicht eine veränderbare Verwundbarkeit haben. Es ist weitaus besser, immer die Zielgröße zu verwenden, obwohl Sie auf diese Weise Speicher lesen können, sollten Sie nicht, wenn die Größe (b)> Größe (a) möglicherweise unerwünschte Daten freigibt. Überprüfen Sie trotzdem immer Strukturgrenzen, wenn Sie Daten verschieben - einige Unternehmen haben die Operationen wie diese (dh memcpy ()) aus ihrem Code verboten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top