主要内容

이번역페이지는최신내용을담고있지않습니다。최신내용을문으로보려면여기를클릭하십시오。

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

C함수의포터수

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

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

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

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

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

Void포터에문자열넣기

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

str =字符串变量的;Vp = libpointer(“voidPtr”[int8 (str) 0]);

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

char (vp.Value)副总裁。数据类型
ans =字符串变量ans = voidPtr

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

func_name([int8 (str) 0])

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

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

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

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

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

여기서缓冲는다음과같이선언됩니다。

短的缓冲[99]

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

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

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

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

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

result = pBuffer.Value;

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

清晰的pbuf

참고 항목