Pregunta

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

Begin
    A := B;

No funciona como Loren-pechtel dijo aquí el problema es A y B para mí son en diferentes unidades. Entonces, ¿hay una manera de definir una definición de tipo de una ya existente en otra clase?

¿Fue útil?

Solución

Definir tipo en bloque de interfaz de alguna unidad y luego incluir esa unidad a través de la cláusula uses en otras unidades en las que necesita ese tipo.

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

...

Cuando es necesario utilizar TMyArray en otra unidad:

unit B;
interface
uses A;

...
var x : TMyArray;

Otros consejos

Alternativamente, definir su tipo en la sección de interfaz de la unidad C y el uso de esta unidad en ambos A y B.

Los tipos de matriz de Delphi son un poco extraño. Es ve como A y B son exactamente del mismo tipo, pero Delphi no tiene en cuenta que son los mismos. Aparece "Array [1..4] of Integer" dos veces, por lo que Delphi cree que hay dos tipos diferentes. Eso es sólo una rareza de Delphi. La mayoría de los otros idiomas, pienso, no les importaría. No es un problema en la práctica; que es sólo un poco extraño. Tal vez hay una buena razón para ello. Quién sabe. La solución, como los otros han dicho, es definir su propio tipo, que se puede poner en una unidad que puede ser utilizada por otras unidades. Yo sólo mencionar este número de tipos de matriz, ya que puede ser que confundir.

Otro enfoque, un poco vieja escuela, pero todavía funciona, es utilizar la palabra clave ABSOLUTO para obligar a la memoria de uno de superponer otro, y hacer otro tipo compatible. Por ejemplo, en la unidad de una Digamos que tiene lo siguiente:

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

A continuación, en la unidad B, se tiene lo siguiente:

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

Por razones de compatibilidad, puede hacer lo siguiente:

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

Lo que esto hace es crear una variable "InstanceBasA" del tipo Arraya que se superpone el mismo espacio de memoria como la variable "InstanceB". Esto le permite hacer el siguiente comando:

InstanceA := InstanceBasA;

Uno de los métodos más del traslado de datos desde variableA a variableB es utilizar el comando MOVE. Por ejemplo, para pasar de Arraya a ArrayB puede hacer lo siguiente:

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;

Esto funciona por el hecho de que la matriz está organizada de una forma lineal, por lo que su copia de los bytes a partir de la primera posición de matriz, para la longitud de la matriz.

Puede obligar al compilador a asumir que son del mismo tipo por typecasting ellos:

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

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

Sin embargo, usted debe asegurarse de que tanto la realidad son array [1..4] de lo contrario se va a sobrescribir parte de la memoria. Es por eso que he añadido las dos afirmaciones.

Sólo tiene que utilizar unidades en la unidad después de Interfaz y antes de aplicación ... !!!!

Nunca, nunca, nunca use código como este:

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

¿Dónde está el error? Usted está utilizando el tamaño SOURCE para obtener el número de bytes que se mueva, no el tamaño de destino !!! Si SizeOf (A)> SizeOf (B) que tiene un desbordamiento de búfer y se desea sobreescribir la memoria. Si estás de suerte se consigue un AV, si usted no está usted tiene una vulnerabilidad explotable. Es mucho mejor usar siempre el tamaño de destino, a pesar de esta manera se puede llegar a la memoria de lectura usted no debe si el tamaño (B)> Tamaño (A), tal vez la exposición de los datos no deseados. De todos modos, siempre verifique los límites de la estructura al mover datos - algunas compañías de operaciones prohibidas como esto (es decir, establecimiento de memoria ()) de su código

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top