2016-07-22 6 views
0

SWIG를 사용하여 파이썬에서 C 라이브러리를 사용하려고합니다. 이 C 라이브러리는 함수 결과를 모든 인수를 통해 전달합니다. 온라인 SWIG 매뉴얼을 사용하여, 나는 파이썬에 전달 된 정수 함수 결과를 얻는 데 성공했지만 문자 문자열에 대해이 작업을 수행하는 방법을 파악하는 데 어려움을 겪고 있습니다. SWIG typemap C char *에서 파이썬 문자열

extern int mystr(int inp, char *outstr); 

그래서 기본적으로 내 질문이 어떤 타입 맵입니다 :

myfunc.c :

#include <myfunc.h> 

#include <stdio.h> 


int mystr(int inp, char *outstr){ 
    outstr="aaa"; 
    printf("%s\n", outstr); 
    return(0); 
} 

myfunc.h

내 코드의 본질이다 for * outstr는 다음과 같아야합니다.

미리 감사드립니다.

+2

당신은 정말'outstr에 = "AAA"를 찾으시는 것입니까? 나는 당신이'strcpy (outstr, "aaa");를 의미했다고 의심한다. –

+0

나는 그랬다고 생각한다. –

+0

특히'outstr = "aaa";'는 호출자가 전달하는 문자열을 변경하지 않습니다.'outstr' 매개 변수는 함수의 지역 변수로 취급되므로'outstr = "aaa"; 로컬'outstr'는 4 개의 문자'{ 'a', 'a', 'a'의 명명되지 않은, 초기화 된 배열을 가리 킵니다. '\ 0'}'. –

답변

1

SWIG 설명서 9.3.4 String handling: cstring.i을 살펴보십시오. 이것은 char * 인수와 함께 사용할 몇 가지 typemap을 제공합니다.

아마 예를 들어, 당신이 꿀꺽 꿀꺽 인터페이스 파일에서 원하는 함수 선언하기 전에 (위의 댓글에서 언급 한대로 참으로 strcpy(outstr, "aaa")를 사용하는 가정) :

%include <cstring.i> 
%cstring_bounded_output(char* outstr, 1024); 
+0

제안 해 주셔서 감사합니다. 나는 이미 매뉴얼을 보면서 꽤 오랜 시간을 보냈지 만, 나는 C 코더가 아니기 때문에 매뉴얼을 읽기가 어렵고 일반화하기가 쉽지 않은 예제를 발견한다. –

0

내가 일을하는 데있어 방법이있다, SWIG 2.0 manual의 섹션 34.9.3의 예제를 수정하여 :,`

%typemap(in, numinputs=0) char *outstr (char temp) { 
    $1 = &temp; 
} 
%typemap(argout) char *outstr { 

    PyObject *o, *o2, *o3; 
    o = PyString_FromString($1); 
    if ((!$result) || ($result == Py_None)) { 
     $result = o; 
    } else { 
     if (!PyTuple_Check($result)) { 
      PyObject *o2 = $result; 
      $result = PyTuple_New(1); 
      PyTuple_SetItem($result,0,o2); 
     } 
     o3 = PyTuple_New(1); 
     PyTuple_SetItem(o3,0,o); 
     o2 = $result; 
     $result = PySequence_Concat(o2,o3); 
     Py_DECREF(o2); 
     Py_DECREF(o3); 
    } 
} 
+0

'temp'는 단지 하나의'char' 일 뿐이므로'outstr'이 1'char'보다 길면이 코드는 어떤 시점에서 segfault가됩니다. 그렇지 않으면 코드는 기본적으로'% cstring_bounded_output'의 단순화 된 버전입니다. – m7thon