【发布时间】:2016-03-04 21:40:09
【问题描述】:
这(我希望)是一个非常简单的问题,但尽管做了一些阅读(我是 SWIG 的新手,并且相当绿色 C-wise)我只是无法在我的头。
我有一个库中的函数(遗留代码,不想编辑):
extern int myfunction(char *infile, char *maskfile, int check, float *median, char *msg)
我的目标是使用 SWIG 在 Python 中为此创建一个包装器。
median 和 msg 变量的值由 C 函数更改。当返回int != 0 时,msg arg 中会出现一些错误信息。如果返回int == 0,则median 变量将包含一个浮点数,其值是从myfunction 分配的。
这通常运行良好,返回值为 0。我使用 %array_functions 和 %pointer_functions 创建需要传递的指针,根据这个 .i 文件:
%module test
%include "cpointer.i"
%include "carrays.i"
%{
#include <stdint.h>
%}
extern int myfunction(char *infile, char *maskfile, int check, float *median, char *msg)
%pointer_functions(float, floatp);
%pointer_functions(char, charp);
%array_functions(char, charArray);
在swig-ing、编译和链接之后,我可以调用python中的函数了:
import test
errmsg_buffer = 1024
_infile = 'test2.dat'
infile = imstat.new_charArray(len(_infile))
for i in xrange(len(_infile)):
imstat.charArray_setitem(infile,i,_infile[i])
maskfile = imstat.new_charArray(1)
imstat.charArray_setitem(maskfile,0,'')
check = 0
med = imstat.new_floatp()
errmsg = imstat.new_charArray(errmsg_buffer)
out = test.myfunction(infile,maskfile,check,med,errmsg)
median = test.floatp_value(med)
这有时有效,但通常无效 - 我得到了很多段错误,这些错误通常通过更改 errmsg_buffer 长度来修复(显然不是一个有用的修复!)。更改msg 字符串的C 代码是:
(void)sprintf(errmsg,"file not found");
我的主要问题是正确处理msg 字符串,我怀疑这会导致段错误(并且可能是由于通过new_charArray 执行不正确?)。
最好的方法是什么?
我可以在.i 中添加一些东西,将char *msg 转换为python str吗?
这可以在不使用new_CharArray“预初始化”的情况下完成吗?如果errmsg_buffer 太小,我可能会遇到缓冲区溢出。
我希望这很清楚 - 很高兴添加 cmets 以供进一步讨论。
【问题讨论】: