2015-01-20 2 views
0

Simulink에서 C 함수에 구조체를 제공하려고합니다. 내 단계까지가 : Simulink에서 배열과 함께 사용자 정의 C 코드 함수에 구조를주는 방법은 무엇입니까?

  • 구성에서 .h & .c는 사용자 지정 코드를 매개 변수 포함되어 있습니다.

    내 MATLAB 함수에서 이제
    typedef struct mystruct 
    { int m; 
    int *i; 
    double *x;}mystruct 
    
  • 시뮬링크에서 : 나는이 코드를 실행하면

    function y = fcn(u)%#codegen 
    m=int32(1); 
    i=zeros(10,1,'int32'); 
    x=zeros(10,1); 
    s.m=m; 
    s.i=i; 
    s.x=x; 
    coder.cstructname(s,'mystruct','extern'); 
    D=int32(0); 
    D=coder.ceval('accesmystruct',coder.ref(s)); 
    y=10; 
    

내가 있음을 나타냅니다 코드 생성에서 긴 오류가 내 헤더는 구조 defind있다 그것은 C 코드로 컴파일 될 수 없습니다. 오류 : 나는 두 변수 i 및 포인터로 x를 선언하는 경우

c2_Test2.c 
    c2_Test2.c(57) : error C2143: syntax error : missing ')' before '*' 
    c2_Test2.c(57) : error C2081: 'cs_size' : name in formal parameter list illegal 
    c2_Test2.c(57) : error C2143: syntax error : missing '{' before '*' 
    c2_Test2.c(57) : error C2059: syntax error : ')' 
    c2_Test2.c(60) : error C2143: syntax error : missing ')' before '*' 
    .... 

에만이 발생합니다. 머리글에서 스칼라로 선언하고 MATLAB 함수를 사용하면 작동합니다. 누구든지 내가 뭘 잘못하고 있는지 알아?

답변

1

코드가 내가 추가 컴파일 코드를 얻으려면

를 컴파일하는 방법 :

#include "mystruct.h" 

을 시뮬레이션 Target-> 사용자 정의 코드 -> 헤더 파일 섹션에서. 해당 창에 필수 포함 경로를 추가하는 것도 필요할 수 있습니다.

호환성 위를 수행 한 후

관심사, 코드 충돌 실행할 때. 문제는 mystruct의 정의가 MATLAB Coder에서 기대하는 바가 아니라는 것입니다. 당신은 코드에서 볼 수

typedef struct { 
    int32_T m; 
    int32_T i[10]; 
    real_T x[10]; 
} mystruct; 

:

당신이 그것의 내부에 고정 된 크기의 배열과 MATLAB 구조를 정의

는 MATLAB 코더에 의해 생성 된 유형은 같은 C 구조체의 내부 정적 배열을 사용하여 coder.cstructname 호출에서 'extern'을 제거하면 slprj 디렉토리가됩니다.

인라인 배열이있는 구조체에는 이미 C 컴파일러에서 배열에 할당 된 메모리가 있습니다. 그러나 필드가 포인터 인 경우 누군가가 데이터 공간을 할당해야합니다. 여기서는 수행되지 않았습니다.

  • 'extern'를 생략하고 MATLAB Coder를/시뮬링크는
  • ix
  • 에 대한 배열이 아니라 포인터와 외부 구조를 선언 타입 정의를 생성 할 수 있습니다 :

    나는 몇 가지 옵션 참조 쓰기 또는 구조체에서 읽기 전에 필드에 대한 메모리를 할당하는 다른 C 함수에 전달하십시오 :

    function y = fcn(u) 
    %#codegen 
    m=int32(1); 
    i=zeros(10,1,'int32'); 
    x=zeros(10,1); 
    s = coder.nullcopy(struct('m',m,'i',i,'x',x)); 
    coder.cstructname(s,'mystruct'); 
    coder.ceval('initmystruct',coder.wref(s),int32(numel(i)),int32(numel(x))); 
    s.m=m; 
    s.i=i; 
    s.x=x; 
    

    그리고 C에서: 나는 그것을 알고있는 것처럼

    /* Example of initmystruct with no error checking */ 
    /* int is the size type assuming it matches int32 */ 
    /* in the MATLAB coder.ceval call     */ 
    void initmystruct (mystruct *s, int szi, int szx) 
    { 
        s->i = malloc(szi*sizeof(*s->i)); 
        s->x = malloc(szx*sizeof(*s->x)); 
    } 
    
0

cstructname에 대한 문서에 따르면 헤더 파일은 'Headerfile' 입력 인수를 사용하여 지정해야합니다.

+0

, 하나는 그것이 '정의 코드'섹션에 포함되어 있지 않은 경우 'HeaderFile'에 그것을 deklare 할 필요가있다. 그러나 나는 그것을 시도했다. 그리고 그것은 여전히 ​​효과가 없다. – hans

관련 문제