通过引用coder.ceval在struct中传递数组

时间:2014-12-18 09:09:11

标签: matlab matlab-coder

我有一个包含非常大的数组的结构。我使用MATLAB编码器生成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));  

有关解决方法的任何想法吗?

2 个答案:

答案 0 :(得分: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命令

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

答案 1 :(得分:0)

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

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

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