【问题标题】:Call the address of a variable for a C function in matlab在matlab中调用C函数的变量地址
【发布时间】:2015-01-02 18:04:36
【问题描述】:

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

【问题讨论】:

  • 你的意思是model_number_pointer.Value还是0?为什么没有指向其他值的指针?

标签: c matlab pointers dll memory-address


【解决方案1】:

我认为您可能需要对所有输出参数使用MATLAB's pointerslib.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(...))。

【讨论】:

  • 嘿,感谢您的帮助,但我已经尝试过这条路线。如果您使用 get(ptr, 'Value') 返回值,则获取大多数值很有用,但它不适用于 char *(stringPtr 返回 **char)。我发现的答案比创建指针更简单有效。
  • @AbsentLung 我很高兴这有效。注意我建议查看calllib 的输出参数,但我不知道它以这种方式映射了每个输入。很好的信息,谢谢。
【解决方案2】:

我不敢相信我已经搜索了 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 返回所有正确的变量

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2014-04-12
    • 2013-03-20
    • 2011-10-17
    相关资源
    最近更新 更多