Используя 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 каждый раз, когда я хочу вызвать эти функции, поэтому задумался, есть ли какое-нибудь решение для этой проблемы?
Спасибо,
Спасибо, моя проблема была решена на самом деле! проблема заключается в том, что инициализация должна быть выполнена до создания любого экземпляра класса, который содержит объект 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 из основного тоже!
Ура,
Я попытался с простым примером на моем конце (я использую предыдущий пример мой), но я не могу воспроизвести проблему.
Функция MATLAB, которую мы упаковываем, заключается в следующем:
function c = MyAdd(a,b)
c = a + b;
end
Скомпилирован в общую библиотеку C ++ с использованием mcc
компилятор:
>> 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