2010-09-01 44 views
5

Tôi sử dụng ctypes để truy cập tệp đọc hàm C trong python. Vì dữ liệu đọc lớn và không xác định kích thước, tôi sử dụng **float trong C.Truy cập nội dung của một mảng biến với ctypes

int read_file(const char *file,int *n_,int *m_,float **data_) {...}

Các chức năng mallocs một mảng 2d, gọi data, kích thước phù hợp, đây nm, và bản sao các giá trị để những người được tham chiếu. Xem sau đoạn:

*data_ = data; 
*n_ = n; 
*m_ = m; 

tôi truy cập vào chức năng này với mã python sau:

p_data=POINTER(c_float) 
n=c_int(0) 
m=c_int(0) 
filename='datasets/usps' 
read_file(filename,byref(n),byref(m),byref(p_data)) 

Sau đó tôi cố gắng acces p_data sử dụng contents, nhưng tôi chỉ nhận được một giá trị float duy nhất.

p_data.contents 
c_float(-1.0) 

Câu hỏi của tôi là: Làm cách nào để truy cập data bằng python?

Bạn đề xuất điều gì? Xin đừng ngần ngại chỉ ra nếu tôi để lại một cái gì đó không rõ ràng!

+0

+1 cho ctypes, thư viện trăn tốt nhất – amwinter

Trả lời

3

có thể đơn giản hơn để làm toàn bộ điều trong python với thư viện struct. nhưng nếu bạn đang bán trên ctypes (và tôi không đổ lỗi cho bạn, nó khá mát mẻ):

#include <malloc.h> 
void floatarr(int* n, float** f) 
{ 
    int i; 
    float* f2 = malloc(sizeof(float)*10); 
    n[0] = 10; 
    for (i=0;i<10;i++) 
    { f2[i] = (i+1)/2.0; } 
    f[0] = f2; 
} 

và sau đó trong python:

from ctypes import * 

fd = cdll.LoadLibrary('float.dll') 
fd.floatarr.argtypes = [POINTER(c_int),POINTER(POINTER(c_float))] 

fpp = POINTER(c_float)() 
ip = c_int(0) 
fd.floatarr(pointer(ip),pointer(fpp)) 
print ip 
print fpp[0] 
print fpp[1] 

lừa là thủ đô POINTER làm cho một loại và chữ thường pointer tạo con trỏ đến bộ nhớ hiện có. bạn có thể sử dụng byref thay vì pointer, họ tuyên bố nó nhanh hơn. Tôi thích pointer tốt hơn bởi vì nó rõ ràng hơn những gì đang xảy ra.

+1

Bạn cũng có thể sử dụng ctypes để phân tích cú pháp các tệp nhị phân. Tôi tìm thấy nó một chút dễ dàng hơn để làm việc với sau đó các mô-đun struct. – Mark

+0

Hi Amwinter, câu trả lời của bạn đã khiến tôi hiểu thêm, nhưng tôi còn lại hai câu hỏi. 1. Tôi đọc '15.16.1.7. Chỉ định các loại đối số bắt buộc' từ http://docs.python.org/library/ctypes.html và tôi không hiểu tại sao 'argtypes' là cần thiết. Tôi đã thử ví dụ của mình mà không sử dụng nó và nó cũng hoạt động tốt. 2. Tôi đã đề cập đến nó trong thẻ '' nhưng quên làm như vậy trong các câu hỏi thực tế. Điều này sẽ hoạt động như thế nào khi dữ liệu có nhiều hơn một thứ nguyên? Tôi đã thử 'print p_data [0] [0]' nhưng tôi nhận được một đối tượng 'TypeError: 'float' là unsubscriptable'. – Framester

+0

Hi @ amwinter, tôi có thể thấy bạn đang rất thử nghiệm trong Python bạn có thể giúp tôi với [this] (http://stackoverflow.com/questions/33377764/error-using-callback-in-python), xin vui lòng? –

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