के साथ मेमोरी एड्रेस पर डेटा एक्सेस करें मैं पुराने सी प्रोग्राम के लिए पाइथन रैपर बनाने की कोशिश कर रहा हूं जो पॉइंटर्स के रूप में इनपुट लेता है। इस बिंदु पर, मैं प्रोग्राम को चलाने के लिए प्राप्त कर सकता हूं लेकिन यह पता नहीं लगा सकता कि नामित पॉइंटर्स पर मूल्यों को वापस कैसे प्राप्त किया जाए।ctypes
यह एक सरल बनाया सी स्क्रिप्ट:
#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;}
और यह है मेरी सरलीकृत अजगर कोड:
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()
मैं print tmp[1].wts[1]
और print tmp[2]
तरह आदेशों की कोशिश की है लेकिन यह केवल स्मृति पते के प्रिंट और नहीं मूल्य (या अविश्वसनीय रूप से छोटे मान जो 2.15880221124e-314 की तरह गलत हैं)। मैं wts के मूल्यों की एक सूची वापस करने में सक्षम होना चाहता हूँ।
समय और प्रयास में डालने की व्याख्या और मेरी त्रुटियों को ठीक करने के लिए धन्यवाद ! मुझे मिली एकमात्र चीज यह थी कि 'c_void' मौजूद नहीं प्रतीत होता है लेकिन' कोई भी 'इसके स्थान पर काम नहीं करता है। मुझे बहुत सी नहीं पता है इसलिए मैं उस कोड को बदलने से बचने की कोशिश कर रहा हूं। – brebs
त्वरित अनुवर्ती: मैं इसे बनाने के बारे में कैसे जाउंगा ताकि सी फ़ंक्शन ने पॉइंटर '* n' के रूप में एन लिया और फिर 'm = * n + 1' करके इसे संचालित किया? मेरा वर्तमान कोड विफल रहता है। विशेष रूप से, क्या यह करने के लिए पाइथन कोड में एक त्वरित फिक्स है? – brebs
@brebs: ठीक है, क्षमा करें, 'शून्य *' 'c_void_p' है, लेकिन' शून्य 'सिर्फ' कोई नहीं 'है। वैसे भी, फॉलोअप के लिए, मैं जवाब संपादित कर दूंगा। – abarnert