使用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格式会非常昂贵,因此想知道这个问题是否有任何解决方案?
谢谢,
答案 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函数如下:
function c = MyAdd(a,b)
c = a + b;
end
使用mcc
编译器编译成C ++共享库:
>> mcc -N -W cpplib:libMyAdd -T link:lib MyAdd.m -v
接下来是一个用于测试库的C ++程序。我创建了一个包含两个mwArray
实例的类:
#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