2014-10-14 2 views
0

파이썬 클래스가 포함 된 C 확장을 작성하려고합니다.동적 크기의 Python C- 확장 클래스

이 클래스는 생성자의 매개 변수 fname으로 파일 이름을 가져온 다음 해당 파일을 메모리로로드하고 구성으로 저장합니다. 내가 무엇을 아래

:

typedef struct { 
    PyObject_HEAD 
    XmlConfig m_cfg; 
} PyAgent; 

static int PyAgent_init(PyAgent *self, PyObject *args) { 
    const char *fname; 
    if (!PyArg_ParseTuple(args, "s", &fname)) { 
    return NULL; 
    } 
    self->m_cfg.Load(fname); 
    return 0; 
} 

static PyTypeObject PyAgentType = { 
    PyObject_HEAD_INIT(NULL) 
    0,           /* ob_size */ 
    "classify.Agent",        /* tp_name */ 
    ... 
} 
... 

내가 파일을로드 할 때 나는 세그먼트 오류를 ​​얻을. PyAgent struct은 파일의 메모리 할당으로 인해 개체 크기가 커지기 때문에 이런 현상이 발생합니다.

PyObject_VAR_HEAD 매크로를 사용해 보았지만 도움이되지 않습니다.

실마리를 주거나 유사한 예제가 있습니까?

답변

1

을 먼저 초기화해야합니까? C++ 메소드를 호출했지만 생성자를 먼저 호출하지 않았습니다. 구조체는 C++이 아닌 C 코드에 의해 할당되므로이 필드를 구성해야한다는 것을 모릅니다.

가 수동으로 (new(&self->m_cfg) XmlConfig() 같은 내 기억이 맞다 경우) 생성자를 호출하는 방법이 있지만 가장 쉬운 대신 필드 XmlConfig *cfg이 있고, 할당하고 아마 무료로 그것을 C++ 사업자 new을의 일반적인 구문을 사용하여 필요에 따라 delete (후자는 tp_dealloc에 넣습니다).

+0

고맙습니다. 가장 쉬운 방법은'new' /'delete'로 선택했습니다. – San4ez