Próbuję utworzyć wrapper Pythona dla starego programu C, który pobiera dane wejściowe jako wskaźniki. W tym momencie mogę uruchomić program, ale nie wiem, jak odzyskać wartości w wyznaczonych wskaźnikach.Dane dostępu na adres pamięci z kodami typów
Jest to uproszczona C scenariusz:
#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;}
A to moja uproszczony kod Python:
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()
Próbowałem komendy jak print tmp[1].wts[1]
i print tmp[2]
ale to tylko drukuje adres pamięci i nie wartość (lub nieprawdopodobnie małe wartości, które są nieprawidłowe, jak 2.15880221124e-314). Chciałbym móc zwrócić listę wartości wts.
Dziękujemy za oddanie na czas i wysiłek, aby wyjaśnić i naprawić swoje błędy ! Jedyne, co odkryłem, to że "c_void" nie istnieje, ale "None" działało w jego miejsce. Nie znam zbyt wiele C, więc staram się unikać zmiany tego kodu. – brebs
Szybka obserwacja: Jak powinienem zrobić, aby funkcja C przyjęła n jako wskaźnik '* n', a następnie działała na nim, wykonując' m = * n + 1'? Mój obecny kod nie działa. W szczególności, czy istnieje szybka naprawa w kodzie Pythona, aby to zrobić? – brebs
@brebs: Racja, przepraszam, 'void *' to 'c_void_p', ale' void' to po prostu 'None'. W każdym razie, dla kontynuacji, będę edytować odpowiedź. – abarnert