포인터 전달하기 예제
multDoubleRef
함수
shrlibsample
라이브러리의 multDoubleRef
함수는 입력값에 5
를 곱합니다.
EXPORTED_FUNCTION double *multDoubleRef(double *x) { *x *= 5; return x; }
입력값은 double
형에 대한 포인터이며, 함수는 double
형에 대한 포인터를 반환합니다. MATLAB® 함수 시그니처는 다음과 같습니다.
반환 유형 | 이름 | 인수 |
---|---|---|
[lib.pointer, | 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_structPtrPtr | allocateStruct | (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'