문제

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

Begin
    A := B;

대로 작동하지 않으 로렌-pechtel 말 문제 A 및 B 나를 위해서는 다른 단위입니다.그래서,방법이 있을 정의하는 유형의 정의에서 기존의 다른 클래스에서?

도움이 되었습니까?

해결책

일부 장치의 인터페이스 블록에서 유형을 정의한 다음 해당 장치를 uses 해당 유형이 필요한 다른 단위의 조항.

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

...

사용해야 할 때 TMyArray 다른 유닛에서 :

unit B;
interface
uses A;

...
var x : TMyArray;

다른 팁

또는 단위 C의 인터페이스 섹션에서 유형을 정의하고 A와 B 에서이 장치를 사용하십시오.

델파이의 배열 유형은 약간 이상합니다. 그것 외모 A와 B처럼 정확히 같은 유형이지만 Delphi는 동일하다고 생각하지 않습니다. "정수의 배열 [1..4]는 두 번 나타나므로 델파이는 두 가지 다른 유형이 있다고 생각합니다. 그것은 델파이의 이상한 일입니다. 다른 대부분의 언어는 신경 쓰지 않을 것이라고 생각합니다. 실제로는 문제가되지 않습니다. 조금 이상합니다. 아마도 그것에 대한 좋은 이유가있을 것입니다. 누가 알아. 다른 사람들이 말했듯이 솔루션은 자신의 유형을 정의하는 것입니다.이 유형은 다른 장치에서 사용할 수있는 장치를 넣을 수 있습니다. 이 문제는 배열 유형이 당신을 혼란스럽게 할 수 있기 때문에 언급합니다.

또 다른 방법들,학교이지만 여전히 작동을 사용하는 것이 절대 키워드를 강의 메모리 중 하나를 오버레이고,또 다른 유형과 호환됩니다.예를 들어,단위에서는 말할 수 있는 다음과 같다:

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

그런 다음에서 유닛 b,당신은 다음과 같다:

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

호환성을 위해 다음을 수행할 수 있습니다:

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

이것이 무엇을 만들 변수"InstanceBasA"의 유형 ArrayA 는 오버레이 같은 메모리 공간으로는 변수"InstanceB".것을 할 수 있습니다면 다음 명령을 실행하십시오.

InstanceA := InstanceBasA;

Variablea에서 variabiableb로 데이터를 이동하는 한 가지 더 중요한 방법은 Move 명령을 사용하는 것입니다. 예를 들어, arraya에서 arrayb로 이동하려면 다음을 수행 할 수 있습니다.

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;

이것은 배열이 선형 방식으로 배치되므로 배열의 길이에 대해 첫 번째 배열 위치에서 시작하는 바이트를 복사한다는 사실에 의해 작동합니다.

컴파일러가 그것들을 타이핑하여 동일한 유형이라고 가정하도록 강요 할 수 있습니다.

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

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

그러나 두 가지 모두 실제로 배열 [1..4]인지 확인해야합니다. 그렇지 않으면 메모리를 덮어 쓸 것입니다. 그래서 두 가지 주장을 추가했습니다.

Unitb에서 Unita를 사용하여 unita를 사용하십시오 Inteface 그리고 전에 구현 ...!!!!

절대로 다음과 같은 코드를 사용하지 마십시오.

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

결함은 어디에 있습니까? 소스 크기를 사용하여 대상 크기가 아니라 바이트 수를 이동할 수 있습니다 !!! (a)> sizeof (b) 크기 인 경우 버퍼 오버플로가 있고 메모리를 덮어 쓰고 있습니다. 운이 좋으면 AV를 얻습니다. 그렇지 않으면 악용 가능한 취약점이 있습니다. 대상 크기를 항상 사용하는 것이 훨씬 낫지 만,이 방법으로 크기 (b)> 크기 (a)가 아닌 경우 메모리를 읽을 수 있으며 원치 않는 데이터를 노출시킬 수 있습니다. 어쨌든, 데이터를 이동할 때 항상 구조 경계를 확인하십시오. 일부 회사는 코드에서 이와 같은 운영 (예 : memcpy ())를 금지했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top