我使用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实例!

干杯,

10-07 21:06