当前位置: 首页 > 面试题库 >

SWIG C至Python Int数组

璩珂
2023-03-14
问题内容

我正在尝试使用swig从python使用以下原型访问C函数:

int cosetCoding(int writtenDataIn, int newData, const int memoryCells, int *cellFailure, int failedCell);

Swig创建.so没问题,我可以将其导入python,但是当我尝试使用以下命令进行访问时:

 cosetCoding.cosetCoding(10,11,8,[0,0,0,0,0,0,0,0],0)

我得到以下回溯:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: in method 'cosetCoding', argument 4 of type 'int *'

该指针应该是一个int数组,其大小由memoryCells定义


问题答案:

如果可以,请使用ctypes。更简单。但是,由于您要求输入SWIG,因此需要的是一个描述如何处理int
*的类型图。SWIG不知道可以指向多少个整数。以下摘自SWIG文档中有关多参数typemap的示例:

%typemap(in) (const int memoryCells, int *cellFailure) {
  int i;
  if (!PyList_Check($input)) {
    PyErr_SetString(PyExc_ValueError, "Expecting a list");
    return NULL;
  }
  $1 = PyList_Size($input);
  $2 = (int *) malloc(($1)*sizeof(int));
  for (i = 0; i < $1; i++) {
    PyObject *s = PyList_GetItem($input,i);
    if (!PyInt_Check(s)) {
        free($2);
        PyErr_SetString(PyExc_ValueError, "List items must be integers");
        return NULL;
    }
    $2[i] = PyInt_AsLong(s);
  }
}

%typemap(freearg) (const int memoryCells, int *cellFailure) {
   if ($2) free($2);
}

请注意,使用此定义时,从Python调用时,将省略memoryCells参数并仅传递诸如[1,2,3,4]for
的数组cellFailure。类型图将生成memoryCells参数。

附言:如果您愿意,我可以发布一个完整的示例(适用于Windows)。



 类似资料:
  • 在本文档将演示如何使用 SOFATracer 集成 Zipkin 进行数据上报展示。 假设你已经基于 SOFABoot 构建了一个简单的 Spring Web 工程,那么可以通过如下步骤进行操作: 下面的示例中将分别演示在 SOFABoot/SpringBoot 工程中 以及 非 SOFABoot/SpringBoot 工程中如何使用。 依赖引入 添加 SOFATracer 依赖 工程中添加 SO

  • 问题内容: 所以我想做的是将double转换为有理数。我检查小数点后有多少个数字,例如,我想将数字123.456保存为123456/1000。 但是,对于数字123.456,我得到了一个四舍五入的错误,结果是123455。我想可以用BigDecimal来解决这个问题,但我无法使其正常工作。同样,在计算出有理数之后,我想用参数(int numerator,int denominator)调用另一个构

  • 问题内容: 有人知道我如何将双精度值四舍五入为3个有效数字,例如本网站上的示例 http://www.purplemath.com/modules/rounding2.htm 问题答案:

  • 问题内容: 所以我将double设置为1234,我想将小数点后移至12.34 因此,我将.1乘以1234两次,就像这样 这将打印结果 有没有一种方法,不用简单地将其格式化为两位小数,就可以正确地保存双重存储12.34? 问题答案: 如果使用或,则应使用舍入或期望看到一些舍入错误。如果你无法执行此操作,请使用。 你遇到的问题是0.1不是精确的表示形式,并且通过执行两次计算,你正在使该错误复杂化。 但

  • 我有值,我希望它们至少有两个十进制数字,但我不想修剪其余的数字。 是否有构建方法或更优雅的方法来实现这一点? 我不能使用,因为我希望在存在其他小数时保留它们。

  • 更新时间:2019-07-19 14:19:21 目标 当前模板可以让您学习如何把设备推送的属性转发到阿里云其他数据库里用于进一步分析,这里以RDS for MySQL为例。 说明 把设备环境上报的温湿度数据转发到RDS for MySQL数据库。 创建产品 首先在IoT Studio内创建一个温湿度计。所属分类可以随意填写。 进入产品详情页,在“功能定义”里添加温度和湿度。 完成属性定义后前往设