2013-04-09 1 views
1

에서 나는 약간의 데이터를 바이트의 배열을 PAnsiChar가 배열 ...바이트 델파이 2007

CommandBytes : array of byte; 

그리고 블루투스 프린터에 명령을 보내는 VCL의 기능을 가지고있다. VCL 기능 프로토 타입이

SendData(PAnsiChar, Cardinal); 

I 올바르게 프린터에 명령을 보내는 기능 바이트 배열을 전달할 수있는 방법

"이 방법은 개방 장치로 메모리 버퍼의 바이트를 송신"인가?

SendData(PAnsiChar(@CommandBytes[0]), SizeOf(CommandBytes)); 

을하지만 사전에 ...

감사를 작동하지 않습니다 델파이에 새로운 해요

, 나는 시도했다.

+1

'SendData' 함수가 기묘하게 설계된 것처럼 보입니다. C 및 C++과 달리 Pascal에는 byte와 char에 대해 별도의 유형이 있습니다. 그래서 나는 보통'PAnsiChar'가 null로 끝나는 포인터가 될 것을 기대합니다. 그리고'PByte'로 선언 된 바이트 배열에 대한 포인터. 'SendData'는 제 3자가 정의한 것입니까? 어떤 경우에는 당신이 그것에 맞춰야한다고 생각합니다. 그러나 그것이 당신의 기능이라면 나는 그것을 'PByte'로 바꿀 것입니다. –

+0

죄송합니다. 몰랐습니다 ... 나는 당신의 대답을 받아들입니다. – user2075861

답변

7

SizeOf() 포인터의 크기를 산출 이후

사용 Length(CommandBytes),이 경우에 할당 된 버퍼 크기 인 배열의 요소 수를 얻을 수있다. 동적 배열은 배열의 첫 번째 요소에 대한 포인터로 표현되는 참조 유형입니다. 따라서 SizeOf()은 포인터의 크기를 반환합니다. 그리고 그것은 당신에게 아무 소용이 없습니다.

는 대신 Length()를 사용해야합니다 :

SendData(PAnsiChar(@CommandBytes[0]), Length(CommandBytes)); 

Length() 함수는 배열의 요소 수를 반환합니다.

무엇보다 나는 PAnsiChar으로 전송하는 방법을 간소화합니다. 이 같은 더 간결을 수행 할 수 있습니다 CommandBytes는, 동적 배열에 대한 참조되고 있기 때문에 의미입니다

SendData(PAnsiChar(CommandBytes), Length(CommandBytes)); 

는, 배열의 첫 번째 요소를 가리 킵니다.

1

SizeOf(CommandBytes)은 포인터 크기를 반환합니다. 인 SizeOf 동적 배열 (바이트) = 1

+1

'Length'는 크기가 아닌 요소 수를 반환합니다. SizeOf (요소)가 1이기 때문에 그냥 같은 일이 발생하면 –

+0

모두에게 감사드립니다! – user2075861