दिलचस्प पोस्ट
नए टैब पर स्विच किए बिना जावा में नया टैब कैसे खोल सकता है? क्लिक समारोह के बाद jquery लाइट आईडी / मूल्य प्राप्त करें संकलन समय पर जांचें अगर खाका तर्क शून्य है कैसे मैं एक जीआईटी भंडार में एक खाली निर्देशिका जोड़ सकते हैं? एंड्रॉइड: एक छवि को हटाने आईफ़ोन: मैकिकिट पर दो बिंदुओं के बीच की रेखा कैसे खींचना है? __del__ विधि क्या है, इसे कैसे कॉल करें? छवि स्केलिंग फ़ायरफ़ॉक्स / इंटरनेट एक्सप्लोरर में खराब गुणवत्ता का कारण बनती है, लेकिन क्रोम नहीं जावास्क्रिप्ट में नेस्टेड लूप को कैसे तोड़ सकता है? अलार्ममैनेजर गलत समय पर अलार्म चलाता है क्या सेट-टाइमआउट बिना किसी विलंब के साथ ही फ़ंक्शन तुरंत क्रियान्वित करता है? मुझे एकल 'इंतजार का इंतजार क्यों करना चाहिए। जब ​​सभी' बहु से अधिक इंतजार कर रहे हैं? अफीम स्विफ्ट सपोर्ट / स्विफ्ट का अमान्य कार्यान्वयन संस्करण SQL सर्वर डेटाबेस लिआ में वर्तमान क्षेत्र के लिए सभी स्थानीय चर तक पहुंचें

पायथन और सीटीप्स: डेटा को वापस पाने के लिए एक सूचक के रूप में किसी फ़ंक्शन को एक स्ट्रेट पास करना

मैंने अन्य उत्तरों के माध्यम से देखा है लेकिन यह काम करने के लिए प्रतीत नहीं हो सकता मैं SMBus उपकरणों के साथ संचार करने के लिए किसी DLL के भीतर किसी फ़ंक्शन को कॉल करने का प्रयास कर रहा हूं। यह फ़ंक्शन एक स्ट्रिंग के लिए एक सूचक लेता है, जिसमें उसके एक फ़ील्ड के रूप में एक सरणी है। इसलिए…

सी में:

typedef struct _SMB_REQUEST { unsigned char Address; unsigned char Command; unsigned char BlockLength; unsigned char Data[SMB_MAX_DATA_SIZE]; } SMB_REQUEST; 

मुझे लगता है कि मुझे पता, कमांड और ब्लॉकलेैन्थ के लिए मूल्य सेट करना है, जबकि डीएलएल डेटा सरणी भरता है। इस फ़ंक्शंस की आवश्यकता होती है, यह एक सूचक के रूप में लेता है

 SMBUS_API int SmBusReadByte( SMBUS_HANDLE handle, SMB_REQUEST *request ); 

