2009-07-23 2 views
0

필자는 하나의 물리적 패킷에서 수신 된 두 개 이상의 패킷을 분리하는 함수를 작성했습니다. 그러나 컴파일러는 내 노력에 감사하지 않습니다. 모든 패킷의 크기는 6 바이트 인 패킷 헤더의 처음 2 바이트에 있습니다. 실제 패킷 하나 = 처음 2 바이트 + 6입니다. 둘 이상의 패킷이있는 경우 찾는 방법입니다. 'out'매개 변수로 동적 배열 길이를 변경하는 방법은 무엇입니까?

procedure SeparatePackets(packet:pointer;size:word; out Result:Array of pointer; out number:byte); 
var position:byte; //position 
begin 
    position:= 0; 
    number:= 0; 
    SetLength(Result,0); //<< ERROR 

    while(PWord(Cardinal(packet) + position)^ + 6 <> size) do //while the first two bytes + 6(packet header) 
    begin 
    SetLength(Result,Length(Result) + 1); //inc the length << ERROR 
    Result[number] := Cardinal(packet) + position; 
    position := Result[number] + PWord(Cardinal(packet) + position)^ + 6; 
    inc(number); 
    end; 
end; 

나는 '< < ERROR'로 컴파일시 에러를 표시했다. 오류는 '호환되지 않는 유형'입니다.

숫자가 증가하면 배열의 길이를 늘리고 싶었 기 때문에 하나의 물리적 패킷에서받을 수있는 패킷의 수를 알지 못합니다.

어떻게 오류를 해결할 수 있습니까?

답변

5

새로운 유형을 만드는 것은 어떻습니까? 나는 그것이 효과가 있어야한다고 생각한다.

type 
    TPntArray = array of Pointer; 
+0

새 유형을 정의하지 않으려면 TArrayNoInit이 을보십시오. –

5

새로운 형태의 선언 :

type 
    TPointerDynArray = array of Pointer; 

procedure SeparatePackets(Packet: Pointer; Size: Word; out Result: TPointerDynArray; out Number: Byte); 
begin 
    Result := nil; // unnecessary: dynamic out parameters are initialized to zero by compiler 
    ... 
end; 
1

내가 지금 테스트 할 수 없습니다하지만 난 마지막 줄에 다음 임시 (로컬) 배열을 시도합니다 :

Result := temp; 

또 다른 참고로, 1 씩 증가하는 것은 매우 비효율적입니다. 100 정도 씩 (그리고 사용 된 양을 추적하여) 변경할 수 있습니다.

+0

"temp"솔루션은 열려있는 배열을 변경하려고 시도하는 것과 똑같은 문제를 가지고 있습니다. -1. 증분 힌트 +1. :-) –

+0

그래 ...하지만 Temp 할당이 더 좋은 오류를 줄 것입니다. –

0

bassfriend와 TOndrej가 이미 해결책을 제시했습니다. 배경 정보는 this - 특히 "Confusion"부분을 참조하십시오.

2

array of X을 매개 변수 선언에 사용하는 경우 동적 배열이 아닌 열린 배열입니다. Bassfriend가 배열에 대해 명명 된 형식을 제안하고 선언 한 다음 매개 변수 선언에 해당 형식을 사용합니다.

type 
    TPointerArray = array of Pointer; 

procedure SeparatePackets(packet: Pointer; 
          size: Word; 
          out Result: TPointerArray; 
          out number: Byte); 

number 매개 변수에는 별다른 의미가 없습니다. 동적 배열은 이미 자체 길이를 알고 있으므로 배열 자체만으로도 충분합니다. 적어도 출력 매개 변수가 아닌 길이에 대해 별도의 값이 필요하지 않습니다. 또한 Byte은 배열의 길이를 유지하는 데 사용할 수있는 매우 좋은 유형이 아닙니다. 배열에 255 개 이상의 요소가있는 순간 문제가 발생합니다. 이 함수가 유일한 배열을 구성하기 때문에 그리고 마지막으로, 더 의미가 기능으로 바꿀 수 있도록 보인다

function SeparatePackets(packet: Pointer; size: Word): TPointerArray; 
관련 문제