array pointers in matlab

8 次查看(过去 30 天)
Sam Van der Jeught
Sam Van der Jeught 2011-4-19
Hi all,
I'm trying to implement a dll that I have created in Labview into Matlab. When the output value is a simple integer or floating point number, this poses no problems. However, when the dll created in Labview exports an array as output, an array pointer is used:
void __stdcall Test(int16_t outputArray[], int32_t len); //Testfunction in header file
My question is how do I read out the data present at this point in memory, in Matlab? As said before, when the output is a single number, I can simply
loadlibrary SharedLib.dll SharedLib.h alias lib
output = calllib('lib', 'Test')
unloadlibrary lib
in Matlab, but this obviously doesn't work now. Any guidance towards a solution would be greatly appreciated.
Best regards,
Sam
  1 个评论
Malcolm Lidierth
Malcolm Lidierth 2011-4-19
v = zeros(10,1,'uint16');
v = calllib('lib','Test',v,int32(10));
should do the trick. MATLAB creates the libpointer automatically as I recall. On output, v is a int16 array, not a libpointer - hence no v.value property.

请先登录,再进行评论。

回答(3 个)

Chirag Gupta
Chirag Gupta 2011-4-19
Hi Sam,
I coded up a sample library with a signature of:
void TestFunc(int outArray[],int len);
Then to use this, you need to make use of libpointers.
Sample code for using my function was:
loadlibrary('TestShared.dll','TestFile.h','alias','lib')
libfunctionsview lib
var = zeros(10,1);
% Creating a pointer from var of int32 type. In your case it would % be int16
v = libpointer('int32Ptr',var)
v.Value
v = calllib('lib','TestFunc',v,int32(10))
v.Value
unloadlibrary lib
You can find more examples with other types in the documentation
  1 个评论
Kaustubha Govind
Kaustubha Govind 2011-4-19
The documentation is here: http://www.mathworks.com/help/techdoc/matlab_external/f42650.html

请先登录,再进行评论。


Sam Van der Jeught
Sam Van der Jeught 2011-4-19
Hi Chirag,
Thanks for the fast reply. I implemented your code and adapted it to suit my specifics:
loadlibrary('SharedLib.dll','SharedLib.h','alias','lib')
libfunctionsview lib
var = zeros(10,1);
% Creating a pointer from var of int32 type. In your case it would % be int16
1
v = libpointer('int16Ptr',var)
2
v.Value
3
v = calllib('lib','Test',v,int32(10))
4
v.Value
unloadlibrary lib
but I end up with the following error when I run the above code in Matlab:
ans =
1
v =
libpointer
ans =
2
ans =
0
0
0
0
0
0
0
0
0
0
ans =
3
v =
0
0
0
0
0
0
0
0
0
0
ans =
4
??? Attempt to reference field of non-structure array.
Error in ==> test at 12 v.Value
Maybe you have an idea of what still goes wrong.
Thanks in advance,
Sam
  1 个评论
Chirag Gupta
Chirag Gupta 2011-4-19
Can you check what exactly the function signature is returning in MATLAB.
libfunctionsview lib should show that.
Also, try whos v to check v's type after the function call.

请先登录,再进行评论。


Jim Hokanson
Jim Hokanson 2014-2-14
Just in case anyone comes across this, I think you want the following:
For: void __stdcall Test(int16_t outputArray[], int32_t len); //Testfunction in header file
Assuming the library is referred to as 'lib'
len = 10; temp = zeros(1,len,'int16'); ptr = libpointer('int16Ptr',temp);
calllib('lib','Test',ptr,int32(len))
data = get(ptr,'Value')
The key point is that the output is void, so you don't assign an output to calllib, i.e. you don't do:
output = calllib
Since you are working with a pointer you need to go back to the pointer and extract its value.
NOTE: I wasn't sure what the value was, but if you do get(ptr) Matlab will display information about the object.

类别

Help CenterFile Exchange 中查找有关 LabVIEW 的更多信息

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by