2017-02-12 7 views
1

구조에서 유연한 배열을 사용하고 있습니다. 그래서 나는 그 구조체에 할당 된 메모리를 내 자신의 코드 중 일부로 변경하려고합니다. 기본적으로 new_structname() 및 structname_variable_set() 함수를 변경하려고합니다. 여기 C 구조의 메모리 할당을 위해 SWIG에서 생성 한 기본 코드를 변경하는 방법은 무엇입니까?

typedef struct vector{ 
    int x; 
    char y; 
    int arr[0]; 
} vector; 

는 SWIG는 원샷 특별하게 구조의 이러한 유형을 처리하지 않을 것이다 calloc(1,sizeof(struct vector)) 호출하여 메모리를 할당하는 함수를 생성 new_vector(). 그래서 우리는 유연한 배열을위한 메모리를 할당하기 위해 생성 된 swig 생성 된 new_vector()를 수정해야합니다. 이것을 처리 할 수있는 방법이 있습니까?

+0

어떻게 변경해야하는지 자세히 설명해 주실 수 있습니까? 동일한 의미론을 가진 대체 이름 지정 함수로 전환하는 것은 매우 쉽지만, 좀 더 복잡한 작업을 원한다면 더 깊은 변경을해야합니다. – Flexo

+0

new_structname() 함수에서 메모리는 다음과 같이 할당됩니다. var = calloc (1, sizeof (struct name)). 이것은 유연한 배열을 떠나는 구조체의 크기를 고려할 것입니다. 그래서 내가하고 싶은 var = calloc (1, sizeof (struct name) + size_of_flexi_arr); 여기서 size_of_flexi_arr은 사용자가 지정합니다. –

+0

함수의 이름을 변경하고 싶지 않습니다. 함수 내부의 코드를 변경하고 싶습니다. –

답변

0

이렇게 할 수있는 방법이 몇 가지 있습니다. 그래도 찾고있는 것은 %extend입니다. 이를 통해 새로운 생성자를 정의하고 적절하게 구현할 수 있습니다. (이것은 C 컴파일러로도 작동합니다, 그들은 타겟 언어의 관점에서 생성자 일뿐입니다). 사용

당신의 vector 출발점으로 우리가 이것을 설명 할 수 있습니다 : 당신이 바라던대로이 꿀꺽 꿀꺽와

%module test 

%include <stdint.i> 

%inline %{ 
typedef struct vector{ int x; char y; int arr[0]; }vector; 
%} 

%extend vector { 
    vector(const size_t len) { 
     vector *v = calloc(1, sizeof *v + len); 
     v->x = len; 
     return v; 
    } 
} 

생성 된 모듈 코드에서 new_vector 기능을 synthesises.

구조체의 길이를 멤버 중 하나로 기록하려고한다고 가정했습니다. 그렇지 않은 경우 내가 지정한 과제를 삭제할 수 있습니다.

+0

감사합니다. 그것은 많은 도움이되었습니다. –