2012-01-09 2 views
6

다음과 같이 1 차원 배열을 파이썬에 전달할 수 있습니다. 그리고 cptypes, numpy를 사용하여 파이썬에 C++ 이중 포인터 배열을 전달할 수 있는지 궁금합니다.파이썬에 C++ 더블 포인터를 넘김

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!"); 
} 

test.py :

import numpy 
import ctypes 

indata = numpy.ones((5,6), dtype=numpy.double) 
outdata = numpy.zeros((5,6), dtype=numpy.double) 
lib = ctypes.cdll.LoadLibrary('./ctest.so') 
fun = lib.cfun 
# Here comes the fool part. 
#fun(ctypes.c_void_p(indata.ctypes.data), ctypes.c_void_p(outdata.ctypes.data)) 

fun(ctypes.c_void_p(indata.ctypes.data), ctypes.c_int(5), ctypes.c_int(6), 
    ctypes.c_void_p(outdata.ctypes.data)) 


print 'indata: %s' % indata 
print 'outdata: %s' % outdata 
+0

이 내가 해왔 던 해킹이지만, 단지 포인터를 통과하지 이유 긴 정수로? –

+0

유형이 정수가 아니고 두 배가 될 수 있기 때문입니다. – wonjun

+0

포인터는 항상 긴 정수로 나타낼 수 있습니다. 원하는 유형으로 다시 캐스트하십시오. –

답변

6

가 여기에 방법입니다. 나는 두 배로 numpy를 사용하는 좋은 방법을 보지 못했다 **.

Test.cpp에 (윈도우)

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

test.py

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 
+0

".so"파일을 생성하는 동안 오류가 발생했습니다. test.cpp : 4 : 1 : 오류 : 예상되는 생성자, 소멸자 또는 형식 변환 전에 '('토큰 – wonjun

+0

이 코드가 작동하지 않기 때문에 리눅스에 있습니다. – wonjun

+0

작동합니다 괜찮아요없이 "__declspec (dllexport)". 감사합니다 및 포트란, 다차원 배열 직접 numpy 오른쪽으로 전달할 수 있습니다 .. fwrap .. 사실 파이썬 배열을 전달할 찾고있다 <-> c, C++ <-> 포트란. – wonjun