python中为什么不支持char_python-swig char **作为指向char的指针*

我在使用swig和char **作为指向变量char *的指针时遇到麻烦(不是作为char *的列表!!!).我找不到一种将指针包装到char *的方法.

目的是将级联的结果写入指针所引用的char *中.

以下是我的代码:

文件pointers.cpp:

#include "pointers.h"

#include

#include

#include

void conc(char *str1, char *str2, char **res){

char *aux = (char *)malloc(strlen(str1)+strlen(str2)+1);

strcpy(aux,str1);

strcat(aux,str2);

strcpy(*res,aux);

free(aux);

}

文件指针

void conc(char *str1, char *str2, char **res)

文件指针

%module pointers

%{

#define SWIG_FILE_WITH_INIT

#include "pointers.h"

%}

%include "typemaps.i"

%include "cpointer.i"

%include "cstring.i"

%pointer_functions(char *, charp);

extern void conc(char *str1, char *str2, char **res);

文件setup.py:

from distutils.core import setup, Extension

pointers_module = Extension('_pointers',

sources=['pointers_wrap.cxx', 'pointers.cpp'],

)

setup (name = 'pointers',

version = '0.1',

author = "SWIG Docs",

description = """Simple swig example from docs""",

ext_modules = [pointers_module],

py_modules = ["pointers"],

)

最后,python main:

import pointers

result = new_charp()

pointers.conc("Hello ","World!", result);

print(result)

delete_charp(result)

它们都是使用终端命令编译的:

swig -c++ -python pointers.i

python setup.py build_ext --inplace

但是编译器返回错误:

pointers_wrap.cxx: In function ‘char** copy_charp(char*)’:

pointers_wrap.cxx:3124:58: error: invalid static_cast from type ‘char*’ to

type ‘const char*&’ return (new char *(static_cast< const char *& >(value)));

^

error: command 'gcc' failed with exit status 1

有帮助吗?

[问题更新]

如@MarkTolonen所建议,我尝试通过以下方式更改pointers.i文件:

新文件指针:

%module pointers

%{

#include "pointers.h"

%}

// This input typemap declares that char** requires no input parameter.

// Instead, the address of a local char* is used to call the function.

%typemap(in,numinputs=0) char** (char* tmp) %{

$1 = &tmp;

%}

// After the function is called, the char** parameter contains a malloc'ed char* pointer.

// Construct a Python Unicode object (I'm using Python 3) and append it to

// any existing return value for the wrapper.

%typemap(argout) char** %{

PyObject *obj = PyUnicode_FromString(*$1);

$result = SWIG_Python_AppendOutput($result,obj);

%}

// The malloc'ed pointer is no longer needed, so make sure it is freed.

%typemap(freearg) char** %{

free(*$1);

%}

// Now that the typemap exists, let swig wrap the header.

%include "pointers.h"

编译:

swig -c++ -python pointers.i

g++ --std=c++11 -fPIC -c pointers.cpp

g++ --std=c++11 -fPIC -c pointers_wrap.cxx -I/usr/local/include/python3.6m

然后我得到了错误:

In function ‘PyObject* _wrap_conc(PyObject*, PyObject*):`

pointers_wrap.cxx:3618:1: error: jump to label ‘fail’ [-fpermissive]

fail:

pointers_wrap.cxx:1222:49: note: from here

#define SWIG_fail goto fail

pointers_wrap.cxx:2999:68: note: in expansion of macro ‘SWIG_fail’

#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0)

pointers_wrap.cxx:3603:5: note: in expansion of macro ‘SWIG_exception_fail’

SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "conc" "', argument " "2"" of type '" "char *""'");

pointers_wrap.cxx:3609:8: note: crosses initialization of ‘_object* obj’

auto obj = PyUnicode_FromString(*arg3);

pointers_wrap.cxx:3618:1: error: jump to label ‘fail’ [-fpermissive]

fail:

pointers_wrap.cxx:1222:49: note: from here

#define SWIG_fail goto fail

pointers_wrap.cxx:2999:68: note: in expansion of macro ‘SWIG_fail’

#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0)

pointers_wrap.cxx:3598:5: note: in expansion of macro ‘SWIG_exception_fail’

SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "conc" "', argument " "1"" of type '" "char *""'");

pointers_wrap.cxx:3609:8: note: crosses initialization of ‘_object* obj’

auto obj = PyUnicode_FromString(*arg3);

pointers_wrap.cxx:3618:1: error: jump to label ‘fail’ [-fpermissive]

fail:

pointers_wrap.cxx:1222:49: note: from here

#define SWIG_fail goto fail

pointers_wrap.cxx:3595:62: note: in expansion of macro ‘SWIG_fail’

if (!PyArg_ParseTuple(args,(char *)"OO:conc",&obj0,&obj1)) SWIG_fail;

pointers_wrap.cxx:3609:8: note: crosses initialization of ‘_object* obj’

auto obj = PyUnicode_FromString(*arg3);

它可以在此Windows操作系统上运行,但不能在我的Ubuntu上运行.谁能告诉我如何处理它.我真的不知道如何解决我的指针问题.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值