इसलिए मैंने पायथन में स्ट्रेट की स्थापना की है:

 class SMB_REQUEST(ctypes.Structure): _fields_ = [("Address", c_char), ("Command", c_char), ("BlockLength", c_char), ("Data", type(create_string_buffer(SMB_MAX_DATA_SIZE))] 

* नोट: मैंने भी डेटा प्रकार के लिए ctypes.c_char * SMB_MAX_DATA_SIZE की कोशिश की है *

फ़ंक्शन को इस प्रकार के एक स्ट्रेट के लिए एक सूचक को पास करने के लिए मैंने इसे पहले आरंभ करने की कोशिश की है:

 data = create_string_buffer(SMB_MAX_DATA_SIZE) smb_request = SMB_REQUEST('\x53', \x00', 1, data) 

यह निम्न के साथ प्रतिक्रिया करता है:

 TypeError: expected string or Unicode object, c_char_Array_32 found 

अगर मैं डाटा सरणी छोड़ने की कोशिश करता हूं, तो ऐसा ही होता है:

 smb_request = SMB_REQUEST('\x53', \x00', 1) 

कोई ग़लती नहीं। हालांकि, तब जब मैं इसे फ़ंक्शन पर पास करने का प्रयास करता हूं:

 int_response = smbus_read_byte(smbus_handle, smb_request)) 

मुझे मिला:

 ArgumentError: argument 2: <type 'exceptions.TypeError'>: expected LP_SMB_REQUES T instance instead of SMB_REQUEST 

मैंने इसे एक सूचक के रूप में पास करने की कोशिश की है:

 int_response = smbus_read_byte(smbus_handle, ctypes.POINTER(smb_request)) 

और मुझे मिल रहा है:

 ----> 1 2 3 4 5 TypeError: must be a ctypes type 

यहां बताया गया है कि मैंने किस प्रकार कला प्रकार स्थापित किए हैं:

 smbus_read_byte.argtypes = (ctypes.c_void_p, ctypes.POINTER(SMB_REQUEST)) 

मैंने कास्टिंग की कोशिश की है लेकिन अभी भी नहीं जाना है। क्या कोई मेरे लिए इस पर कुछ प्रकाश डाल सकता है?

अद्यतन करें:

अगर मैं पहली बार इस तरह की संरचना को आरम्भ करता हूं:

 smb_request = SMB_REQUEST('\xA6', '\x00', chr(1), 'a test string') 

और फिर संदर्भ से बास:

 int_response = smbus_receive_byte(smbus_handle, ctypes.byref(smb_request)) 

मुझे कोई त्रुटि नहीं मिली है हालांकि, फ़ंक्शन 1 देता है जब इसे सफलता के लिए '0' और असफल होने के लिए शून्य के लिए वापस करना चाहिए। Smb_request.Data के मूल्य की जांच करने से 'एक परीक्षण स्ट्रिंग' वापस आ जाती है, जिससे कोई बदलाव नहीं होता है। यहां पर जो भी हो रहा है, उसके बारे में कोई भी सुझाव काफी सराहना की जाएगी।

धन्यवाद

अद्यतन करें:

चूंकि मुझे कुछ पूछताछ हुई हैं कि मेरा संभाल सही है या नहीं, यहां बताया गया है कि मैं इसका उपयोग कैसे कर रहा हूं। डीएलएल के लिए हैडर फाइल निम्न घोषित करता है:

 typedef void *SMBUS_HANDLE; // // This function call initializes the SMBus, opens the driver and // allocates the resources associated with the SMBus. // All SMBus API calls are valid // after making this call except to re-open the SMBus. // SMBUS_API SMBUS_HANDLE OpenSmbus(void); 

तो यहाँ है कि मैं अजगर में यह कैसे कर रहा हूं:

 smbus_handle = c_void_p() # NOTE: I have also tried it without this line but same result open_smbus = CDLL('smbus.dll').OpenSmbus smbus_handle = open_smbus() print 'SMBUS_API SMBUS_HANDLE OpenSmbus(void): ' + str(smbus_handle) 

मैं smbus_read_byte () को कॉल करने से पहले इसे कॉल करता हूं मैंने open_smbus.restype = c_void_p() सेट करने का प्रयास किया है लेकिन मुझे एक त्रुटि मिलती है: TypeError: restype must be a type, a callable, or None

वेब के समाधान से एकत्रित समाधान "पायथन और सीटीप्स: डेटा को वापस पाने के लिए एक सूचक के रूप में किसी फ़ंक्शन को एक स्ट्रेट पास करना"

यहाँ एक काम उदाहरण है ऐसा लगता है कि आप फ़ंक्शन पर गलत प्रकार से गुजर रहे हैं।

टेस्ट डीएलएल कोड ("सीएल / डब्ल्यू 4 / एलडी एक्ससी" विंडोज पर)

 #include <stdio.h> #define SMBUS_API __declspec(dllexport) #define SMB_MAX_DATA_SIZE 5 typedef void* SMBUS_HANDLE; typedef struct _SMB_REQUEST { unsigned char Address; unsigned char Command; unsigned char BlockLength; unsigned char Data[SMB_MAX_DATA_SIZE]; } SMB_REQUEST; SMBUS_API int SmBusReadByte(SMBUS_HANDLE handle,SMB_REQUEST *request) { unsigned char i; for(i = 0; i < request->BlockLength; i++) request->Data[i] = i; return request->BlockLength; } SMBUS_API SMBUS_HANDLE OpenSmbus(void) { return (void*)0x12345678; } 

पायथन कोड

 from ctypes import * SMB_MAX_DATA_SIZE = 5 ARRAY5 = c_ubyte * SMB_MAX_DATA_SIZE class SMB_REQUEST(Structure): _fields_ = [ ("Address", c_ubyte), ("Command", c_ubyte), ("BlockLength", c_ubyte), ("Data", ARRAY5)] smbus_read_byte = CDLL('x').SmBusReadByte smbus_read_byte.argtypes = [c_void_p,POINTER(SMB_REQUEST)] smbus_read_byte.restype = c_int open_smbus = CDLL('x').OpenSmbus open_smbus.argtypes = [] open_smbus.restype = c_void_p handle = open_smbus() print 'handle = %08Xh' % handle smb_request = SMB_REQUEST(1,2,5) print 'returned =',smbus_read_byte(handle,byref(smb_request)) print 'Address =',smb_request.Address print 'Command =',smb_request.Command print 'BlockLength =',smb_request.BlockLength for i,b in enumerate(smb_request.Data): print 'Data[%d] = %02Xh' % (i,b) 

उत्पादन

 handle = 12345678h returned = 5 Address = 1 Command = 2 BlockLength = 5 Data[0] = 00h Data[1] = 01h Data[2] = 02h Data[3] = 03h Data[4] = 04h 

तुम लगभग वहां थे। आपको Data की परिभाषा के प्रकार के रूप में c_char * SMB_MAX_DATA_SIZE उपयोग करना चाहिए यह मैक ओएस एक्स पर मेरे लिए काम करता है:

साझा लाइब्रेरी:

 $ cat test.c #include <stdio.h> #define SMB_MAX_DATA_SIZE 16 typedef struct _SMB_REQUEST { unsigned char Address; unsigned char Command; unsigned char BlockLength; unsigned char Data[SMB_MAX_DATA_SIZE]; } SMB_REQUEST; int SmBusReadByte(void *handle, SMB_REQUEST *request) { printf("SmBusReadByte: handle=%p request=[%d %d %d %s]\n", handle, request->Address, request->Command, request->BlockLength, request->Data); return 13; } $ gcc test.c -fPIC -shared -o libtest.dylib 

पायथन ड्राइवर:

 $ cat test.py import ctypes SMB_MAX_DATA_SIZE = 16 class SMB_REQUEST(ctypes.Structure): _fields_ = [("Address", ctypes.c_ubyte), ("Command", ctypes.c_ubyte), ("BlockLength", ctypes.c_ubyte), ("Data", ctypes.c_char * SMB_MAX_DATA_SIZE)] libtest = ctypes.cdll.LoadLibrary('libtest.dylib') req = SMB_REQUEST(1, 2, 3, 'test') result = libtest.SmBusReadByte(ctypes.c_voidp(0x12345678), ctypes.byref(req)) print 'result: %d' % result $ python test.py SmBusReadByte: handle=0x12345678 request=[1 2 3 test] result: 13 

अद्यतन करें

आपको समस्याएं हो रही हैं क्योंकि आपको open_smbus का नतीजा टाइप करने के लिए void* से सेट करना होगा। डिफ़ॉल्ट रूप से, सीटीआईपी मानती है कि कार्य वापस int s आपको यह कहना है:

 open_smbus.restype = ctypes.c_void_p 

आपको एक त्रुटि c_void_p() थी क्योंकि आप c_void_p() का उपयोग कर रहे थे (अतिरिक्त कोष्ठकों को नोट करें)। c_void_p और c_void_p() बीच एक महत्वपूर्ण अंतर है पूर्व एक प्रकार का है , और बाद में एक प्रकार का एक उदाहरण है। c_void_p सी प्रकार void* प्रतिनिधित्व करता है, जबकि c_void_p() वास्तविक पॉइंटर इंस्टेंस (0 का डिफ़ॉल्ट मान के साथ c_void_p() प्रतिनिधित्व करता है।

बदलने की कोशिश करो

 ("Data", type(create_string_buffer(SMB_MAX_DATA_SIZE)) 

सेवा मेरे

 ("Data", (c_char * SMB_MAX_DATA_SIZE)]