2015-01-02 2 views
1

C에서 .dll을 만들었고 그 주소를 호출하여 변수를 변경하는 함수가 있습니다.matlab에 C 함수에 대한 변수의 주소를 호출

char logfile[1000] = "i.log"; 
bool bRet = OpenDevice(logfile); 
//FindHardware 
int model; 
int *ptr = &model; 
char name_buffer[1000], sn_buffer[1000]; 
FindHardware(ptr, name_buffer, 1000, sn_buffer, 1000); 
printf("Hardware found: %s", name_buffer); 

모델 변수가 name_buffer sn_buffer과 함께 변경된다 : I는 C의 기능 중 일부를 사용하여 코드의 부분을 가지고있다. 지금은 MATLAB에 대한이 코드를 복제하기 위해 노력하고있어 나는이 정확히 같은 일을해야 fiqured :

header = 'header.h'; % url for header 
dll = 'dll.dll'; % url for .dll 
loadlibrary(dll, header); 

logfile = 'i.log'; 
bRet = calllib('dll', 'OpenDevice', logfile); 

model_number = 0; 
% FindHardware 
name_buffer = blanks(1000); 
sn_buffer = blanks(1000); 
model_number_pointer = libpointer('int32Ptr', model_number); 
calllib('dll', 'FindHardware', model_number_pointer, name_buffer, 1000, sn_buffer, 1000); 

을하지만 변수 중 어느 것도 변경되지 않습니다. 내가 만든 포인터와 관련이 있다고 상상해보십시오. model_number의 주소에 액세스하는 다른 방법이 있습니까?

+0

sn_buffer는'model_number_pointer.Value' 여전히 0 : 내가해야 할 일을했을 그 모든이 무엇입니까? 왜 다른 값에 대한 포인터가 없습니까? – chappjc

답변

0

마침내이 답변을 찾을 때까지 50 개 이상의 페이지를 검색한다고 생각할 수 없습니다. 간단합니다. Matlab은 calllib에서 호출 된 함수의 각 인수를 반환하고이를 배열로 반환합니다.

[irrelevant, model_number, name_buffer, sn_buffer] = calllib('dll', 'FindHardware', 0, blanks(1000), 1000, blanks(1000), 1000); % bufferSize should be atleast 16 bytes long 

올바른 변수의 모든 모델 _ 반환됩니다, name_buffer, 그리고 당신은 의미

0

모든 출력 인수에 대해 lib.pointer 클래스 인 MATLAB's pointers을 사용해야 할 수도 있습니다. 또한 각각의 데이터 유형을 설정해야 할 수도 있습니다.

model_number = int32(0); 
modelPtr = libpointer('int32Ptr',model_number); 

name_buffer = blanks(1000); 
nameBufPtr = libpointer('stringPtr',name_buffer); 

sn_buffer = blanks(1000); 
snBufPtr = libpointer('stringPtr',name_buffer); 

calllib('dll', 'FindHardware', modelPtr , nameBufPtr , 1000, snBufPtr, 1000); 

그게 도움이 되나요? 아마도 libfunctionsview dll은 정확한 구문을 밝힐 것입니다. 디버그를 돕기 위해 출력 인수를 얻길 원할 수도 있습니다 (out = calllib(...)).

+0

도와 줘서 고마워하지만 이미 그 길을 시도해 봤어. get (ptr, 'Value')을 사용하여 값을 반환하면 대부분의 값을 가져 오는 것이 유용하지만 char * (stringPtr는 ** char를 반환합니다.)에서는 작동하지 않습니다. 어쨌든 포인터를 만드는 것보다 훨씬 간단하고 효율적이었습니다. –

+0

@AbsentLung 잘 된 것을 기쁘게 생각합니다. }'calllib'의 출력 매개 변수를 살펴볼 것을 제안했지만, 각각의 입력을 그렇게 매핑했는지는 몰랐습니다. 좋은 정보, 고마워. – chappjc

관련 문제