Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法确定从SWIG(非ctypes)C传递到python例程的正确参数_Python_C_Pointers_Swig - Fatal编程技术网

无法确定从SWIG(非ctypes)C传递到python例程的正确参数

无法确定从SWIG(非ctypes)C传递到python例程的正确参数,python,c,pointers,swig,Python,C,Pointers,Swig,我有一个非常简单的C例程,我想通过Python使用SWIG访问它: int routine(char *instring, char *outstring); 输入字符串刚刚传入,这似乎有效。outstring返回是指向C例程中固定数组的指针,我的问题是如何使用python接口将python参数传递给它 当我使用python时,我得到: >>retstring = "foo" >>retval = routine("Hello world", retstring) 这

我有一个非常简单的C例程,我想通过Python使用SWIG访问它:

int routine(char *instring, char *outstring);
输入字符串刚刚传入,这似乎有效。outstring返回是指向C例程中固定数组的指针,我的问题是如何使用python接口将python参数传递给它

当我使用python时,我得到:

>>retstring = "foo"
>>retval = routine("Hello world", retstring)
这显然不起作用,因为当作用域返回到提示级别时,值将丢失。但这一常规并没有失败。问题是,我传入的任何其他参数都会失败,因为它不被视为char*

除了不返回字符串外,该例程似乎还在工作


我不知道该怎么办。我是否必须使用typemaps进行修改以生成第二次返回?有没有一个例子可以说明这一点?

好的,我让它像这样工作。I文件:

%module example
%include cstring.i
%cstring_bounded_output(char *outcs, 1024);  // large magic number...
%{
#include "routine.h"
%}

int routine(char *instring, char *outcs);
然后在Python中调用:

import example
retval, restring = example.routine("Hello World")

可能重复的你需要告诉我们更多关于例行程序的信息,以便回答这个问题:你如何知道分配给outstring的金额有多大?通常情况下,返回值(如中所示)会告诉您如果oustring为null,将其设置为多大,或者大小有一个固定范围,但它也可能取决于instring中的输入,或者任何其他方案都是可能的。@Flexo:我不必分配oustring。它在例程中是静态预分配的是,从线程的角度来看不是很好。我正在考虑cstring。作为SWIG,我似乎对处理C字符串相当谨慎。或者是carrays,我,但是SWIG说不要用它们来烧焦。那是烧焦吗?因为如果它是静态分配的,那么您将无法使用显示的函数参数返回它。您发布的答案看起来是固定的1024字节,因此仍然不清楚。它是例程中的静态固定长度字符串。只返回指向它的指针,其中包含答案。