2009-07-13 10 views
8

저는 Delphi에서 이러한 기본적인 문제가 있습니다. 해결할 수 없습니다.배열을 복사하는 방법은 무엇입니까?

내 코드 :

참고 : DATAR 아래의 방법에서 지역이지만, 보통은이 지역의 개념에 대한 클래스 var.Just가 있습니다.

class procedure TCelebrity.BeginRead(var input:Array of byte); 
var DataR:Array of byte; 
begin 
    VirtualFree(@DataRead,High(DataRead),MEM_RELEASE); 
    SetLength(DataR,Length(input)); 
    Move(input,DataR,Length(input)); 
end; 

이 명령은 컴파일되지만 Move()가 실행 된 후 DataR = nil입니다.

두 번째 시도 :

class procedure TCelebrity.BeginRead(var input:Array of byte); 
var DataR:Array of byte; 
begin 
    VirtualFree(@DataRead,High(DataRead),MEM_RELEASE); 
    SetLength(DataR,Length(input)); 
    DataR := Copy(input,0,Length(input)); 
end; 

이 (세 번째 줄에 all.Error에 DATAR를 컴파일되지 않습니다 : = 복사 (입력 ....) "호환되지 않는 유형"라고

가 있습니다. ?!? 문제 그들은 바이트의 모든 배열입니다

답변

7

은 왜 BTW

SetLength(DataR,Length(input)); 
for i:=Low(input) to High(input) do 
    DataR[i]:=input[i]; 

에 사용 : 당신이 원하는 경우 배열을 매개 변수로 전달하는 경우 형식으로 선언해야합니다 (예 :

type 
    TMyArray = array of byte; 

) 매개 변수 유형으로 TMyArray를 사용합니다.

편집 : 낮은 값에 대해 통보 받았습니다. 내 원래 게시물에서 그것은 i = 0 이었지만 i : Low (입력)는 더 안전하고 더 순수합니다.

+0

하나의 질문이 있습니다. VirtualFree는 항상 false를 반환하므로 현재 DataR에 사용되는 mem을 해제하려면 어떻게합니까? 참고 DataR은 로컬이 아니지만 원래 코드의 클래스 var입니다. 미리 대답 해 주셔서 감사합니다! –

+0

아니요, 무료 간단한 배열이 없습니다. 이러한 배열은 자동으로 해제됩니다 (예 : 클래스가 소멸 될 때). 참고 : 객체에 대한 참조 배열이있는 경우 해당 객체를 수동으로 해제해야합니다. 배열 만 Delphi에서 해제되기 때문입니다. – smok1

+0

SetLenght는 전체 배열을 다시 할당하므로이 절차를 많이 사용하지 마십시오. SetLength를 사용하여 배열을 길게 만들면 현재 내용은 그대로 유지되지만 짧게 만들면 일부 내용이 손실됩니다. – smok1

2

시도 :

class procedure TCelebrity.BeginRead(var input:Array of byte); 
var DataR:Array of byte; 
begin 
    VirtualFree(@DataRead,High(DataRead),MEM_RELEASE); 
    SetLength(DataR,Length(input)); 
    Move(input[0],DataR,Length(input)); 
end; 
+0

을 복사하지 마십시오. 작동하지 않습니다. –

8

메모리의 섹션을 이동하지 않습니다이

type 
    TByteDynArray = array of Byte; 

function CopyData(const Input:array of Byte):TByteDynArray; 
begin 
    SetLength(Result, Length(Input)); 
    Move(input[0], Result[0], Length(Input)); 
end; 
+5

정답. * 좋은 * 대답을하기 위해서는 왜 당신의 변경이 중요한지를 설명해야합니다. 그렇지 않으면, 그것은 마법의 마법 일뿐입니다. –

+3

내가 틀렸다면 나에게 정정해라. 그러나 이것은'array of Byte '로 쓰여진 것으로서 만 작동한다는 것을 주목할 가치가있다. 배열이 다른 경우,'array of Integer'라고하면,'Move (input [0], Result [0], Length (Input) * SizeOf (Integer))'가 필요합니다. 그냥 말해. –

+0

@Rob Kennedy : 델파이의 Move()는 C 코드의 memcpy()/memmove()와 비슷합니다. – dns

1

이동 절차를보십시오. Count 바이트를 복사합니다. 이로써 두 개의 서로 다른 동일한 배열 인 Input과 DataR을 얻을 수 있습니다.

procedure CopyData(const Input: Array of Byte); 
var 
    DataR: Array of Byte; 
begin 
    SetLength(DataR, Length(Input)); 
    Move(Input[0], DataR[0], SizeOf(Byte)*Length(Input)); 
end; 

p.s. 정적 배열에서는 SizeOf (Byte) * Length (Input) 대신 SizeOf (Input)를 사용할 수 있습니다. 바이트 대신 다른 데이터 형식을 사용할 수 있습니다.

+0

왜 하드 코드 된 데이터 형식 대신 SizeOf (Input [0])를 사용하지 않습니까? –

관련 문제