Borrar filtros
Borrar filtros

array pointers in matlab

9 visualizaciones (últimos 30 días)
Sam Van der Jeught
Sam Van der Jeught el 19 de Abr. de 2011
Respondida: Jim Hokanson el 14 de Feb. de 2014
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 comentario
Malcolm Lidierth
Malcolm Lidierth el 19 de Abr. de 2011
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.

Iniciar sesión para comentar.

Respuestas (3)

Chirag Gupta
Chirag Gupta el 19 de Abr. de 2011
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 comentario
Kaustubha Govind
Kaustubha Govind el 19 de Abr. de 2011
The documentation is here: http://www.mathworks.com/help/techdoc/matlab_external/f42650.html

Iniciar sesión para comentar.


Sam Van der Jeught
Sam Van der Jeught el 19 de Abr. de 2011
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 comentario
Chirag Gupta
Chirag Gupta el 19 de Abr. de 2011
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.

Iniciar sesión para comentar.


Jim Hokanson
Jim Hokanson el 14 de Feb. de 2014
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.

Categorías

Más información sobre Call C from MATLAB en Help Center y File Exchange.

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by