Main Content

포인터 전달하기 예제

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)

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

문자열로 구성된 배열을 읽어 들이는 함수 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'

참고 항목