How to return array from imported C++ code in C function block in Simulink?

6 次查看(过去 30 天)
Hello everyone!
I am trying to import C++ code in Simulink through the C function block, for my purposes the block has 6 inputs type double, and 7 outputs type array of 9 doubles. I have been trying to run some dummy code in order to grasp how to use this block but I have been stuck for some time when trying to return an array from a C++ function and assigning it to the output array variable.
Here is the header file for the dummy class.
#pragma once
#include <vector>
#include <deque>
#include <array>
#include <cmath>
#include "mex.h"
class dummy{
double x, y, psi, v, beta, dpsi;
public:
dummy(){}
dummy(double x, double y, double psi, double v, double beta, double dpsi);
double getX(){return x;}
double getY(){return y;}
double getPsi(){return psi;}
double getV(){return v;}
double getBeta(){return beta;}
double getDPsi(){return dpsi;}
};
extern void createDrift(double x, double y, double psi, double v, double beta, double dpsi);
extern void deleteDrift();
extern mxArray* DriftOutput(double x, double y, double psi, double v, double beta, double dpsi)
And here is the source file.
#include <vector>
#include <deque>
#include <array>
#include "mex.h"
#include "dummy.h"
dummy* var;
dummy::dummy(double x, double y, double psi, double v, double beta, double dpsi){
this->x = x;
this->y = y;
this->psi = psi;
this->v = v;
this->beta = beta;
this->dpsi = dpsi;
}
extern void createDrift(double x, double y, double psi, double v, double beta, double dpsi){
var = new dummy(x,y,psi,v, beta, dpsi);
}
extern void deleteDrift(){
delete var;
}
extern mxArray* DriftOutput(double x, double y, double psi, double v, double beta, double dpsi){
std::vector<double>vals(x,9);
mxArray* temp = mxCreateNumericMatrix( 1, 9, mxSINGLE_CLASS, mxREAL );
//memcpy( mxGetData(temp[0]), &vals[0], 9*sizeof(double) );
/*temp.push_back(std::vector<double>(var->getX(),9));
temp.push_back(std::vector<double>(var->getY(),9));
temp.push_back(std::vector<double>(var->getPsi(),9));
temp.push_back(std::vector<double>(var->getV(),9));
temp.push_back(std::vector<double>(var->getBeta(),9));
temp.push_back(std::vector<double>(var->getDPsi(),9));
temp.push_back(std::vector<double>(var->getX(),9));*/
return temp;
}
And this is the code from Output section of C function block
mxArray* temp = DriftOutput(x, y, psi, v, beta, dpsi);
xVec = temp;
Error that I get with this is
In line 3:error: 513, a value of type "mxArray *" cannot be assigned to an entity of type "real_T *"
| xVec = temp;
| ^
Has anyone encountered this problem before? Any tips on how to solve this?
I have tried to assign temp[0] to xVec, but that too ends in failure.

回答(1 个)

Mark McBroom
Mark McBroom 2023-3-16
Why is your C++ code deailing with mxarray? The whole point of the C Function block is that behind the scenes it will generate wrapper code around your C++ code to handle transfer of data between Simulink and the C++ code ( which will likely involve using mxarray). I would recommend modifying your C++ code to remove the include of mxarray and rewrite your DriftOutput function.
Also, this link has tips for using the C Function block with C++ code.https://www.mathworks.com/help/simulink/ug/interface-with-c-classes-using-c-function-block.html

类别

Help CenterFile Exchange 中查找有关 Naming Conventions 的更多信息

产品


版本

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by