在matlab中调用C函数的变量地址
Call the address of a variable for a C function in matlab
我在 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 的地址?
我认为您可能需要对所有输出参数使用 MATLAB's pointers、lib.pointer
class。您可能还需要设置每一个的数据类型。
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(...)
)。
我简直不敢相信我搜索了 50 多页才终于找到这个答案。很简单,Matlab returns 在 calllib 中调用的函数的每个参数和 returns 它作为一个数组。我所要做的就是:
[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
返回了所有正确的变量
我在 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 的地址?
我认为您可能需要对所有输出参数使用 MATLAB's pointers、lib.pointer
class。您可能还需要设置每一个的数据类型。
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(...)
)。
我简直不敢相信我搜索了 50 多页才终于找到这个答案。很简单,Matlab returns 在 calllib 中调用的函数的每个参数和 returns 它作为一个数组。我所要做的就是:
[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
返回了所有正确的变量