我正在尝试从C ++代码源文件创建一个Mex文件,以便与Matlab一起使用。由于我不太了解的向量类定义处理,我编译错误。我想知道如何修改代码才能工作。下面我将展示相关代码的各个部分,我将其分为四个部分以便进一步说明(计算代码,MexFunction代码,Vector类定义和编译错误):
#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 )
...
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]);
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;
...
>> 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 :(得分:6)
至少有关char16_t
的错误消息可能是由于您使用Visual Studio 2010和MATLAB R2009b这一事实。对于这个版本的MATLAB,该编译器太新了。请参阅Supported Compilers list for R2009b。
不太清楚其他错误,但是:
Vector& r_sat(3);
对我来说似乎很可疑C ++:因为它是对向量的引用,你正在做的是创建一个大小为3的临时Vector,然后初始化引用以引用那个临时的。
最好将r_sat
声明为Vector
。
然后你有:
r_sat = mxGetPr(prhs[0]);
mxGetPr()
函数返回一个指向double数组的指针,但Vector类没有operator=
,它以double*
为参数。
也许是这样的:
r_sat = Vector(mxGetPr(prhs[0]), 3); // use the Vector(double*, int N) constructor
Vector
类是C ++,而不是C. lcc
编译器是C编译器,它不了解C ++。如果您要编译C ++ MEX文件,则需要运行mex -setup
并选择支持的C ++编译器(通常是Visual Studio)。mex
决定是否构建C或C ++ MEX文件(影响它是否调用C或C ++编译器进行实际编译和链接)的方式基于文件扩展名。因此,将AccelSolrad.c
重命名为AccelSolrad.cpp
,您应该很高兴。答案 1 :(得分:1)
我想我可能会有一些东西......虽然我之前从未与const obj&
合作过。
您将主代码中的矢量类实例化为常量:
const Vector& r_sat(3);
然后你试图将向量r_span分配给一个数组。由于r_span被声明为常量,你不能。您必须将其作为构造函数的一部分。