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

8 views (last 30 days)
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 Comments
Geoff Hayes
Geoff Hayes on 23 Aug 2014
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 on 23 Aug 2014
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.

Sign in to comment.

Answers (2)

Friedrich
Friedrich on 25 Aug 2014
Edited: Friedrich on 25 Aug 2014
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 on 23 Aug 2014
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 Comments
Paul Whittington
Paul Whittington on 24 Aug 2014
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 on 24 Aug 2014
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!)

Sign in to comment.

Categories

Find more on Write C Functions Callable from MATLAB (MEX Files) in Help Center and File Exchange

Tags

Products

Community Treasure Hunt

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

Start Hunting!