在matlab中为C函数调用变量的地址

时间:2015-01-02 18:04:36

标签: c matlab pointers dll memory-address

我在C中创建了一个.dll,其中有函数通过调用其地址来更改变量。我有一段代码使用了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一起被更改。现在我正在尝试为matlab复制这段代码,并且我发现它应该完全相同:

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的地址吗?

2 个答案:

答案 0 :(得分:0)

我认为您可能需要对所有输出参数使用MATLAB's pointers lib.pointer类。您可能还需要设置每个数据的数据类型。

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(...))。

答案 1 :(得分: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

为model_number,name_buffer和sn_buffer返回所有正确的变量