Tôi đang cố tạo một trình bao bọc Python cho một chương trình C cũ có đầu vào làm con trỏ. Tại thời điểm này, tôi có thể chạy chương trình nhưng không thể tìm ra cách lấy lại các giá trị tại các con trỏ được chỉ định.Truy cập dữ liệu tại địa chỉ bộ nhớ với ctypes
Đây là một C kịch bản đơn giản:
#include <stdlib.h>
void cprogram(double *wts, double *res, int *kks, int n, double *ex) {
int m;
m=n+1;
res[0]=1.0;
kks[0]=1.0;}
Và đây là mã Python đơn giản của tôi:
from ctypes import *
import sys
libc = CDLL("src/program.so")
class CONTEXT(Structure):
_fields_ = [
("wts", POINTER(c_double)), //tried just to see if it would work
("res", c_double),
("kks", c_int),
("n", c_int),
("ex", c_double)]
def runner():
kk = (1,2,3)
n = 3
mm = n + 1
wts = (c_double * n)(1, 1, 1)
res = (c_double * mm)(0)
kks = (c_int * len(kk))(*kk)
n = c_int(n)
ex = c_double(0)
libc.cprogram.restype = POINTER(CONTEXT)
tmp = libc.cprogram(wts, res, kks, n, ex)
runner()
Tôi đã thử lệnh như print tmp[1].wts[1]
và print tmp[2]
nhưng điều này chỉ in địa chỉ bộ nhớ và không giá trị (hoặc các giá trị cực kỳ nhỏ không chính xác như 2.15880221124e-314). Tôi muốn có thể trả về một danh sách các giá trị của wts.
Cảm ơn bạn đã đặt trong thời gian và công sức để giải thích và sửa chữa các lỗi của tôi ! Điều duy nhất tôi tìm thấy là 'c_void' dường như không tồn tại nhưng' Không có' làm việc ở chỗ của nó. Tôi không biết nhiều C nên tôi đang cố gắng tránh thay đổi mã đó. – brebs
Quick followup: Làm thế nào tôi sẽ đi về làm cho nó để chức năng C đã n trong như một con trỏ '* n' và sau đó hoạt động trên nó bằng cách làm' m = * n + 1'? Mã hiện tại của tôi không thành công. Cụ thể, có sửa chữa nhanh trong mã Python để thực hiện việc này không? – brebs
@brebs: Phải, xin lỗi, 'void *' là 'c_void_p', nhưng' void' chỉ là 'None'. Dù sao, để theo dõi, tôi sẽ chỉnh sửa câu trả lời. – abarnert