How do I pass variables from a MATLAB script to C++?

5 次查看(过去 30 天)
I would like to pass data stored in a MATLAB script variable to a C++ variable.
Please could someone let me know how I can implement this. Some step-by-step instructions would be very useful.
Many thanks.
  2 个评论
Geoff Hayes
Geoff Hayes 2014-8-23
Paul - what do you intend to do with the variable passed to the C++ function? Return something back to MATLAB? See write C/C++ source files for some examples on writing C/C++ functions and classes, and how to pass data from MATLAB to the function.
Paul Whittington
Paul Whittington 2014-8-23
Geoff - thanks for your reply and the link. I indend to pass the variable one way. I am using OpenTLD and would like to use the tracked object's current XY co-ordinates to control the mouse cursor via the C++ function, SetCursorPos(). Therefore, the co-ordinates would need to passed from the TLD MATLAB script to my C++ code everytime they change. What is the best/easist method of doing this? I am quite new to MATLAB. Thank you.

请先登录,再进行评论。

回答(2 个)

Friedrich
Friedrich 2014-8-25
编辑:Friedrich 2014-8-25
Hi,
Why don't you use JAVA for this? It is way easier to move the mouse with JAVA than with platform dependent c++ code. See the Robot Class:
So the MATLAB code would be:
robot = java.awt.Robot()
robot.mouseMove(0,0)
I can't be any easier than this I think.

Geoff Hayes
Geoff Hayes 2014-8-23
Paul - if you just want to call the Windows SetCursorPos API from within MATLAB, then you can create a simple C-file based on the link I posted in my comment
#include "mex.h"
#include <windows.h>
#include <winuser.h>
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[] )
{
double *ptr = 0;
double xOffset = 0;
double yOffset = 0;
HWND window = GetDesktopWindow;
// get the input offsets
if (nrhs>=1)
{
ptr = mxGetPr(prhs[0]);
xOffset = *ptr;
}
if (nrhs>=2)
{
ptr = mxGetPr(prhs[1]);
yOffset = *ptr;
}
printf("offsets are %f %f\n", xOffset, yOffset);
if (window)
{
RECT rect = {0};
GetClientRect(window, &rect);
SetCursorPos(rect.right+xOffset, rect.bottom+yOffset);
}
}
Just save this file as (for example) setcursropos.c (which will be the name of the MEX function that you will call from your MATLAB code) and build the MEX file by typing the following in the (MATLAB) Command Window
mex setcursropos.c
If MEX has been set up with a C/C++ compiler, you should see something like
Building with 'lcc-win32'.
MEX completed successfully.
I am using R2014a so the default compiler is lcc-win32.
The inputs to this function are offsets from the Desktop window rectangle top-left corner. You can call this function to move the cursor around from within your MATLAB code, or just from the Command Window as
% zero offsets so cursor should be set to top-left corner
setcursorpos(0,0)
% cursor should be set to (roughly) bottom-left corner
setcursorpos(0,10000)
% cursor should be set to (roughly) bottom-right corner
setcursorpos(10000,10000)
% cursor should be set to (roughly) top-right corner
setcursorpos(10000,0)
% cursor should be set to somwhere away from edges
setcursorpos(500,500)
Note how we invoke the function using the name of the C-file. You should be able to adapt the above to translate coordinates from your MATLAB code to the appropriate cursor position.
Try it and see what happens!
  4 个评论
Paul Whittington
Paul Whittington 2014-8-24
Geoff - I just copied your code without modifing it. I was not sure how to create a new C file in MATLAB, so I create a txt file and changed the extension to .c. Maybe this is why it is not building? I've attached the file as a zip (.c files can't be attached).
I am running mex setcursorpos.c.
Thank you.
Geoff Hayes
Geoff Hayes 2014-8-24
Paul - I just compiled your file thinking that I wouldn't see the same error and I did! There is just one bug in the code. The mexFunction signature is (in your file) is defined as
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray prhs[] )
which is slightly different than mine. Check the last input parameter - prhs should be a pointer like plhs. So because this signature is different from the standard mexFunction signature, then the redeclaration error is clear.
Just change the signature to
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
recompile, and it should work. (It did for me!)

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Write C Functions Callable from MATLAB (MEX Files) 的更多信息

标签

产品

Community Treasure Hunt

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

Start Hunting!

Translated by