我使用MATLAB编译器运行时(mcr)创建了一个matlab文件的dll。我可以使用该函数并将所有变量轻松传递给该函数,而不会出现任何问题。
我的问题是当我有一个带有“mwArray”作为变量的类时,例如:
#include <samplemmfile.h>
#include <mclmcr.h>
#include <stdio.h>
class MModel{
int x;
mwArray y;
};
然后从中创建一个对象,运行时应用程序在“mclcppclass.h”头文件中引发异常:
Access violation executing location 0X0000000000.
每次我想调用这些函数时,将所有输入文件都包装并转换为matlab格式将是非常昂贵的,因此想知道是否有针对此问题的解决方案?
谢谢,
最佳答案
谢谢,我的问题实际上已经解决了!问题在于以下事实:初始化应在创建包含mwArray对象的类的任何实例之前完成。
例如,以下代码将在开头崩溃:
Class1.h:
#include "libInnerProduct.h"
class Class1
{
public:
Class1()
: a(1, 2, mxDOUBLE_CLASS), b(1, 2, mxDOUBLE_CLASS) {
double aa[] = {1 , 2};
double bb[] = {5 , 7};
a.SetData(aa, 2);
b.SetData(bb, 2);
}
double innerproduct() {
mwArray c;
InnerProd(1, c, a, b);
return (double)c;
}
private:
mwArray a, b;
};
Class2.h:
#include "Class1.h"
#include <mclmcr.h>
#include <mclcppclass.h>
class Class2
{
public:
Class2(){
if (!mclInitializeApplication(NULL,0) || !libInnerProductInitialize()) {
std::cerr << "failed to initialize" << std::endl;
exit(1);
}
obj=new Class1();
}
~Class2(){
libInnerProductTerminate();
mclTerminateApplication();
}
double inp(){
return obj->innerproduct();
}
private:
Class1* obj;
};
int main()
{
Class2 obj;
double sum = obj.inp();
std::cout << sum << std::endl;
return 0;
}
但是如果您在从Class2获取实例之前放置初始化部分,一切都会好起来的。另外,您也不能在主类之外拥有Class2实例!
干杯,