2010-06-28 36 views
8

Tôi cố gắng chuyển con trỏ của một cấu trúc được cung cấp cho tôi dưới dạng giá trị trả về từ hàm 'bar' đến hàm 'foo_write'. Nhưng tôi nhận được thông báo lỗi 'TypeError: phải là một loại ctypes' cho dòng 'foo = POINTER (temp_foo)'. Trong số ctypes online help tôi thấy rằng 'ctypes.POINTER' chỉ hoạt động với các loại ctypes. Bạn có biết cách khác không? Bạn muốn giới thiệu gì?Làm thế nào để trả về một con trỏ đến một cấu trúc trong ctypes?

C:

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

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

Python với 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

Ý của bạn là bar() trả về 'FOO *' thay vì 'foo *'? – Clifford

+0

Bạn đã bỏ qua 'từ nhập khẩu ctypes *'? – Clifford

Trả lời

5

chức năng bar của bạn có một định nghĩa chính xác, tôi đoán bạn có nghĩa là nó là struct FOO_ *bar(int);?

Mã Python sai theo nghĩa là foo_parameter không bao giờ được khai báo, vì vậy tôi không chắc chắn 100% những gì bạn muốn làm. Tôi giả sử bạn muốn chuyển một tham số của python-declare foo, là một cá thể của một struct FOO_, vào C bar(int) và lấy lại một con trỏ đến struct FOO_.

Bạn không cần POINTER để làm điều đó, sau đây sẽ làm việc:

#!/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) 

Kể từ ctypes sẽ quấn kiểu trả về của bar() trong một cấu trúc con trỏ-to-cho bạn.

+0

Xin chào, tôi đã chọn bạn như bạn đã chỉ ra, rằng tôi không cần ctypes.POINTER cả. – Framester

+3

Có phải là một tên lớp hoặc một biến ở đây không? Làm thế nào để c_types biết rằng kiểu trả về của thanh là 'foo'? – fadedbee

+0

foo là cả một lớp và một tên biến? – Overdrivr

Các vấn đề liên quan