2010-05-24 1 views
6

파이썬 도구에서 기존의 C++ 코드 인 NvTriStrip을 사용하고 싶습니다.Python에서 ** 매개 변수를 통해 구조체의 할당 된 배열을 반환하는 C++ 함수를 사용하는 방법은 무엇입니까?

SWIG는 간단한 매개 변수를 사용하여 함수를 쉽게 처리하지만 기본 함수 인 GenerateStrips은 훨씬 더 복잡합니다.

primGroups이 실제로 출력 매개 변수이고이를 delete[]으로 정리해야한다는 것을 나타내려면 SWIG 인터페이스 파일에 무엇을 넣어야합니까?

참고
/////////////////////////////////////////////////////////////////////////// 
// GenerateStrips() 
// 
// in_indices: input index list, the indices you would use to render 
// in_numIndices: number of entries in in_indices 
// primGroups: array of optimized/stripified PrimitiveGroups 
// numGroups: number of groups returned 
// 
// Be sure to call delete[] on the returned primGroups to avoid leaking mem 
// 
bool GenerateStrips(const unsigned short* in_indices, 
        const unsigned int in_numIndices, 
        PrimitiveGroup**  primGroups, 
        unsigned short*  numGroups, 
        bool     validateEnabled = false); 

, 여기에 PrimitiveGroup 선언입니다 :

enum PrimType 
{ 
    PT_LIST, 
    PT_STRIP, 
    PT_FAN 
}; 

struct PrimitiveGroup 
{ 
    PrimType type; 
    unsigned int numIndices; 
    unsigned short* indices; 

    PrimitiveGroup() : type(PT_STRIP), numIndices(0), indices(NULL) {} 
    ~PrimitiveGroup() 
    { 
     if(indices) 
      delete[] indices; 
     indices = NULL; 
    } 
}; 
+0

SWIG 기반 솔루션이 아직 제공되지 않으면 언어 바인딩을 만드는 대신 Boost Python을 사용하는 것이 좋습니다. http://www.boost.org/doc/libs/1_43_0/libs/python/ doc/index.html – Rakis

답변

1

나는 꿀꺽 꿀꺽 함께 할 방법을 알고하지 않습니다,하지만 당신은 Pyrex 또는 같은 더 현대적인 바인딩 시스템으로 이동하는 것을 고려할 수 있습니다 Cython.

예를 들어, Pyrex는 이와 같은 경우에 C++ 삭제에 대한 액세스 권한을 제공합니다.

델 문을 할당 해제하기 위해 C의 ++ 구조체 에 대한 포인터에 적용 할 수

폐기 : 여기에 문서에서 발췌 한 것입니다. 이것은 C++의 delete와 동일합니다.

cdef Shrubbery *big_sh 
big_sh = new Shrubbery(42.0) 
display_in_garden_show(big_sh) 
del big_sh 

http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/Doc/Manual/using_with_c++.html

2

당신은 그들의 "cpointer.i"와 "carray.i"라이브러리에 대한 꿀꺽 꿀꺽의 문서 봤어? 그들은 here입니다. 랩핑 된 코드를 수반하기 위해 자신 만의 유틸리티 라이브러리를 만들려는 경우가 아니라면 어떻게해야할까요? 다음은 파이썬에서 포인터를 다루는 링크입니다 (SWIG).

입력 대 출력을 인식하도록하는 것에 관한 질문. 문서에 here이라는 또 다른 섹션이 있는데, 정확히 설명되어 있습니다. * .i 파일에 OUTPUT을 만들 수 있습니다. 그래서 경우에 당신은 쓸 것 : 당신에게 부울 및 튜플로 PrimitiveGroup* 배열을 모두 반환하는 기능을 제공합니다

%inline{ 
extern bool GenerateStrips(const unsigned short* in_dices, 
          const unsigned short* in_numIndices, 
          PrimitiveGroup** OUTPUT, 
          unsigned short* numGroups, 
          bool validated); 
%} 

합니다.

도움이 되었습니까?

2

실제로 사람들이 SWIG와 같은 혼란스러운 래퍼 (wrapper)에 신경 쓰는 이유를 모르겠다.

외부 배열의 요소 당 한 번만 Py_BuildValue을 사용하면 행당 하나의 튜플을 생성합니다. 해당 튜플을 C 배열에 저장하십시오. 그런 다음 PyList_NewPyList_SetSlice을 호출하여 튜플 목록을 생성하고 C 함수에서 목록 포인터를 반환합니다.

+2

SWIG는 많은 수의 API 함수가 랩핑 될 때 유용합니다. 대부분의 경우 단순한 유형 (int, float 등) 만 사용하거나 상당히 일관된 방식으로 구조를 사용합니다. 그러나 소수의 API 함수로, 필자는 필요한 SWIG typemap 작성의 어려움이 Python 바인딩을 직접 작성하는 비용을 능가한다는 데 동의합니다. – jchl