C ++:mwArray作为c ++类中的变量

时间:2014-09-19 14:30:50

标签: c++ matlab matlab-compiler

使用MATLAB Compiler Runtime(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格式会非常昂贵,因此想知道这个问题是否有任何解决方案?

谢谢,

2 个答案:

答案 0 :(得分:1)

谢谢,我的问题实际上已经解决了!问题在于,应该在创建包含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实例!

干杯,

答案 1 :(得分:0)

我尝试了一个简单的例子(我正在重用我的previous example),但我无法重现这个问题。

我们打包的MATLAB函数如下:

MyAdd.m

function c = MyAdd(a,b)
    c = a + b;
end

使用mcc编译器编译成C ++共享库:

>> mcc -N -W cpplib:libMyAdd -T link:lib MyAdd.m -v

接下来是一个用于测试库的C ++程序。我创建了一个包含两个mwArray实例的类:

testMyAdd.cpp

#include "libMyAdd.h"    // generated library

class MyClass
{
  public:
    MyClass()
    : a(2, 2, mxDOUBLE_CLASS, mxREAL), b(2, 2, mxDOUBLE_CLASS, mxREAL) {
        double aa[] = {1.0, 2.0, 3.0, 4.0};
        double bb[] = {5.0, 6.0, 7.0, 8.0};
        a.SetData(aa, 4);
        b.SetData(bb, 4);
    }
    mwArray add() {
        mwArray c;
        MyAdd(1, c, a, b);
        return c;
    }
  private:
    mwArray a, b;
};

int main()
{
    if (!mclInitializeApplication(NULL,0) || !libMyAddInitialize())  {
        std::cerr << "failed to initialize" << std::endl;
        return -1;
    }

    try {
        MyClass obj;
        mwArray sum = obj.add();
        std::cout << "a + b = \n" << sum << std::endl;
    } catch (const mwException& e) {
        std::cerr << e.what() << std::endl;
        return -2;
    } catch (...) {
        std::cerr << "Unexpected error thrown" << std::endl;
        return -3;
    } 

    libMyAddTerminate();   
    mclTerminateApplication();
    return 0;
}

以上运行得很好:

>> mbuild testMyAdd.cpp libMyAdd.lib -v
C:\> testMyAdd.exe
a + b =  
     6    10 
     8    12