通过引用 coder.ceval 在结构中传递数组
Posted
技术标签:
【中文标题】通过引用 coder.ceval 在结构中传递数组【英文标题】:Passing array in struct by reference to 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));
有什么解决方法的想法吗?
【问题讨论】:
【参考方案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);
但是,它假设结构的名称在代码生成过程中没有改变。
【讨论】:
以上是关于通过引用 coder.ceval 在结构中传递数组的主要内容,如果未能解决你的问题,请参考以下文章
数据类型与 arduino 和 coder.ceval 不匹配