Main Content

C 공유 라이브러리 함수의 포인터 인수 표현하기

C 함수의 포인터 인수

외부 라이브러리의 함수 대부분은 참조 방식으로 인수를 전달합니다. 참조 방식으로 전달할 때는 값에 대한 포인터를 전달합니다. 함수 시그니처에서 포인터 인수는 Ptr이나 PtrPtr로 끝나는 이름을 갖습니다. MATLAB®은 참조 방식의 전달을 지원하지 않지만, C 포인터와 호환되는 lib.pointer 객체를 만들어 MATLAB 인수로 사용할 수 있도록 하고 있습니다. 이 객체는 MATLAB lib.pointer 클래스의 인스턴스입니다.

함수의 시그니처가 인수를 포인터로 선언한 경우에도, 종종 MATLAB 변수를 단순히 전달할 수 있습니다(인수를 값 방식으로 전달). 그러나, 다음과 같은 경우에는 lib.pointer를 전달하는 것이 더 유리합니다.

  • 입력 인수의 데이터를 수정하려는 경우.

  • 대량의 데이터를 전달할 때 MATLAB에서 데이터의 복사본을 만드는 시기를 제어하려는 경우.

  • 라이브러리에서 포인터를 저장하고 사용하므로, MATLAB 함수로 lib.pointer 객체의 수명을 제어하려는 경우.

Void 포인터에 문자열 넣기

C에서는 문자를 8비트 정수로 나타냅니다. MATLAB의 문자형 배열을 입력 인수로 사용하려면 문자열을 적절한 유형으로 변환하고 voidPtr을 생성하십시오. 예를 들어, 다음과 같이 입력합니다.

str = 'string variable';
vp = libpointer('voidPtr',[int8(str) 0]);

구문 [int8(str) 0]은 C 함수에 필요한 null 종료 문자열을 생성합니다. 문자열을 읽어 들이고 포인터 유형을 확인하려면 다음을 입력하십시오.

char(vp.Value)
vp.DataType
ans = 
string variable
ans = 
voidPtr

외부 함수의 프로토타입이 인수를 포인터로 정의한 경우, MATLAB은 값 방식 인수를 자동으로 참조 방식 인수로 변환합니다. 문자열을 가리키는 voidPtr을 입력 인수로 받는 함수를 호출하려면 다음 구문을 사용하십시오.

func_name([int8(str) 0])

MATLAB이 인수를 값에서 포인터로 변환하더라도, 그 데이터형은 올바른 유형이어야 합니다.

외부 라이브러리에 대한 메모리 할당

일반적으로, MATLAB은 사용자가 변수를 라이브러리 함수에 전달할 때마다 유효한 메모리 주소를 전달합니다. 라이브러리가 포인터를 저장해 두고 일정 기간 동안 버퍼에 액세스하는 경우라면 lib.pointer 객체를 사용하십시오. 이러한 경우 MATLAB은 버퍼의 수명을 제어해야 하며, 사용자는 데이터의 복사본이 만들어지지 않도록 해야 합니다. 다음 의사코드는 이러한 상황에서 lib.pointer를 어떻게 사용하는지 보여주는 비동기 데이터 수집의 예입니다.

외부 라이브러리 myLib에 다음과 같은 함수가 있다고 가정하겠습니다.

AcquireData(int points,short *buffer)
IsAquisitionDone(void)

여기서 buffer는 다음과 같이 선언됩니다.

short buffer[99]

먼저, 다음과 같이 99개의 점으로 구성된 배열을 가리키는 lib.pointer를 생성합니다.

BufferSize = 99;
pBuffer = libpointer('int16Ptr',zeros(BufferSize,1));

그런 다음, 데이터 수집을 시작하고 완료될 때까지 루프에서 대기합니다.

calllib('myLib','AcquireData,BufferSize,pbuffer)
while (~calllib('myLib','IsAcquisitionDone')
  pause(0.1)
end

다음 명령문은 버퍼에 있는 데이터를 읽어 들입니다.

result = pBuffer.Value;

라이브러리가 버퍼 사용 작업을 마치면, 다음과 같이 MATLAB 변수를 지웁니다.

clear pBuffer

참고 항목