【发布时间】:2014-08-19 13:57:52
【问题描述】:
我目前正在为 C++ 库开发一个包装器,以便它可以在 MATLAB 中使用。我希望我的 C++ 对象在 MATLAB 中,以便用户可以对它们做一些事情。实际上,我将这些 C++ 对象转换为 void *,因为 MATLAB 仅支持 C 头文件。这些 C 函数如下所示:
__declspec(dllexport) void *getPtr (int someArgument);
在 MATLAB 中,我这样调用函数:
ptr = calllib('LibName', 'getPtr', 42);
在 MATLAB 中,ptr 现在是 <1x1 lib.pointer>。除了将它传递给另一个 C 函数之外,我什么也做不了,如下所示:
__declspec(dllexport) int doSomethingWithPtr (void *ptr);
所以我在 MATLAB 中调用 result = calllib('LibName', 'doSomethingWithPtr', ptr);,它工作得非常好,并以指针作为参数来执行这个函数。 (我调试过C代码,指针和getPtr返回的指针一样。
我的 C 函数需要多个指针才能按照 C++ 库的预期工作。我已经将 MATLAB 矩阵中的数值数据传递给 C,它与 C 类型 mxArray 完美配合(参见:http://www.mathworks.de/de/help/matlab/apiref/mxarray.html)。为了将多个指针传递给 C,我构造了一个 MATLAB lib.pointers 数组,如下所示:
A = [];
for i = 1:10
ptr = calllib('LibName', 'getPtr', i);
A = [A, ptr];
end
我正在 MATLAB 中调用另一个 C 函数 (__declspec(dllexport) int doSomethingWithPtrArray (mxArray *ptrarr);):
ptr = calllib('LibName', 'doSomethingWithPtrArray', A);
在 C 函数中,我使用 mxGetN(ptrarr) 和 mxGetM(ptrarr) 获得了正确的数组维度。我还可以通过以下方式检索数据指针:
void *mexPtr = mxGetData(ptrarr);
问题是mexPtr 和下面的指针指向我以前什至没有分配或知道的内存中的位置。也许 MATLAB 在使用 void * 调用函数时会进行一些智能包装,而在我传递数组时不会这样做。 (我想我正在获取 MATLAB lib.pointer 包装器对象的地址??)
是否有人知道如何从 mxArray 中获取正确的指针(或解决方法),以便我可以一次评估多个指针?
【问题讨论】: