2014-12-18 4 views
0

구조체에 매우 큰 배열이 있습니다. MATLAB 코더를 사용하여 C 코드를 생성합니다.
내 생성 된 코드에서 일부 C 함수를 호출하고 배열 중 하나를 참조로 전달하고 싶습니다.구조체의 배열을 coder.ceval을 참조하여 전달합니다.

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

이 MATLAB 코더에 의해 허용되지 않습니다와 나는 오류가 : 이름에서 알 수 있듯이 MyStruct.VeryLargeArray 이후

coder.ref may only be applied to an expression of the type V or V(E) ...

은 매우 큰, 난을 피하고자 예를 들어

임시 변종으로 복사하는 다른 해결책 :

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

해결 방법은 없습니까?

답변

1

Foo에 대한 C 래퍼를 작성하여 구조체에 대한 포인터를 받아 들여 기본 데이터 포인터 을 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 명령 : lilbill39에 의해 제안 된 솔루션이 작동하지만

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

, 나는 다른 접근 방식을 통해 온 그러나

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

, 그것은 구조체의 이름이 아닌 것으로 가정 코드 생성 과정에서 변경되었습니다.

관련 문제