【问题标题】:coder.ceval struct requires pointercoder.ceval 结构需要指针
【发布时间】:2017-04-21 19:01:11
【问题描述】:

我通过 coder.ceval 调用 Matlab 中的一些外部 C++ 代码:

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++ struct 的指针。由于我需要在 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 生成的 struct 中重现这种关系?谢谢!

【问题讨论】:

    标签: c++ matlab code-generation mex


    【解决方案1】:

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

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

    然后用

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

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

    Matlab中C代码的调用最终是这样的:

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

    其中 matlab_myRet 的创建方式与 matlab_struct_name 相同,表示返回值结构。所有在 C 代码中写入的值都可以稍后在 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 代码中(标题):

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多