【问题标题】:Swig Ruby "TypeError: Expected argument 0 of type int *, but got Fixnum 0"Swig Ruby“TypeError:预期参数 0 类型为 int *,但得到了 Fixnum 0”
【发布时间】:2015-01-24 17:00:37
【问题描述】:

我使用 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

标题包含以下声明:

CDS_EXTERN_C String
dbiInit(int *pArgc,
    char    *pArgv[]);

当我在 irb 会话中尝试此操作时出现上述错误:

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;
}

【问题讨论】:

    标签: c ruby swig


    【解决方案1】:

    不出所料,这是一个简单的问题。以下添加到接口文件中修复了该问题。事实证明,这是库实际上确实想要引用整数的少数情况之一。 *INPUT 告诉 swig 允许将普通整数传递给函数,然后它创建对该传递的整数的引用并将其发送给函数。

    CDS_EXTERN_C String
    dbiInit(int *INPUT,
        char    *pArgv[]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2018-08-14
      • 2022-01-24
      相关资源
      最近更新 更多