coder.ceval结构需要指针

时间:2016-12-07 00:11:02

标签: c++ matlab code-generation mex

我在Matlab中使用一些外部C ++代码,通过 coder.ceval 调用它:

coder.ceval('myCppFuncName', coder.wref(mySruct))

只要myStruct是简单

,这就完美无缺
myStruct.a = 0;
myStruct.b = 1;

现在我有一个在C ++头文件struct.h中定义的结构:

typedef struct                      
{
  double              x;            
  double              y;            
} myPoint;

typedef struct                      
{
  int                 num_points; 
  myPoint            *points;       // pointer to array of myPoint-structs
} myStruct;

我不知道如何在Matlab中表示C ++结构的指针。因为我需要在Matlab中定义结构,我正在尝试这样的事情:

coder.cstructname(matlab_myPoint,'myPoint','extern');
coder.cstructname(matlab_myStruct,'myStruct','extern');

matlab_myPoint= struct('x',0,'y',0);
matlab_myStruct = struct('num_points',2,'points',myPoint);

以错误消息结尾

  

错误C2440:'=':无法从'myPoint'转换为'myPoint *'

在原始C ++结构中,使用指向结构数组的指针。如何在Matlab出生的结构中重现这种关系?谢谢!

1 个答案:

答案 0 :(得分:0)

我最终可以通过不将对象或指针传递给Matlab到C的对象来解决问题,而是交换结构。我的结构中的结构包含了在c中初始化所需类的新对象所需的所有数据。

为了实现这一目标,需要在Matlab和C中使用相同的结构体系结构。

然后用

coder.cstructname(matlab_struct_name,'c_struct_name','extern');

告诉编译器哪个C结构由哪个Matlab结构定义。必须在Simulink属性中指定C-Header文件。

Matlab中C代码的调用最终看起来像这样:

coder.ceval('gateway', 1, coder.ref(matlab_struct_name), ,coder.wref(matlab_myRet));

其中matlab_myRet的创建方式与matlab_struct_name相同,并表示返回值struct。之后在C-Code中写入的所有值都可以在Matlab中获得:

matlab_myRet.x(1:5);
matlab_myRet.y(1:5);

最后使用结构的一个例子:

在Matlab中:

matlab_struct_name.x = 123;
matlab_struct_name.y = 456;

matlab_myRet.x = zeros(10,1);
matlab_myRet.y = zeros(10,1);

在C-Code(标题)中:

typedef struct
{
    double                  x[5];
    double                  y[5];
}matlab_struct_name;

    typedef struct
{
    double                  x[10];
    double                  y[10];
}myReturn;

希望这有帮助