【问题标题】:Passing array in struct by reference to coder.ceval通过引用 coder.ceval 在结构中传递数组
【发布时间】:2014-12-18 09:09:11
【问题描述】:

我有一个结构体,里面有非常大的数组。我使用 MATLAB coder 生成 C 代码。
在我生成的代码中,我希望调用一些 C 函数并通过引用传递其中一个数组。

例如:

coder.ceval('Foo',coder.ref(MyStruct.VeryLargeArray));

MATLAB 编码器不允许这样做,我得到错误:

coder.ref 只能应用于 V 或 V(E) 类型的表达式 ...

由于MyStruct.VeryLargeArray 非常大,顾名思义,我希望避免将其复制到临时变量的简单解决方案:

UnnecessaryTempVar = MyStruct.VeryLargeArray;
coder.ceval('Foo',coder.ref(UnnecessaryTempVar));  

有什么解决方法的想法吗?

【问题讨论】:

    标签: matlab matlab-coder


    【解决方案1】:

    您可以为Foo 编写一个C 包装器,它接受一个指向结构的指针并将底层数据指针MyStruct->VeryLargeArray 转发到Foo

    MATLAB 代码passStruct.m

    function y = passStruct(x)
    %#codegen
    coder.cinclude('Foo.h');
    s.f = x;
    coder.cstructname(s, 'wrapperStruct_T');
    y = 10;
    y = coder.ceval('WrapFoo', coder.ref(s));
    

    头文件Foo.h

    /* Include generated header to get struct definition */
    #include "passStruct.h"
    double WrapFoo(wrapperStruct_T *s); 
    double Foo(double *x);
    

    源文件Foo.c

    #include "Foo.h"
    double WrapFoo(wrapperStruct_T *s)
    {
        return Foo(s->f);
    }
    
    double Foo(double *x)
    {
        return 2.0*x[0];
    }
    

    代码生成命令

    codegen passStruct -args zeros(1000) Foo.c -report
    

    【讨论】:

      【解决方案2】:

      虽然 lilbill39 提出的解决方案可行,但我遇到了另一种方法:

      function y = passStruct(x)
      %#codegen
      s.f = x;
      ps = coder.opaque('double *','&s.f[0]');
      y = 0;
      y = coder.ceval('Foo', ps);
      

      但是,它假设结构的名称在代码生成过程中没有改变。

      【讨论】:

        猜你喜欢
        • 2013-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-12
        • 2011-02-02
        • 1970-01-01
        • 1970-01-01
        • 2012-01-04
        相关资源
        最近更新 更多