2012-02-10 19 views
0

私はoutdata3、outdata4の値をPythonコードから取得したいと考えています。 私はc関数を呼び出すためにctypesを使用しました。 C関数は以下のようなものです:Pythonからoutdata3、outdata4値を出力するにはどうしたらいいですか?

import numpy 
import ctypes 

indata1 = ctypes.c_int(8) 
indata2 = ctypes.c_double(3.4) 
#outdata3 = numpy.zeros((5), dtype=numpy.int) 
#outdata4 = numpy.zeros((5), dtype=numpy.double) 

lib = ctypes.cdll.LoadLibrary('./ctest.so') 
fun = lib.cfunction 

# Allocate array of int* 
outdata3 = (ctypes.POINTER(ctypes.c_int) * 8)() 
#for i in range(8): 
# # Allocate arrays of int 
# outdata3[i] = (ctypes.c_int * 8)() 

# Allocate array of double* 
outdata4 = (ctypes.POINTER(ctypes.c_double) * 8)() 
#for i in range(8): 
# # Allocate arrays of double 
# outdata4[i] = (ctypes.c_double * 8)() 

fun(ctypes.c_int(8), ctypes.c_double(3.4), ctypes.byref(outdata3), types.byref(outdata4)) 

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

#print('outdata3: ', outdata3.contents) 
#print('outdata4: ', outdata4.contents) 


def dump1(a,rows): 
    for i in range(rows): 
     print a[i] 

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

dump1(outdata3, 8) 
#dump1(outdata4, 8) 

私はコードを上から下に得ることができます:コードの下

#include <stdio.h> 

void cfunction(int indata1, double indata2, int * outdata3, double * outdata4) 
{ 
    int i; 
    for (i = 0; i < indata1; ++i) 
    { 
     outdata3[i] = indata1; 
     outdata4[i] = indata2; 
     //printf("indata3 [%d] = %d\n", i, outdata3[i]); 
     //printf("indata4 [%d] = %1.1f\n", i, outdata4[i]);  
    } 
} 

は、Pythonコードです。

[===>19:14:48]one+two:python test.py 
<__main__.LP_c_long object at 0x93566ec> 
<__main__.LP_c_long object at 0x93566ec> 
<__main__.LP_c_long object at 0x93566ec> 
<__main__.LP_c_long object at 0x93566ec> 
<__main__.LP_c_long object at 0x93566ec> 
<__main__.LP_c_long object at 0x93566ec> 
<__main__.LP_c_long object at 0x93566ec> 
<__main__.LP_c_long object at 0x93566ec> 

ただし、次のような値が必要です。

0.0 1.0 2.0 3.0 4.0 5.0 
1.0 2.0 3.0 4.0 5.0 6.0 
2.0 3.0 4.0 5.0 6.0 7.0 
3.0 4.0 5.0 6.0 7.0 8.0 
4.0 5.0 6.0 7.0 8.0 9.0 
+1

これは明確なようだ:http://docs.python.org/library/ctypes.html#arraysて、http://ドキュメント。 python.org/library/ctypes.html#passing-pointers-or-passing-parameters-by-reference。どの部分が混乱していますか? '.value'を使ってポインタが指している値を見つけるはずですか? –

答えて

0

あなたは間違った種類の関数を渡しました。あなたは、int配列と二重配列を渡して関数を渡すべきです。

outdata3 = (ctypes.c_int * 8)() 
outdata4 = (ctypes.c_double * 8)() 
fun(ctypes.c_int(8), ctypes.c_double(3.4), outdata3, outdata4) 

def dump1(a,rows): 
    for i in range(rows): 
     print a[i] 

dump1(outdata3, 8) 

またはあなたがcfunctionにnumpyの配列を渡すことができます。

lib.cfunction.argtypes = [c_int, c_double, 
    np.ctypeslib.ndpointer(dtype=np.int32, ndim=1), 
    np.ctypeslib.ndpointer(dtype=np.float64, ndim=1)] 

outdata3 = np.zeros(8, np.int32) 
outdata4 = np.zeros(8, np.float64) 

lib.cfunction(8, 3.4, outdata3, outdata4) 
print outdata3 
print outdata4 
+0

2番目の方法はエラーを表示します。*** glibc *** python:free():無効な次のサイズ(通常):0x087cdd98 *** )2次元配列を渡すと同じ方法ですか? – wonjun

+0

私は2次元配列を渡すことができるかどうか、私は、エラーを修正することができます – wonjun

関連する問題