Swig Ruby "TypeError: Expected argument 0 of type int *, but got Fixnum 0"
Swig Ruby "TypeError: Expected argument 0 of type int *, but got Fixnum 0"
我已经有一段时间没有使用 Swig 了,所以这可能是一些愚蠢的错误。
我使用 swig 创建了一组函数的接口,但有些地方不对。例如,当我尝试在 c 中调用一个预期为 (int *) 的函数时,出现上述错误。关于我做错了什么有什么想法吗?
我运行 使用 swig 2.0.11-1ubuntu2
swig -ruby -module itkDB itkDB.i
我的界面文件是
%module itkDB
%{
#include "itkDB.h"
%}
// with an included copy of the itkDB.h file
header 包含以下声明:
CDS_EXTERN_C String
dbiInit(int *pArgc,
char *pArgv[]);
当我从 irb session:
尝试此操作时出现上述错误
ItkDB.dbInit 0, "blah"
生成的包装函数如下所示:
SWIGINTERN VALUE
_wrap_dbiInit(int argc, VALUE *argv, VALUE self) {
int *arg1 = (int *) 0 ;
char **arg2 ;
void *argp1 = 0 ;
int res1 = 0 ;
void *argp2 = 0 ;
int res2 = 0 ;
String result;
VALUE vresult = Qnil;
if ((argc < 2) || (argc > 2)) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_int, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "int *","dbiInit", 1, argv[0] ));
}
arg1 = (int *)(argp1);
res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_p_char, 0 | 0 );
if (!SWIG_IsOK(res2)) {
SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char *[]","dbiInit", 2, argv[1] ));
}
arg2 = (char **)(argp2);
result = (String)dbiInit(arg1,arg2);
vresult = SWIG_FromCharPtr((const char *)result);
return vresult;
fail:
return Qnil;
}
不出所料,这是一个简单的问题。添加到接口文件中的以下内容解决了该问题。事实证明,这是库实际上确实需要对整数的引用的少数情况之一。
*INPUT 告诉 swig 允许将普通整数传递给函数,然后它创建对传递的整数的引用并将其发送给函数。
CDS_EXTERN_C String
dbiInit(int *INPUT,
char *pArgv[]);
我已经有一段时间没有使用 Swig 了,所以这可能是一些愚蠢的错误。
我使用 swig 创建了一组函数的接口,但有些地方不对。例如,当我尝试在 c 中调用一个预期为 (int *) 的函数时,出现上述错误。关于我做错了什么有什么想法吗?
我运行 使用 swig 2.0.11-1ubuntu2
swig -ruby -module itkDB itkDB.i
我的界面文件是
%module itkDB
%{
#include "itkDB.h"
%}
// with an included copy of the itkDB.h file
header 包含以下声明:
CDS_EXTERN_C String
dbiInit(int *pArgc,
char *pArgv[]);
当我从 irb session:
尝试此操作时出现上述错误ItkDB.dbInit 0, "blah"
生成的包装函数如下所示:
SWIGINTERN VALUE
_wrap_dbiInit(int argc, VALUE *argv, VALUE self) {
int *arg1 = (int *) 0 ;
char **arg2 ;
void *argp1 = 0 ;
int res1 = 0 ;
void *argp2 = 0 ;
int res2 = 0 ;
String result;
VALUE vresult = Qnil;
if ((argc < 2) || (argc > 2)) {
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
}
res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_int, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "int *","dbiInit", 1, argv[0] ));
}
arg1 = (int *)(argp1);
res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_p_char, 0 | 0 );
if (!SWIG_IsOK(res2)) {
SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char *[]","dbiInit", 2, argv[1] ));
}
arg2 = (char **)(argp2);
result = (String)dbiInit(arg1,arg2);
vresult = SWIG_FromCharPtr((const char *)result);
return vresult;
fail:
return Qnil;
}
不出所料,这是一个简单的问题。添加到接口文件中的以下内容解决了该问题。事实证明,这是库实际上确实需要对整数的引用的少数情况之一。 *INPUT 告诉 swig 允许将普通整数传递给函数,然后它创建对传递的整数的引用并将其发送给函数。
CDS_EXTERN_C String
dbiInit(int *INPUT,
char *pArgv[]);