2016-08-01 2 views
-2

나는 PBYTE와 함께 @buffer를 전달하고자하는 수정 불가능한 DLL 내부에 함수를 가지고 있습니다.델파이 배열의 PByte 배열

function Base(Buffer: PBYTE): Integer; 

그 위에 다른 길이의 버퍼가 있습니다. 이제 더 쉽게 접근 할 수 있도록 이러한 모든 버퍼를 포함하는 배열처럼 작동하는 무언가를 만들고 싶습니다 (인덱스 필요). 나는 그것을 어느 방향으로나 돌리려고했지만, 나는 정신이 막혔다.

Buffer1: array[0..100] of Byte; 
Buffer2: array[250..600] of Byte; 

Buffers: array of PByte; 

지금

function Foo(var Buffer: PByte): Boolean; 
begin 
    Result := Boolean(Buffer[SomePosition]); 
end; 

가 "필요한 배열 형"을 던지는 받아들이려고 내 다른 기능으로 사용의 문제, 작업에 가장 가까운했다.

필자는 전체 구조를 거꾸로 뒤집어서 포인터, 포인터 배열을 내 자신의 유형으로 도입했거나 PByte 배열 배열을 작성하여 자연스럽게 일관되지 않은 배열 길이 문제를 일으켰습니다. 나는 그것을 풀 수 없다.

편집 : 자세한
buffers : array of PByte; 
buffer_DB11 : array[0..200] of byte; 
buffer_DB20 : array[400..640] of byte; 

function ReadInt(var Buffer : array of Byte; Position : Word): Integer; 
begin 
    Result := buffer[Position]*256+buffer[Position+1]; 
end; 

procedure TServiceItem.FetchValues; // somewhere else 
begin 
    Value := IntToStr(ReadInt(buffers[db], Position)); 
end; 

나는 그게 내가 할 노력하고있어 명확하게 할 수 있기를 바랍니다.

+0

결과 : 버퍼 [위치] * 256 + 버퍼 [위치 +1]; '는 정수가 빅 엔디안 16 비트 형식으로 저장됨을 의미합니다. 그게 틀림 없습니까? –

+1

귀하의 질문에 아무런 의미가 없으며 귀하와 의사 소통하려는 시도가 효과적이지 않기 때문에 제 답변을 삭제했습니다. –

+1

아직도 무슨 일이 일어나고 있는지 명확하지 않습니다. 분명히,'Foo'는 진짜 이름이 아니며 다른 서명을 가지고 있습니다. 실제 코드를 표시하십시오 (예 : DLL 함수를 호출하는 방법 및 DLL 함수의 실제 선언 "진짜"는 코드에서 복사하여 붙여 넣었다는 의미입니다. –

답변

0

수정할 수없는 DLL이 들어있는 부분이 보이지 않으므로 편집을 마치면 PByte와 바이트 배열이 같은 것으로 가정하는 것처럼 보입니다. 그들은 그렇지 않습니다.

버퍼 [xxx]는 PByte 유형이며 바이트 배열이 아니므로 PByte를 가져 오기 위해 함수를 캐스트하거나 수정해야합니다.

buffers : array of PByte; 
buffer_DB11 : array[0..200] of byte; 
buffer_DB20 : array[400..640] of byte; 

function ReadInt(var Buffer : PByte; Position : Word): Integer; 
begin 
    Result := buffer[Position]*256+buffer[Position+1]; 
end; 

procedure TServiceItem.FetchValues; // somewhere else 
begin 
    Value := IntToStr(ReadInt(buffers[db], Position)); 
end; 
+0

컴파일 할 코드에 포인터 연산 기능이 필요하고 왜 다양한 매개 변수를 사용해야합니까? 나는 그 질문이 아직 멀었다 고 생각하지 않는다. –

+0

@DavidHeffernan True이지만 포인터 연산이 가능하도록 포인터 연산이 필요하며 그 부분은 내 코드가 아니라 코드입니다. 우리가 그를 도울 필요가있는 것을 이해하는데 어려움을 겪고있는 것 같기 때문에 이것은 그의 반응을 촉발하기를 희망합니다. 적어도 Delphi의 작동 방식에 대한 근본적인 오해가 될 수 있습니다. – Dsm

+0

나는 이미 답변했지만 다음 주석이 완전히 혼란 스러울 때 삭제했습니다. –