matlab — C ++: mwArray как переменная в классе c ++

Используя MATLAB Compiler Runtime (mcr) я создал dll из файла matlab. Я могу использовать функцию и передать все переменные функции легко и без проблем.

Моя проблема, когда у меня есть класс с «mwArray» в качестве переменной, например:

#include <samplemmfile.h>
#include <mclmcr.h>
#include <stdio.h>

class MModel{

int x;
mwArray y;
};

и затем я создаю объект из него, приложение во время выполнения создает исключение в заголовочном файле «mclcppclass.h»:

Access violation executing location 0X0000000000.

Было бы довольно дорого оборачивать и преобразовывать все входные файлы в формат matlab каждый раз, когда я хочу вызвать эти функции, поэтому задумался, есть ли какое-нибудь решение для этой проблемы?

Спасибо,

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

Другие решения

Я попытался с простым примером на моем конце (я использую предыдущий пример мой), но я не могу воспроизвести проблему.

Функция MATLAB, которую мы упаковываем, заключается в следующем:

MyAdd.m

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

Скомпилирован в общую библиотеку C ++ с использованием mcc компилятор:

>> 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
0

По вопросам рекламы [email protected]