使用痛饮的指针传递到在“类型错误”的缓冲效果

问题描述 投票:0回答:1

我们有上的数据的缓冲的处理嵌入式系统。该处理是通过中断时的缓冲区填满触发。欲望是测试与模拟输入数据的算法。我们的数据科学小组使用Python和算法是用C开发的,所以我愿意为他们创造一个包装。

问题围绕着指针的缓冲区被传递到算法。

作为一个简单的例子,C函数看起来是这样的:

float FakeCalc( unsigned int *dataBuffer,
                 float *calcSpace,
                 int    arg1,
                 float  arg2,
                 int    arg3,
                 int    arg4,
                 int   *intermediateResults
               );

我创建了一个SWIG接口文件,如下所示:

%module fakeCalc

%include "typemaps.i"
%apply unsigned int * INPUT { unsigned int * dataBuffer };
%apply float * INOUT { float * calcSpace };
%apply int * OUTPUT { int * intermediateResults };

%{
extern float FakeCalc( unsigned int * dataBuffer,
                 float * calcSpace,
                 int     winAvgSz,
                 float   eleMulSign,
                 int     denomWindNum,
                 int     winSz,
                 int   * intermediateResults
               );
%}

extern float FakeCalc( unsigned int * dataBuffer,
                 float * calcSpace,
                 int     winAvgSz,
                 float   eleMulSign,
                 int     denomWindNum,
                 int     winSz,
                 int   * intermediateResults
               );

这将创建接口,所以我想我是好去。

在蟒蛇交给它关闭前一个简单的测试执行看起来是这样的:

#!/usr/bin/python 

from numpy import zeros
from array import array

import sys

import fakeCalc

def printHelp():
    print "testRun.py dataFile"

# Buffer to pass into method for scratch space
scratchBuf = zeros(10)

# Read in data to pass into method
if len(sys.argv) != 2:
    printHelp()
    exit()

dataFile = open(sys.argv[1], "r")

dataArr = array("I")

for dataPoint in dataFile:
    dataArr.append(int(dataPoint[0:-1]))

# Run calculations
fakeCalc.FakeCalc(dataArr, scratchBuf, 10, 10.5, 10, 10)

几件事情要注意。我不能改变函数的参数,因为它是在几个代码库使用旧代码。缺乏缓冲区大小,而显然不够理想,也被处理时的硬件初始化缓冲区是固定的。

通过calcSpace传入的缓冲器由该算法用作暂存空间,所述intermediateResults含有的一些中间步骤的结果在内部,并且设置DataBuffer只是原始数据和不被改变。

目前,我得到类型错误:在方法“FakeCalc”,类型的参数1“无符号整型”

因此,概括地说了一个问题:是否有可能分配在Python这些缓冲区,并通过成C?

先谢谢您的帮助!

python c swig
1个回答
0
投票

我找到了解决办法。

一个简单的手段来从蟒分配一个缓冲区,并传递它是使用由痛饮提供“carrays”。下面是一个例子:

%module processBuffer

%include "stdint.i"
%include "carrays.i"

%array_class(uint32_t, buffer);

%{
    void processBuffer(unsigned int * buffer);
%}

void processBuffer(unsigned int * buffer);

在Python,创建缓冲和传递以如下方式将指针:

#!/usr/bin/python

import processBuffer

buffer = []

for x in range (0, 10):
    buffer.append(x)

print buffer

test = processBuffer.buffer(10);
for x in range (0, 10):
    test[x] = buffer[x]

processBuffer.processBuffer(test.cast())

到目前为止,这种方法没有任何问题。

对于一些背景对于那些有兴趣,看生成的代码原有的问题变得清晰。在一个指针SWIG通过使单个对象被传递的假设。这样做,是创建的临时对象,以避免类型不兼容。这打破了使用数组。还有更复杂的解决方案,也行创建自定义typemaps,但上述方案要简单得多。


推荐问答