通过c&x2B+;指向python的双指针

通过c&x2B+;指向python的双指针,python,numpy,ctypes,cython,f2py,Python,Numpy,Ctypes,Cython,F2py,我可以将一维数组传递给python,如下所示。 我想知道我是否可以通过使用cType、NoMPy.将C++双指针数组传递给Python。 test.cpp: #include <stdio.h> extern "C" void cfun(const void * indatav, int rowcount, int colcount, void * outdatav); void cfun(const void * indatav, int rowcount, int colcou

我可以将一维数组传递给python,如下所示。 我想知道我是否可以通过使用cType、NoMPy.</P>将C++双指针数组传递给Python。 test.cpp:

#include <stdio.h>
extern "C" void cfun(const void * indatav, int rowcount, int colcount, void * outdatav);

void cfun(const void * indatav, int rowcount, int colcount, void * outdatav) {
    //void cfun(const double * indata, int rowcount, int colcount, double * outdata) {
    const double * indata = (double *) indatav;
    double * outdata = (double *) outdatav;
    int i;
    puts("Here we go!");
    for (i = 0; i < rowcount * colcount; ++i) {
        outdata[i] = indata[i] * 4;
    }
    puts("Done!");
}

有个办法。我没有看到一个很好的方法将numpy与双**结合使用

test.cpp(Windows)

输出

1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0
4.0 4.0 4.0 4.0 4.0 4.0
4.0 4.0 4.0 4.0 4.0 4.0
4.0 4.0 4.0 4.0 4.0 4.0
4.0 4.0 4.0 4.0 4.0 4.0
4.0 4.0 4.0 4.0 4.0 4.0

这是我学过的一个技巧,但是为什么不把指针作为长整数传递呢?因为类型可以是double。。etc不仅仅是整数。指针始终可以表示为长整数。然后返回到您想要的任何类型。我在创建“.so”文件test.cpp:4:1:error:expected构造函数、析构函数或类型转换在“(”tokenit)之前时出错,没有“u declspec(dllexport)”就可以正常工作谢谢,在FORTRAN中,多维数组可以直接用NoMPy右传递。FBACK…实际上我在Python C,C++ Fortran中寻找数组。是的,<代码>用双指针和多维数组。你不需要所有的铸造。你到底问什么?我已经多年没有接触FORTRAN了,所以我不能帮助。我注意到,如果你用C++编写了你的C++函数,而不是<代码> Value>代码>,你可以通过<代码>如果没有
ctypes.c\u void\u p
wrappers,您也可以传递
5,6
而不是
ctypes.c\u int(5),ctypes.c\u int(6)
。有没有办法通过使用numpy传递这个数组?我想使用numpy而不仅仅是使用ctypes。
#include <stdio.h>

extern "C" __declspec(dllexport) void cfun(const double ** indata, int rowcount, int colcount, double ** outdata) {
    for (int i = 0; i < rowcount; ++i) {
        for (int j = 0; j < colcount; ++j) {
            outdata[i][j] = indata[i][j] * 4;
        }
    }
}
import numpy
import ctypes

# Allocate array of double*
indata = (ctypes.POINTER(ctypes.c_double) * 5)()
for i in range(5):
    # Allocate arrays of double
    indata[i] = (ctypes.c_double * 6)()
    for j in range(6):
        indata[i][j] = 1.0

outdata = (ctypes.POINTER(ctypes.c_double) * 5)()
for i in range(5):
    outdata[i] = (ctypes.c_double * 6)()
    for j in range(6):
        outdata[i][j] = 1.0

lib = ctypes.cdll.LoadLibrary('test')
fun = lib.cfun

def dump(a,rows,cols):
    for i in range(rows):
        for j in range(cols):
            print a[i][j],
        print

dump(indata,5,6)
fun(ctypes.byref(indata),5,6,ctypes.byref(outdata))
dump(outdata,5,6)
1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0
4.0 4.0 4.0 4.0 4.0 4.0
4.0 4.0 4.0 4.0 4.0 4.0
4.0 4.0 4.0 4.0 4.0 4.0
4.0 4.0 4.0 4.0 4.0 4.0
4.0 4.0 4.0 4.0 4.0 4.0