주요 콘텐츠

포인터 전달하기 예제

multDoubleRef 함수

shrlibsample 라이브러리의 multDoubleRef 함수는 입력값에 5를 곱합니다.

EXPORTED_FUNCTION double *multDoubleRef(double *x) 
{
     *x *= 5;
     return x;
}

입력값은 double형에 대한 포인터이며, 함수는 double형에 대한 포인터를 반환합니다. MATLAB® 함수 시그니처는 다음과 같습니다.

반환 유형이름인수
[lib.pointer,
doublePtr]
multDoubleRef(doublePtr)

double형의 포인터 전달하기

이 예제에서는 C 함수 multDoubleRef에 대한 포인터를 생성하고 전달하는 방법을 보여줍니다.

함수가 포함된 라이브러리를 불러옵니다.

if not(libisloaded('shrlibsample'))
    addpath(fullfile(matlabroot,'extern','examples','shrlib'))
    loadlibrary('shrlibsample')
end

입력 인수 X에 대한 포인터 Xptr을 생성합니다.

X = 13.3;
Xptr = libpointer('doublePtr',X);

Xptr의 내용을 확인합니다.

get(Xptr)
       Value: 13.3000
    DataType: 'doublePtr'

함수를 호출하고 결과를 확인합니다.

calllib('shrlibsample','multDoubleRef',Xptr);
Xptr.Value
ans = 
66.5000

Xptr은 핸들 객체입니다. 이 핸들의 복사본은 동일한 기본 객체를 참조하며, 핸들 객체에 대해 수행하는 모든 작업은 기본 객체의 모든 복사본에 영향을 미칩니다. 그러나 Xptr은 C 언어 포인터가 아닙니다. Xptr이 X를 가리키기는 하지만 X의 주소가 포함되어 있지 않습니다. 함수는 Xptr의 Value 속성을 수정하지만 기본 객체 X의 값을 수정하지 않습니다. X의 원래 값은 변경되지 않습니다.

X
X = 
13.3000

기존 lib.pointer 객체에서 포인터 오프셋 생성하기

이 예제에서는 MATLAB 벡터 X의 일부에 대한 포인터를 만드는 방법을 보여줍니다. 새 포인터는 원래 포인터가 존재하는 경우에만 유효합니다.

벡터에 대한 포인터를 만듭니다.

X = 1:10;
xp = libpointer('doublePtr',X);
xp.Value
ans = 1×10

     1     2     3     4     5     6     7     8     9    10

lib.pointer 플러스 연산자(+)를 사용하여 X의 마지막 6개 요소에 대한 포인터를 만듭니다.

xp2 = xp + 4;
xp2.Value
ans = 1×6

     5     6     7     8     9    10

다중 포인터

다중 포인터는 둘 이상의 참조 단계가 있는 인수입니다. MATLAB의 다중 포인터 유형에는 접미사 PtrPtr가 사용됩니다. 예를 들어, C 인수 double **에는 doublePtrPtr을 사용합니다.

다중 포인터 인수를 받는 함수를 호출할 경우 lib.pointer 객체를 사용하여 MATLAB에서 이 인수를 다중 포인터로 변환하도록 하십시오.

allocateStruct 함수와 deallocateStruct 함수

shrlibsample 라이브러리의 allocateStruct 함수는 c_structPtrPtr 인수를 받습니다.

EXPORTED_FUNCTION void allocateStruct(struct c_struct **val) 
{
    *val=(struct c_struct*) malloc(sizeof(struct c_struct));
    (*val)->p1 = 12.4;
    (*val)->p2 = 222;
    (*val)->p3 = 333333;
}

MATLAB 함수 시그니처는 다음과 같습니다.

반환 유형이름인수
c_structPtrPtrallocateStruct(c_structPtrPtr)
voidPtr deallocateStruct(voidPtr)

다중 포인터 전달하기

이 예제에서는 다중 포인터를 C 함수에 전달하는 방법을 보여줍니다.

allocateStruct 함수와 deallocateStruct 함수가 포함된 라이브러리를 불러옵니다.

if not(libisloaded('shrlibsample'))
    addpath(fullfile(matlabroot,'extern','examples','shrlib'))
    loadlibrary('shrlibsample')
end

c_structPtr 포인터를 생성합니다.

sp = libpointer('c_structPtr');

allocateStruct 함수를 호출하여 구조체에 메모리를 할당합니다.

res = calllib('shrlibsample','allocateStruct',sp)
res = struct with fields:
    p1: 12.4000
    p2: 222
    p3: 333333

allocateStruct 함수에 의해 생성된 메모리를 비웁니다.

calllib('shrlibsample','deallocateStruct',sp)
ans = 
libpointer

문자열로 구성된 배열 반환하기

문자열로 구성된 배열을 읽어 들이는 함수 acquireString이 포함된 라이브러리 myLib가 있다고 가정해 보겠습니다. 함수 시그니처는 다음과 같습니다.

반환 유형이름인수
char**acquireString(void)
char** acquireString(void)

다음 의사코드에서는 반환 값, 즉 문자열에 대한 포인터로 구성된 배열을 조작하는 방법을 보여줍니다.

ptr = calllib(myLib,'acquireString')

MATLAB은 stringPtrPtr 유형의 lib.pointer 객체 ptr을 만듭니다. 이 객체는 첫 번째 문자열을 가리킵니다. 다른 문자열을 보려면 포인터를 증가시키십시오. 예를 들어, 처음 세 개의 문자열을 표시하려면 다음과 같이 입력하십시오.

for index = 0:2
    tempPtr = ptr + index;
    tempPtr.Value
end 
ans = 
    'str1'
ans = 
    'str2'
ans = 
    'str3'

참고 항목