Mex-file using a vector class definition
6 views (last 30 days)
Show older comments
I am trying to create a Mex-file from a C++ code source file to use it with Matlab. I have compiling errors due to the vector class definition handling that I do not understand very well. I would like to know how I should modify the code to work. Below I show the relevant code's parts that I have divided into four sections for clarifying more (Computational code, MexFunction code, Vector class definition and compiling errors):
+ Computational routine's code:
`#include "mex.h"`
`#include "SAT_VecMat.h"`
void AccelSolrad (const Vector& r, const Vector& r_Sun, double Area,
double mass,double CR, double P0, double AU,const Vector& Accel )
+ mexFunction's code:
...
const Vector& r_sat(3); % dummy argument name for r
const Vector& r_sol(3); % dummy argument name for r_Sun
const Vector& outMatrix(3); % dummy argument name for Accel
...
r_sat = mxGetPr(prhs[0]);
r_sol = mxGetPr(prhs[1]);
plhs[0] = mxCreateDoubleMatrix(1,3,mxREAL);
outMatrix = mxGetPr(plhs[0]);
+ Vector class definition included in SAT_VecMat.h:
class Vector
{
public:
friend class Matrix;
// Constructors
Vector (); // Vector without elements
Vector (int Size); // Nullvector of specified size
Vector (const Vector& V); // Vector copy
Vector (const double* p, int N); // Array copy
Vector (double x, double y, double z); // 3dim-Vector
Vector (double x, double y, double z, // 6dim-Vector
double X, double Y, double Z);
// Destructor
~Vector();
// Size
int size() const { return n; };
Vector& resize(int Size);
// Assignment
Vector& operator=(const double value);
Vector& operator=(const Vector& V);
// Component access (Fortran notation)
double operator () (int i) const { return v[i]; };
double& operator () (int i) { return v[i]; };
Vector slice (int first, int last) const;
...
+ Compiling errors:
>> mex AccelSolrad.cpp
AccelSolrad.cpp
c:\program files\matlab\r2009b\extern\include\matrix.h(332) : error C2371: 'char16_t' : redefinition; different basic types
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\yvals.h(576) : see declaration of 'char16_t'
AccelSolrad.cpp(14) : error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Vector' (or there is no acceptable conversion) d:\po\ejemplos\SAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)' d:\po\ejemplos\SAT_VecMat.h(70): or 'Vector &Vector::operator =(const Vector &)' while trying to match the argument list '(const Vector, Vector)'
AccelSolrad.cpp(18) : error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Vector' (or there is no acceptable conversion) d:\po\ejemplos\SAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)' d:\po\ejemplos\SAT_VecMat.h(70): or 'Vector &Vector::operator =(const Vector &)' while trying to match the argument list '(const Vector, Vector)'
AccelSolrad.cpp(94) : error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Vector' (or there is no acceptable conversion) d:\po\ejemplos\SAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)' d:\po\ejemplos\SAT_VecMat.h(70): or 'Vector &Vector::operator =(const Vector &)' while trying to match the argument list '(const Vector, double *)'
AccelSolrad.cpp(96) : error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Vector' (or there is no acceptable conversion) d:\po\ejemplos\SAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)' d:\po\ejemplos\SAT_VecMat.h(70): or 'Vector &Vector::operator =(const Vector &)' while trying to match the argument list '(const Vector, double *)'
AccelSolrad.cpp(112) : error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Vector' (or there is no acceptable conversion) d:\po\ejemplos\SAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)' d:\po\ejemplos\SAT_VecMat.h(70): or 'Vector &Vector::operator =(const Vector &)' while trying to match the argument list '(const Vector, double *)'
C:\PROGRA~1\MATLAB\R2009B\BIN\MEX.PL: Error: Compile of 'AccelSolrad.cpp' failed.
0 Comments
Accepted Answer
Kaustubha Govind
on 20 Jun 2011
It looks like char16_t has two different definitions in matrix.h (included with MATLAB) and yvals.h (MSVC header), and is causing a conflict. There is a similar discussion here: http://www.mathworks.com/matlabcentral/newsreader/view_thread/281754
The solution using a namespace around matrix.h should be a good way to resolve the issue.
Regarding the rest of your errors, it has to do with your use of Vector object(s) - I'm not sure what code you have at lines 14, 18, 94, 96 and 112, but it looks like you are trying to assign to a const Vector - try discarding the const qualifier for all relevant Vectors.
0 Comments
More Answers (0)
See Also
Categories
Find more on Write C Functions Callable from MATLAB (MEX Files) in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!