2010-06-28 34 views
8

我嘗試傳遞一個結構的指針,該結構作爲從函數'bar'返回給函數'foo_write'的返回值。但是我得到錯誤消息'TypeError:must be a ctypes type'for line'foo = POINTER(temp_foo)'。在ctypes online help我發現'ctypes.POINTER'只適用於ctypes類型。你知道另一種方式嗎?你會推薦什麼?如何將指針返回給ctypes中的結構?

C:

typedef struct FOO_{ 
    int i; 
    float *b1; 
    float (*w1)[]; 
}FOO; 

foo *bar(int foo_parameter) {... 
void foo_write(FOO *foo) 

Python和ctypes的:

class foo(Structure): 
    _fields_=[("i",c_int), 
       ("b1",POINTER(c_int)), 
       ("w1",POINTER(c_float))] 

temp_foo=foo(0,None,None) 
foo = POINTER(temp_foo) 
foo=myclib.bar(foo_parameter) 
myclib.foo_write(foo) 
+0

你是說bar()返回'FOO *'而不是'foo *'? – Clifford 2010-06-28 11:45:29

+0

您是否遺漏了'從ctypes import *'? – Clifford 2010-06-28 11:46:06

回答

5

bar功能有一個不正確的定義,我想你的意思是struct FOO_ *bar(int);

Python代碼是錯誤的,因爲foo_parameter從未被聲明,所以我不是100%確定你想要做什麼。我假設你想將你的python聲明的參數foo(它是struct FOO_的一個實例)傳遞給C bar(int)並返回指向struct FOO_的指針。

你不需要指針做到這一點,下面的工作:

#!/usr/bin/env python 
from ctypes import * 

class foo(Structure): 
    _fields_=[("i",c_int), 
       ("b1",POINTER(c_int)), 
       ("w1",POINTER(c_float))] 

myclib = cdll.LoadLibrary("./libexample.so") 
temp_foo = foo(1,None,None) 
foovar = myclib.bar(temp_foo.i) 
myclib.foo_write(foovar) 

由於ctypes的將包裝的bar()返回類型的指針到結構爲您服務。

+0

嗨rq,我選擇了你,因爲你指出,我根本不需要ctypes.POINTER。 – Framester 2010-06-28 17:28:51

+3

foo是一個類名還是變量? c_types如何知道bar的返回類型是'foo'? – fadedbee 2013-01-03 21:11:23

+0

foo既是一個類又是一個變量名? – Overdrivr 2016-01-19 17:15:50

相關問題